时序逻辑(一)
一、触发器与锁存器基础
1.什么是触发器?
能够记忆1位二进制信号的基本单元电路
特点:
- 有两个能自行保持的状态,用来表示0和1;
- 根据输入信号可以置成0或1
分类:
- 按触发方式:电平、脉冲、边沿
- 按逻辑功能:SR、JK、T、D
2.SR锁存器
RD SD = 0 是正常锁存器的约束条件
总的来说,在正常情况下,就是RD为1时,不管Q是个啥,都会把它置为0并保存下来。SD为1时,不管Q是个啥,都会把它置为0并保存下来。
P.S:与非门的两个输入端是低有效
3.SR触发器
特性方程:
Q∗=S+R′Q
SR=0
4.JK触发器
5.T触发器
T是一个翻转信号。如果为1,则翻转Q。
6.D触发器
D信号为0时,会把输出状态设为0;D信号为1时,会把输出状态设为1.
二、Verilog中实现触发器与锁存器
1.D触发器
D 触发器是一个电路,存储 1bit 数据,并定期地根据触发器的输入(d)
更新这 1 bit 数据,更新通常发生在时钟上升沿(clk)
。存储的数据会通过输出管脚(q)输出
。
- 复位动作需要与clk同步才能完成!
D 触发器可以认为是一个触发器和一段最简单的组合逻辑块的组合。其中组合逻辑块仅仅是一段 wire。(q 直接输出了触发器的存储值)
module top_module (
input clk, // Clocks are used in sequential circuits
input d,
output reg q );//
// Use a clocked always block
// copy d to q at every positive edge of clk
// Clocked always blocks should use non-blocking assignments
always@(posedge clk) begin
q <= d;
end
endmodule
2.D触发器(带同步复位信号)
同步复位:当时钟上升沿到来时,如果同步复位端有效(本题中复位高电平有效,即 reset),那么任凭你触发器此前输出或者输入的是 0,是 1,输出一律变为 0。
8 个 D 触发器基础上,给触发器配上同步复位端口。
module top_module (
input clk,
input reset, // Synchronous reset
input [7:0] d,
output [7:0] q
);
always @(posedge clk) begin
if(reset)
q <= 8'b0;
else
q <= d ;
end
endmodule
若复位后的值需设为1,这种信号成为置位信号
q <= 8'h34;
3.D触发器(带异步复位信号)
异步复位:使用信号reset的上升(下降)沿事件,作为always的触发,这样,无论时钟clk处于何种状态,都会对输出q进行置位操作
同步与异步区别:
对于同步复位系统来说,当同步复位事件发生时,等到下一个时钟上升沿才会得到响应,响应的速度比较慢。
与之相对的异步复位的响应就很快,因为在异步复位有效的时刻,复位响应就会发生,好像戳破气球一般。
module top_module (
input clk,
input areset, // active high asynchronous reset
input [7:0] d,
output [7:0] q
);
always@(posedge clk or posedge areset) begin //将异步复位加入 always 块的敏感列表当中
if(areset)
q <= 8'b0;
else
q <= d;
end
endmodule
4.D触发器(带使能ena信号)
本题中需要创建一个 16 路 D触发器。部分情况下,只需要多路触发器中的一部分触发器工作,此时可以通过 ena 使能端进行控制。使能端 ena 信号有效时,触发器在时钟上升沿工作。
byteena 使能信号以 byte 为单位管理 8 路触发器在时钟边沿触发与否。
byteena [1]
作为d[15:8]
高位字节的使能端,byteena [0]
则控制d 的低位字节
。
resetn 为同步,低电平有效复位信号。
所有的触发器在时钟上升沿被触发。
module top_module (
input clk,
input resetn,
input [1:0] byteena,
input [15:0] d,
output reg [15:0] q
);
always @(posedge clk) begin
if(~resetn) //先判断复位信号,低电平有效
q <= 16'd0;
else if(byteena[0] || byteena[1]) begin //判断使能信号
if(byteena[1])
q[15:8] <= d[15:8];
if(byteena[0])
q[7:0] <= d[7:0];
end
end
endmodule
5.D锁存器
同 D触发器相比,这个元件没有 clk 端口,取而代之的是 ena 端口,所以这是一个锁存器。
锁存器的特征在于,相较于 D触发器的触发事件发生于 clk
时钟的边沿,锁存器锁存的触发事件发生于使能端 ena
的电平。
always@(*)begin
if(ena)
q<=d;
end
6.MUX and DDF
实现 n-bit 移位寄存器
module top_module (
input clk,
input w, R, E