时序逻辑的开始 --- 寄存器

时序逻辑的开始 — 寄存器

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态信号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值