1.组合逻辑
组合逻辑:
组合逻辑是VerilogHDL设计中一个重要的组成部分.从电路本质上讲, 组合逻辑的电路特点就是输出信号只是当时时刻输入信号的函数,与其他时刻的输入状态无关,无存储电路,也没有反馈电路.
2.简单组合逻辑
2.1 简单逻辑组合–多路选择器
多路选择器:
多路选择器是数据选择器的别称,在多路数据传送过程中,能够根据需要将其中任意一路选出来的电路,叫做数据选择器,也称多路选择器或多路开关.
设计并实现一个"二选一"多路选择器,使用按键1,2,表示key_in,按键3表示slec选择信号,信号灯表示输出信号:
module mux2_1
(
input wire [0:0] in_1, //输入信号 类型 位宽(位不用书写) 输入信号名,
input wire [0:0] in_2,
input wire [0:0] sel,
output reg [0:0] out
);
//方法一:使用组合逻辑对输出信号进行赋值
always@(*) //*,通配符,表示任何一种敏感信号发生变化都要执行该语句
/*if ()
begin
end
else if()
begin
end
else
begin
end
*/
if (sel == 1'b1)
out = in_1;
else
out = in_2;
// 方法二:使用case语句
/*always@(*)
case(sle)
1'b1 :out = in_1;
1'b0 :out = in_2;
default: out = in_1; //注意:如果不能列举出所有情况一定要加上default.因为此处sel的情况已经列举完了,所以default可以省略
endcase
//方法三:使用assign语句
assign out = (sel == 1'b1) ?in_1:in_2;
*/
endmodule
2.2 简单逻辑组合–译码器
译码是编码的逆过程,在编码时,每一种二进制代码,都赋予了特定的含义,即都表示了一个确定的信号或者对象。把代码状态特定含义翻译出来的过程叫做译码,实现译码操作的电路称为译码器。或者说,译码器是可以将输入二进制代码的状态翻译成输出信号,以表示其原来含义的电路。
译码器(decoder)是一类多输入多输出组合逻辑电路器件,其可以分为:变量译码和显示译码两类。常见的有: n − 2 n n-2^n n−2n译码器
使用always,initial语句赋值就是reg型,使用assign赋值就是wire型
经典3-8译码器:
//输入输出列表
module decoder
(
input wire [0:0] in_1,
input wire [0:0] in_2,
input wire [0:0] in_3,
output reg [7:0] out
);
//赋值
//方法一:使用条件分支语句
/* always@(*)
if({in_1,in_2,in_3} == 3'b000)
out = 8'b0000_0001;
else if ({in_1,in_2,in_3} == 3'b001)
out = 8'b0000_0010;
else if ({in_1,in_2,in_3} == 3'b010)
out = 8'b0000_0100;
else if ({in_1,in_2,in_3} == 3'b011)
out = 8'b0000_1000;
else if ({in_1,in_2,in_3} == 3'b100)
out = 8'b0001_0000;
else if ({in_1,in_2,in_3} == 3'b101)
out = 8'b0010_0000;
else if ({in_1,in_2,in_3} == 3'b110)
out = 8'b0100_0000;
else if ({in_1,in_2,in_3} == 3'b111)
out = 8'b1000_0000;
else
out = 8'b0000_0001;//避免lantch */
//方法二:使用case编写
always@(*)
case({in_1,in_2,in_3})
3'b000:
out = 8'b0000_0001;
3'b001:
out = 8'b0000_0010;
3'b010:
out = 8'b0000_0100;
3'b011:
out = 8'b0000_1000;
3'b100:
out = 8'b0001_0000;
3'b101:
out = 8'b0010_0000;
3'b110:
out = 8'b0100_0000;
3'b111:
out = 8'b1000_0000;
default:
out = 8'b0000_0001;
endcase
endmodule
2.3简单逻辑组合–半加器
加法器是数字电路中经常用到的一种基本器件, 主要用于两个数或者多个数的加和,加法器又分为半加器(half adder)和全加器(full adder).
半加器电路是指对两个输入数据位相加, 输出一个结果位和进位,没有进位输入的加法器电路.是实现两个一位二进制数的加法运算电路.
全加器是在半加器的基础上的升级版, 除了加数和被加数加和外,还要加上上一级传进来的进位信号.
module half_add(
//端口列表
input wire [0:0] in_1,
input wire [0:0] in_2,
output wire [0:0] sum,
output wire [0:0] count
);
//赋值
assign {count,sum} = in_1 + in_2;
endmodule
3.层次化设计思想
数字电路中根据模块层次不同有两种基本的结构设计方法:
自底向上(Bottom-Up)和自顶向下(Top-Down)的设计方法.
3.1自底向上(Bottom-Up)
自底向上的设计是一种传统的设计方法,对设计进行逐次划分的过程是从存在的基本单元出发的,由基本单元构建高层单元,依次向上,直至构建系统.
3.2 自上而下(Top-Down)
从系统级开始,把系统分为基本单元,然后再把每个单元划分为下一层次的基本单元,一直这样细分做下去,直至直接可以使用EDA元件库中的元件来实现为止.
3.3 混合使用
3.4避免Latch的产生
Latch就是锁存器,是一种在异步电路中,对输入信号 电平敏感的单元,用来存储信息.
锁存器在 数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓冲器,一旦锁存信号有效,则数据被锁存,输入信号就不起作用.因此,锁存器也被称为透明锁存器,指的是不锁存时输入对于输入时透明的.
异步电路与同步电路:
异步电路:异步电路主要是组合逻辑电路,用于产生FIFO或RAM的读写控制信号脉冲,但它同时也用在时序电路中,此时它没有统一的时钟,状态变化的时刻是不稳定的, 通常输入信号只有在电路处于稳定状态时才发生变化.
同步电路:同步电路是有时序电路(寄存器和各种触发器)和组合逻辑电路构成的电路, 其所有操作都是在严格的时钟控制下完成的. 这些时序电路共享同一个时钟 CLK,而所有的状态变化都是在时钟的上升沿(或下降沿)完成的.
Latch的缺陷:
- 对毛刺敏感
- 占用更多的逻辑资源
- 不能异步复位
- 额外的延时
- 复杂的静态时序分析
几种产生Latch的情况:
- 组合逻辑中if-else条件分支语句缺少else语句
- 组合逻辑case条件分支语句条件未列举完,同时缺失了default语句
- 组合逻辑中输出变量赋值给自己