FPGA的学习:D触发器

Posted 石小舟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FPGA的学习:D触发器相关的知识,希望对你有一定的参考价值。

首先把系统框图和时序图画出来:

同步复位:只在时钟上升沿发生信号的变化

异步复位:在时钟的上升沿和复位信号的下降沿发生信号的变化

接着编写程序来实现:

`timescale  1ns/1ns

module  flip_flop
(
    input   wire    sys_clk     ,   //系统时钟
    input   wire    sys_rst_n   ,   //全局复位
    input   wire    key_in      ,   //输入按键

    output  reg     led_out         //输出
);

//同步复位,注意always中的语句与下面异步的不一样,而且一次只能运行一个always

always@(posedge sys_clk)    
    if(sys_rst_n == 1'b0)   
        led_out <= 1'b0;    
    else
        led_out <= key_in;

 

always@(posedge sys_clk or negedge sys_rst_n) //当always块中的敏感列表为检测到sys_clk上升沿或sys_rst_n下降沿时执行下面的语句
    if(sys_rst_n == 1'b0)                     
        led_out <= 1'b0;
    else
        led_out <= key_in;

endmodule

 

实现了波形的实现后,进行仿真文件的编写:

`timescale  1ns/1ns

module  tb_flip_flop();

wire            led_out     ;

reg             sys_clk     ;
reg             sys_rst_n   ;
reg             key_in      ;

//初始化系统时钟、全局复位和输入信号
initial begin
    sys_clk    = 1'b1;  //时钟信号的初始化为1,且使用“=”赋值,其他信号的赋值都是用“<=”
    sys_rst_n <= 1'b0;  //因为低电平复位,所以复位信号的初始化为0
    key_in    <= 1'b0;  //输入信号按键的初始化,为0和1均可
    #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; //使用always产生时钟信号,让时钟每隔10ns反转一次,即一个时钟周期为20ns,换算为频率为50Mhz

always #20 key_in <= {$random} % 2; //取模求余数,产生非负随机数0、1,每隔20ns产生一次随机数(之所以每20ns产生一次随机数而不是之前的每10ns产生一次随机数,是为了在时序逻辑中能够保证key_in信号的变化的时间小于等于时钟的周期,这样就不会产生类似毛刺的变化信号,虽然产生的毛刺在时序电路中也能被滤除掉,但是不便于我们观察波形)

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    ),  //input     sys_clk
    .sys_rst_n  (sys_rst_n  ),  //input     sys_rst_n
    .key_in     (key_in     ),  //input     key_in

    .led_out    (led_out    )   //output    led_out
);

endmodule

以上是关于FPGA的学习:D触发器的主要内容,如果未能解决你的问题,请参考以下文章

FPGA时序约束

[从零开始学习FPGA编程-31]:进阶篇 - 基本时序电路-RS触发器(Verilog语言)

FPGA学习的一点总结

几个有关FPGA的概念

FPGA跨时钟域处理方法

FPGA基础入门篇 边沿检测电路