FPGA-计数器——基于GOWIN

1.目的:设计一个每50ms交替变换的输出端驱动LED灯的亮灭

2.原理

2.1输入信号:时钟clk,复位信号reset

2.2输出信号:LED控制led

2.3内部逻辑:

开发板晶振是50Mhz,故时钟周期为20ns。因而达到50ms需要计数25000000次,用25位的寄存器reg[24:0]存储当前计数值较为合适。因而,

    一方面需要控制计数器的加减:即1:复位来时计数器清零;2:时钟来时:若计数器达到25000000-1,计数器清0;负责加1。

     另一方面需要控制LED的输出:即1:复位来时LED输出置零;2:时钟来时:若计数器达到25000000-1,时钟翻转;否则不变

2.4注意:

1. 注意计数周期虽是25000000,但是计数本身有从MAX到0这一过程,故计数值需自减1才对。

2. 虽说一个always语句块就能完成,但为了规范性以及后续分析的合理性,不同的赋值块最好分开单独写。

3.源码


module cnt(
    input clk,
    input reset,
    output reg  led_test
 
);

//定义一个25位的寄存器用于计数
reg [24:0] cnt;


//f:50Mhz,则T:20ns.则500ms需要翻转25_000_0000次

//计数器控制过程
always @(posedge clk or posedge reset)
    begin
    if (reset)

        cnt<=25'd0;
    else if (cnt == 25'd250000000-25'd1)
        cnt <=25'd0;
    else
        cnt <= cnt+25'd0;
         

    end

//LED翻转过程

always @(posedge clk or posedge reset)
    begin
    if (reset)

       led_test<=1'b0;

    else if (cnt == 25'd250000000-25'd1)

       led_test <= ~led_test;

    else
        
       led_test<=led_test;

    end



endmodule 

4.RTL描述与分析

b9023a38e37f4173a74976ea1e525ec2.png

5.modersim仿真 

 

5.1仿真内容

        输入周期为50Mhz的时钟,并在开始的连续3个20ms翻转复位(共产生一个复位上升沿),观察led输出波形及计数器波形。(我这里时间设置的有点短,所以没能看到计数器计满去使LED翻转的过程)

 

5.2tb源码

`timescale 1ns/1ns

module cnt_tb;
    reg clk;
    reg reset;
    wire led;
       cnt cnt(
    .clk(clk),
    .reset(reset),
    .led_test(led)
 
);

initial clk = 1;

always #10 clk= ~clk;

initial begin

    reset = 1'b0;
    #20000;
    reset =1'b1;
    #20000;
    reset =1'b0;
    #20000;
    $stop;
end


endmodule

5.3仿真结果

e46d77d5a30145e38d3676dd3c26da4a.png

 6.板级测试

6.1时序约束

由于这个是时序逻辑电路,故需要对时钟信号进行时序约束

6.2IO约束

 

6.3测试结果

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值