时序逻辑的开始 — 寄存器
1. 理论学习
组合逻辑最大的缺点就是会存在竞争冒险,这种问题是非常危险的,常常会引起电路的不稳定性和工作的不确定性,而我们使用时序逻辑就可以极大的避免这种问题,从而使系统更加的稳定。
而时序逻辑最基本的单元就是寄存器,寄存器具有存储功能,一般是由D触发器构成,由时钟脉冲控制,每个D触发器能够存储一位二进制码。
D 触发器的功能为:在一个脉冲信号(一般为晶振产生的时钟脉冲)上升沿或下降沿的作用下,将信号从输入端 D 送到输出端 Q,如果时钟脉冲的边沿信号未出现,即使输入信号改变,输出信号仍然保持原值,且寄存器拥有复位清零功能,其复位又分为同步复位和异步复位。
2. 实战演练
目标:编写LED灯工程,但是使用D触发器控制
用到的信号有
- sys_clk
- sys_rst_n
- key_in
- led_out
D 触发器根据复位的不同分为两种,一种是同步复位的 D 触发器,另一种时异步复位 的 D 触发器,下面就是详细介绍这两种 D 触发器的异同,以及波形的设计。
同步复位的D触发器
同步复位的 D 触发器中的**“同步”是和工作时钟同步的意思**,也就是说,当时钟的上升沿(也可以是下降沿,一般习惯上为上升沿触发)来到时检测到按键的复位操作才有效,否则无效。
异步复位的D触发器
异步复位的 D 触发器中的**“异步”是和工作时钟不同步的意思**,也就是说,寄存器的复位与时钟的上升沿无关,只要有检测到按键被按下,就立刻执行复位操作。
时序电路还有一个特点,就是“延一拍”的效果。
当表达时序逻辑时如果时钟和数据是对齐的,则默认当前时钟沿采集到的数据为在该时钟上升沿前一时刻的值;当表达组合逻辑时如果时钟和数据是对齐的,则默认当前时钟沿采集到的数据为在该时钟上升沿同一时刻的值。
3.代码编写
同步复位的D触发器
module Flip_Flop
(
input wire sys_clk,
input wire sys_rst_n,
input wire key_in,
output wire led_out
);
always@(posedge sys_clk) //只有sys_clk控制
begin
if(sys_rst_n == 1'b0)
led_out <= 1'b0;
else
led_out <= key_in;
end
endmodule
异步复位的D触发器
module Flip_Flop
(
input wire sys_clk,
input wire sys_rst_n,
input wire key_in,
output wire led_out
);
always@(posedge sys_clk or posedge sys_rst_n) //sys_clk和sys_rst_n都可控制
begin
if(sys_rst_n == 1'b0)
led_out <= 1'b0;
else
led_out <= key_in;
end
endmodule
仿真代码(自己写了一半嘿嘿)
`timescale 1ns/1ns
module tb_Flip_Flop ();
reg sys_clk;
reg sys_rst_n;
reg key_in;
wire led_out;
initial
begin
sys_clk = 1'b1; //时钟信号初始化为1,且用“=”赋值
//其他信号的赋值都是用<=
sys_rst_n <= 1'b0; //低电平复位
key_in <= 1'b0;
#20
sys_rst_n <= 1'b1; //初始化 20ns 后复位释放
//所示释放时,把信号拉高系统才开始工作
#210
sys_rst_n <= 1'b0; //为了观察同步复位和异步复位的区别,在复位释放后
//电路工作 210ns 后再让复位有效。之所以选择延时 210ns
//而不是 200ns 或 220ns,是因为能够使复位信号在时钟下
//降沿时复位,能够清晰的看出同步复位和异步复位的差别
#40
sys_rst_n <= 1'b1; //复位 40ns 后再次让复位释放掉
end
always #10 sys_clk = ~sys_clk; //每10ns翻转一次,周期20ns,频率就为50MHz
always #20 key_in <= {$random}%2; //模拟按键输入的情况
initial begin
$timeformat(-9,0,"ns",6);
$monitor("@time %t:key_in=%b, led_out=%b",$time,key_in,led_out);
end
Flip_Flop Flip_Flop_inst
(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n),
.key_in (key_in ),
.led_out (led_out )
);
endmodule
拓展训练
发现发两个仿真的波形在最开始的一段时间内有所不同
-
同步复位的 D 触发器在开始一段时间内是红色的信号,
-
而异步复位的 D 触发器就没有这种现象
产生这种现象的原因是什么,仿真波形中的红色信号又代表什么意思呢?
原因:
1、时钟异常
2、复位信号异常
3、时钟、复位、输入都正常,但是输出为X态:
红色信号:
casex,表示不确定的信号,又称红色x态信号