zoukankan      html  css  js  c++  java
  • 计数器例子

    ---恢复内容开始---

    LED,每500ms,状态闪烁依次,及每隔500MS,灯亮或灭一次;

    系统时钟为50MHZ,其对应周期为20ns。(T=1/F=1/(50_000_000=2×10^(-8)s)

    500ms=500_000_000ns/20ns=25_000_000;

    创建工程counter

    程序如下:

    module counter(clk50m,rst_n,led);

    input clk50m,rst_n;//系统时钟与全局复位,低电平复位

    output reg led;

    reg[24:0]cnt;//定义计数寄存器,25_000_000转换为16进制需要25位

    always@(posedge clk50m or negedge rst_n)//3-8译码器是组合逻辑,计数器是时序逻辑。

    //计数器计数进程

    if(rst_n==1'b0)

    cnt<=25'd0;

    else if (cnt==25'd24_999_999)//25_000_000-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;//led是一秒的周期亮灭,因此仿真时间要大于1s,所以定义为2s

    $stop;

    end

    endmodule

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

    设置引脚:

    全运行烧写程序,

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

  • 相关阅读:
    Java知识体系之基础知识
    002-JavaNIO
    001-四种常见的IO模型
    c/c++面试题(6)运算符重载详解
    c/c++面试题(5)(c++重要的概念详解)
    c/c++面试题(4)字符串翻转/打印任意进制格式/类型转换
    c/c++面试题(3)strcat/strcmp/strlen/strcpy的实现
    c/c++面试题(2)
    c/c++面试题(1)
    cocos2dx 3.0 之 lua 创建类 (二)
  • 原文地址:https://www.cnblogs.com/fcfc940503/p/10412354.html
Copyright © 2011-2022 走看看