深入浅出玩转FPGA读书笔记2--分频时钟和使能时钟

使用使能时钟代替分频时钟好处:

1:可以时钟不稳定

2:保持一个始终,减少跨时钟域

用分频时钟来显示数码管,en是使能时钟信号:

module led_run(
    clk,
    rst,
    led,
    led1
);
    input clk;
    input rst;
    output reg [7:0]led;
    output reg [7:0]led1;
    wire en;
    reg [24:0]cnt;
    reg [2:0]cnt3;
    parameter MCNT=24999;
    always@(posedge clk or negedge rst)
    begin
        if(~rst)
            cnt<=0;
        else if(cnt==MCNT)
            cnt<=0;
        else
            cnt<=cnt+1'b1;
    end
    
    assign en=(cnt==MCNT);
    always @(posedge clk or negedge rst) 
    begin
        if(~rst)
            cnt3<=3'd0;
        else if(en)
            cnt3<=cnt3+1'b1;

    end
    always@(*)
    begin
        case(cnt3)
            3'b000: led1=8'b0000_0001;
            3'b001: led1=8'b0000_0010;
            3'b010: led1=8'b0000_0100;
            3'b011: led1=8'b0000_1000;
            3'b100: led1=8'b0001_0000;
            3'b101: led1=8'b0010_0000;
            3'b110: led1=8'b0100_0000;
            3'b111: led1=8'b1000_0000; 
        endcase
    end
   reg [2:0]cnt2;
    always@(posedge clk or negedge rst)
    begin
        if(~rst)
            cnt2<=0;
        else if(cnt==MCNT)
            cnt2<=cnt2+1'b1;
            
        else 
            cnt2<=cnt2;
    end
    always@(*)
    begin
        case(cnt2)
            3'b000: led=8'b0000_0001;
            3'b001: led=8'b0000_0010;
            3'b010: led=8'b0000_0100;
            3'b011: led=8'b0000_1000;
            3'b100: led=8'b0001_0000;
            3'b101: led=8'b0010_0000;
            3'b110: led=8'b0100_0000;
            3'b111: led=8'b1000_0000; 
        endcase
    end
    

 /*  always@(posedge clk or negedge rst )
    begin
        if(~rst)
            led<=8'b0000_0001;
        else if(cnt==24999)
        begin
            if(led==8'b1000_0000)
                led<=8'b0000_0001;
            else
                led<=led<<1;//led<={led[6:0],led[7]};
        end
        else
            led<=led;
        
    end

*/



endmodule

tb代码:

`timescale 1ns/1ns
module tb_led_run;
    reg clk;
    reg rst;
    wire [7:0]led;
    wire [7:0]led1;
  //  led_run u1(.clk(clk),.rst(rst),.led(led[7:0]));
    
  /*  led_run u1(.clk(clk),.rst(rst),.led(led[7:0]));
    defparam u1.MCNT=2499;
*/
    led_run 
    #(2499)
    u1(.clk(clk),.rst(rst),.led(led[7:0]),.led1(led1));

   
    initial
    begin
        rst=1'b1;
        #10;
        rst=1'b0;
        #200;
        rst=1'b1;
        #40000000;
        $stop;

    end

    always
    begin
        clk=1'b0;
        #10;
        clk=1'b1;
        #10;
    end






endmodule

最终结果图:

可见最终输出效果一致

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值