数字逻辑期末复习三
数字逻辑期末复习(3)
加法器
半加器(Half Adder)
- 实现一位加法的器件
- 由真值表可以看出 C(cout),也就是进位,相当于
a&b,**S(sum)**相当于a^b
全加器(Full Adder)
- 相较于全加器,多了一个输入C(cout)
- 可以拆分成两个半加器
利用半加器做全加器
半加器与全加器的区别:半加器只有两个输入,全加器多了一个输入(cin),这个cin可以理解为上一个半加器的进位(cout)
1 | //代码实现 最简便的写法 相当于三个数加法 |
波纹进位加法器
- 结构:由N个一位加法器串联而成
- 特点:结构直观简单,但是高位运算必须等到低位进位来到后才能进行,导致运行速度慢
选择进位加法器
- 波纹加法器缺点:加法器计算进位延迟相当慢,第二阶段加法器在第一阶段加法器完成前无法开始计算进位输出
1 | module top_module( |
减法器
- 加法器减法器
1 | module top_module( |
避免锁存器
- 注意:在设计组合逻辑电路时,如果使用了
if语句,必须确保所有情况都有明确的赋值(比如必须写上else),否则电路会产生“记忆”功能,变成锁存器,这通常是设计错误。 - 纯组合逻辑设计中,不希望有记忆功能
例题
假设你正在为一个游戏制作一个电路,用于处理来自 PS/2 键盘的扫描码 (Scancodes)。
输入:一个 16 位的扫描码信号 (
scancode).输出:4 个方向信号(
up,down,left,right),代表是否按下了对应的箭头键。16'he06b-> 左箭头 (Left Arrow)16'he072-> 下箭头 (Down Arrow)16'he074-> 右箭头 (Right Arrow)16'he075-> 上箭头 (Up Arrow)- 其他任何值 -> 无按键 (None)
如何避免锁存器:所右输出变量在所有可能的执行路径下都被赋值
错误代码:
1
2
3
4case (scancode)
16'he075: up = 1; // 这里的 bug 是:down, left, right 没有赋值
// ...
endcase电路综合器会认为:“当按键是 UP 时,你只告诉
up变 1,没告诉down应该是多少,所以必须保持down原来的值不变”。这就产生了一个锁存器。为了修复问题,在每一种case给四个变量赋值,所以我们要进行一个预设默认值(通常是0)
1 | always @(*) begin |
编码器 / 译码器
概念
- 编码器把输入信号转换为特定的编码,用输出的编码来表示相应的输入信号
- 通常编码器有 N 个输入端,有 n 个输出端,应该满足 N <= 2的n次方
- 译码器:将先前编码过的数据解码,是编码器的逆过程
描述译码器/编码器的语句
- if……else及其嵌套结构
- case/casex/casez结构
译码器
基本2-4译码器
1 | module dec2to4 (W, Y); |
- 拓展:带使能端的2-4译码器,组合逻辑,行为级描述,加一个if……else判断即可
- 4-16译码器:可以用两个3-8译码器,或者四个2-4译码器级联而成
编码器
优先编码器
- 优先编码器是一种组合逻辑电路,它的功能是:在输入的多个二进制位中,找到第一个为 ‘1’ 的位,并输出它的位置(下标)。
1 | // synthesis verilog_input_version verilog_2001 |
- **casez语句:**会更方便一点
- casez语句中:不在意z所代表的是什么,下面代码是一个8为优先编码器的例子,运用的casez语句
1 | // synthesis verilog_input_version verilog_2001 |
循环
for循环
- **例题:**给定一个100位输入矢量[99:0],反转其位序。
- 解释
integer i;: 在always块之外声明循环变量i。在 Verilog 中,for循环的索引变量通常声明为 integer 类型。
1 | module top_module( |
100位完整加法器
- 注意要点:generate
generate是 Verilog 中用来批量生成电路代码的一种特殊语法结构。
1 | module top_module( |
- generate用法:
genvar:定义循环变量generate……endgenerate:包裹生成代码的块for:循环体,描述如何重复生成,循环体必须取名字
1 | genvar i; //定义生成变量 |
组合逻辑电路
- 功能上,组合逻辑电路在任意时刻的输出仅和电路当前的输入有关
- 内部结构来看,组合电路都是淡出有逻辑单元组成,不含存储单元,电路无记忆功能
多路选择器(数据选择器)
- 多路选择器是一个多输入单输出的组合逻辑电路
- 根据选择码,从多个数据流选取一个输出
- 典型Verilog描述语句有以下3种
- assgin语句+条件操作符(三目操作符)
- if……else及其嵌套语句
- case多分支语句
- 如图:n个输入,但是只选择一个进行输出
- sel位数m满足上图红色式子
多路选择器的编码风格
- 二选一:if else
- 四选一以上:case
- 多选一超过8输入:建议拆分成多个小规模选通器
一些代码
1 | //256选1,case也不好用了,这时候运用Verilog 的数组索引语法 |
- 注意:wire变量一定是线网,reg变量未必是寄存器
四选一
1 | module mux4to1( |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 秃头的君寻酱!








