一、组合逻辑电路#
组合逻辑电路是一系列的实时输入输出,输出随着输入的改变而随时改变,没有数据的记忆功能。
组合逻辑电路有两种方法进行描述,行为建模(行为级描述),数据流建模(结构级描述)。接下来主要以介绍数据流建模为主
1.译码器#
输入为n位输入值,使其中2^n位的对应位为1。
module decode( input wire [2:0] in, input wire [7:0] out) assign out = 4'b00000001 << in;endmodule即,将第一位的1,向左移很多位,就得到了需要的数据。
用处:常用于寻址。
2. 编码器#
与译码器功能相反。
one-hot,独热码,只有一位为1。
module one-hot-encode( input wire [7:0] in, input wire [2:0] out) assign out = (in[0]) ? 3'b0 : (in[1]) ? 3'b1 : (in[2]) ? 3'b2 : (in[3]) ? 3'b3 : (in[4]) ? 3'b4 : (in[5]) ? 3'b5 : (in[6]) ? 3'b6 : 3'b7;endmodule优先编码器,找到为1的最高位
module priority-encode( input wire [7:0] in, input wire [2:0] out) assign out = (in[7]) ? 3'b7 : (in[6]) ? 3'b6 : (in[5]) ? 3'b5 : (in[4]) ? 3'b4 : (in[3]) ? 3'b3 : (in[2]) ? 3'b2 : (in[1]) ? 3'b1 : 3'b0;endmodule3.多路选择器#
有多个输入和几条控制线,由控制线控制选择哪一个输出。多路选择器其中包含了一个译码器
module mux( input wire [7:0] data_in, input wire [2:0] ctr_in, input wire out) assign out = data_in[ctr_in];endmodule4.比较器#
module compare( input wire [31:0] a, input wire [31:0] b, out) assign out = (a == b) ? 1'b1 : 1'b0;endmodule上述比较器就是用来比较是否相等,可以写一个比较器来对比大小关系。
module compare( input wire [31:0] a, input wire [31:0] b, out) assign out = (a > b) ? 1'b1 : 1'b0;endmodule在实际的电路中,a > b的实现是比较复杂的。
5.加法器#
module add( input wire [7:0] a, input wire [7:0] b, output wire [7:0] c) assign c = a + b;endmodule加法器分为半加器和全加器。半加器只计算一位的结果和进位情况,全加器可以输入另一个全加器或者半加器的进位情况,并且输出结果和进位情况。
二、时序逻辑#
1.交叉配对反相器(Cross-Coupled Inverters)#

稳定存储一个Bit的数据,同时输出存储的Q和Q非。
如果一开始Q和Q非同时处于0或者同时处于1,那么就会触发震荡状态,新的状态不断改变,无法表示稳定的信息。
能够存储但是不能够更新新的数据。
2.SR锁存器#

给到R和S的值。
- S = 1,R = 0,Q是1
- S = 0,R = 1,Q是0
- S = R = 0,Q保持之前的值
- S = R = 1,不允许出现这种情况,进入亚稳态。
3.D锁存器#

额外添加两个与门,将S和R的输入限制为三种允许的状态。
- WE = 0,保持
- WE = 1,D = 1,输出为1
- WE = 1,D = 0,输入为0
D锁存器只要在D为高电平期间,输出就会发生改变,无法实现在固定周期内进行锁存的效果。
4.D触发器#

clk的上升沿来临时,将状态更新成D的状态。
clk为低电平时,整体就是保持不变的,和SR锁存器一样。
clk为高电平时,禁止D的输入传播到SR锁存器。