zoukankan      html  css  js  c++  java
  • 计数器设计与应用

    计数器设计验证方案

    LED每500ms状态翻转一次。

    系统时钟位50MHZ,对应周期即为20ns,

    因为需要500ms翻转一次,即需要500_000_000/20次计数。

    新建工程

    设计输入

    module counter(clk50m,rst_n,led);
    input clk50m,rst_n;//系统时钟与全局复位
    output reg led;
    reg[24:0]cnt;//定义计数寄存器

    always@(posedge clk50m or negedge rst_n)//3-8译码器是组合逻辑,计数器是时序逻辑。
    //计数器计数进程
    if(rst_n==1'b0)
    cnt<=25'd0;
    else if (cnt==25'd24_999_999)//(500_000_000/20) -1的结果。
    cnt<=25'd0;
    else
    cnt<=cnt+1'b1;


    //led显示状态

    always@(posedge clk50m or negedge rst_n)
    if (rst_n==1'b0)
    led <=1'b1; //复位键按下去的时候灯保持常亮
    else if (cnt==25'd24_999_999)
    led <=~led;
    else
    led<=led;


    endmodule

     

    编写testbench

    `timescale 1ns/1ns
    `define clock_period 20
    module counter_tb;
    reg clk;
    reg rst_n;

    wire led;

    counter counter0(
    .clk50m(clk),
    .rst_n(rst_n),
    .led(led)
    );

    initial clk = 1;
    always #(`clock_period/2) clk = ~clk;

    initial begin
    rst_n = 1'b0;
    #(`clock_period *200);
    rst_n = 1'b1;
    #2000000000;
    $stop;
    end

    endmodule

     

    链接testbench 文件

    前仿结果:可以看出每隔500ms,LED又一次跳变。

    后仿结果也相似。

     分配管脚:

     

    程序烧写完毕。

    实验现象:开发板LED灯以1s为周期闪烁,按下按键,LED灯常亮。

     

  • 相关阅读:
    [CF1076D] Edge Deletion
    [CF1081D] Maximum Distance
    [CF1095F] Make It Connected
    [CF1328E] Tree Queries
    [CF1328F] Make k Equal
    Codeforces Round #629 (Div. 3) 总结
    [CF1131D] Gourmet choice
    [CF1176D] Recover it!
    [CF1205B] Shortest Cycle
    [CF1213G] Path Queries
  • 原文地址:https://www.cnblogs.com/noticeable/p/7191249.html
Copyright © 2011-2022 走看看