首页 > 技术文章 > 02 LED翻转与计数器使用

cutewei 2020-03-27 11:46 原文

一、  设计定义:

计数器设计与验证

LED,每500ms,状态翻转一次也就是亮灭。

第一步:

系统时钟频率为50M,对应为T= =20ns

计数周期或者时间是500ms,计数次数的计算:

计数值=(500ms= 500_000_000ns)/20=25_000_000

第二步:

对计数值位宽的计算:

打开电脑的计数器,输入计算值,可以得到计数值的十六进制为17D_7840.

由于最高位为1,用一个二进制位1表示即可,其他六位十六进制用四个二进制位表示。

位宽=1+6*4=25(位宽等于:最高位的二进制位数+剩余的位数*4)

 

 

 

 

二设计输入(代码)

这个设计分为两个部分:一是500ms的计数器。二是LED控制,每500MS翻转一次。

 

module counter_led

(

    clk50M,

    rst_n,

    led

);

    input clk50M;   //the frequence system clock

    input rst_n;    //global reset,active low level

    output led;     //the output IO/port

   

    parameter T500Ms = 25'd24_999_999;

    reg [24:0]cnt;  //the shortening of counter,define the counter register

   

    //the counting process of 500Ms counter

    always@(posedge clk50M or negedge rst_n)

        if(!rst_n)

            cnt<=25'd0;

        else if(cnt==T500Ms)

            cnt<=25'd0;

        else

            cnt<=cnt+1'b1;

           

        //  the concrl of the output port of led

        reg rled;

        always@(posedge clk50M or negedge rst_n)

        if(!rst_n)

            rled<=1'b1;

        else if(cnt==T500Ms)

            rled<=~rled;

        else

            rled<=rled;

           

    assign led = rled;

   

endmodule

 

 

 

 

三 仿真

//设计的Testbench文件:

 

`timescale 1ns/1ns

module counter_led_tb;

    reg clk;

    reg rst;

    wire rled;

    counter_led counter_led_m0

(

    .clk50M(clk),

    .rst_n(rst),

    .led(rled)

);

    initial clk=1;

    always begin

        #10 clk=~clk;

    end

    initial begin

        rst=0;#2000;

        rst=1;#200000;

        rst=0;#500_000_000;

        rst=1;#600_000_000;

        $stop;

    end

endmodule

仿真波形如下:

 

 

 

仿真波形正确,led在1000Ms时翻转一次,实现了功能。

今天是我做的一个小实验,LED每500MS翻转一次,很顺利就实现了功能。虽然实验简单,我也学到了知识。一是计数器的使用。计时就是计数。二是LED灯的控制,如翻转和亮灭。三是写文档可以用notepad++和word,排版轻松。我会继续加油!

推荐阅读