时序逻辑可以极大避免竞争冒险带来的危害
时序逻辑的开始--寄存器
寄存器的设计一般由D触发器组成
使用按键点亮LED灯
图为同步复位和异步复位分别对应的波形图:注意异步复位是指异步复位,同步释放
同步复位中若时钟上升沿刚好检测到电平的上升沿变化,这里默认检测上一个时刻电平为低电平,直到下一个时钟到来改变,即时序逻辑的延迟效果。
module flip_flop ( input wire clk, input wire res_n, input wire key_in, output reg led_out //后边使用always语句进行赋值所以使用reg类型(也可以理解为灯的亮灭为高低电平的变换所以使用reg型 ); always@(posedge clk or negedge res_n) //设置为时钟上升沿到来时发生变化,当检测到复位下降沿时即复位有效时立即复位,实现异步复位功能 if(res_n == 1'b0) //复位信号设置为低电平有效 led_out <= 1'b0; //注意使用非阻塞赋值 else led_out <= key_in; endmodule
`timescale 1ns/1ns module tb_flip_flop(); reg clk; reg res_n; reg key_in; wire led_out; initial begin clk = 1'b1; res_n <= 1'b0; key_in <= 1'b0; #20 res_n <= 1'b1; //观察复位信号的影响 #200 res_n <= 1'b0; #50 res_n <= 1'b1; end always #10 clk <= ~clk; //生成时钟周期,每10ns反转一次 always #30 key_in <= {$random} % 2; //使用随机数对2取余来模拟随机的按键情况 initial begin $timeformat(19,0,"ns",6); //时间格式的设置 $monitor("@time %t:key_in=%b led_out=%b",$time,key_in,led_out); end flip_flop flip_flop_1 //实例化 ( .clk(clk), .res_n(res_n), .key_in(key_in), .led_out(led_out) ); endmodule
FPGA学习笔记--时序逻辑的设计
最新推荐文章于 2024-05-06 17:04:47 发布