FPGA学习笔记--时序逻辑的设计

时序逻辑可以极大避免竞争冒险带来的危害

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

寄存器的设计一般由D触发器组成

使用按键点亮LED灯        

        FPGA学习笔记--时序逻辑的设计_第1张图片

        图为同步复位和异步复位分别对应的波形图:注意异步复位是指异步复位,同步释放

同步复位中若时钟上升沿刚好检测到电平的上升沿变化,这里默认检测上一个时刻电平为低电平,直到下一个时钟到来改变,即时序逻辑的延迟效果。

FPGA学习笔记--时序逻辑的设计_第2张图片

 

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学习笔记及心得,fpga开发,学习)