打印
[FPGA]

从画时序图开始的二进制灯

[复制链接]
27|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创# #每日话题# #有奖活动#@21小跑堂


首先得掌握流水灯
计数器从第一节直接挪用
多加一个归零判断
module binary_led(
    input clk,
    input reset_n,
    output reg [3:0]led
    );

    parameter MAX_COUNT_S = 'd49_999_999;//一秒
    reg [25:0]counter_delay_s;
    reg [3:0]count3_0;

//HS秒
    always @(posedge clk or negedge reset_n) //表示只要是始终上升沿或复位下降沿都会运行
        if(!reset_n)
            counter_delay_s <= 'd0;
        else if(counter_delay_s == MAX_COUNT_S)
            counter_delay_s <= 0;
        else
            counter_delay_s <= counter_delay_s + 1'b1;

//HS到第4位就回去
    always @(posedge clk or negedge reset_n) //表示只要是始终上升沿或复位下降沿都会运行
        if(!reset_n)
            count3_0 <= 'd0;
        else if(count3_0 == 'd4)
            count3_0 <= 0;
        else if(counter_delay_s == MAX_COUNT_S)
            count3_0 <= count3_0 + 1'd1;
//HS呼吸灯
    always @(posedge clk or negedge reset_n)
        if(!reset_n)
            led <= 0;
        else case (count3_0)
            0 : led <= 4'b0001;
            1 : led <= 4'b0010;
            2 : led <= 4'b0100;
            3 : led <= 4'b1000;
            default: led <= led;
        endcase
endmodule
下来是仿真
module binary_led_tb;

    reg   clk                                  = 0 ;
    reg   reset_n                              = 0 ;

    // led Outputs
    wire  [3:0]led                                  ;



    parameter MAX_COUNT_S  = 'd49_999_999;
    initial clk = 1;
    always #10 clk = ~clk;
    binary_led #(
    .MAX_COUNT_S ( 49_99 ))
    u_led (
    .clk                     ( clk       ),
    .reset_n                 ( reset_n   ),

    .led                     ( led       )
    );
    initial begin
        reset_n = 0;
        #201;
        reset_n = 1;
        #40000000;
        $stop;   
    $finish;
end


endmodule
时序图

以下为二进制流水灯
module binary_led(
    input clk,
    input reset_n,
    output reg [3:0]led
    );

    parameter MAX_COUNT_S = 'd49_999_999;//一秒
    reg [25:0]counter_delay_s;
    reg [14:0]count3_0;

//HS秒
    always @(posedge clk or negedge reset_n) //表示只要是始终上升沿或复位下降沿都会运行
        if(!reset_n)
            counter_delay_s <= 'd0;
        else if(counter_delay_s == MAX_COUNT_S)
            counter_delay_s <= 0;
        else
            counter_delay_s <= counter_delay_s + 1'b1;

//HS到第4位就回去
    always @(posedge clk or negedge reset_n) //表示只要是始终上升沿或复位下降沿都会运行
        if(!reset_n)
            count3_0 <= 'd0;
        else if(count3_0 == 'd15)
            count3_0 <= 0;
        else if(counter_delay_s == MAX_COUNT_S)
            count3_0 <= count3_0 + 1'd1;
//HS呼吸灯
    // always @(posedge clk or negedge reset_n)
    //     if(!reset_n)
    //         led <= 0;
    //     else case (count3_0)
    //         0 : led <= 4'b0001;
    //         1 : led <= 4'b0010;
    //         2 : led <= 4'b0100;
    //         3 : led <= 4'b1000;
    //         default: led <= led;
    //     endcase



// HS二进制灯
    always @(posedge clk or negedge reset_n)
        if(!reset_n)
            led <= 0;
        else case (count3_0)
            0 : led <= 4'b0001;
            1 : led <= 4'b0010;
            2 : led <= 4'b0011;
            3 : led <= 4'b0100;
            4 : led <= 4'b0101;
            5 : led <= 4'b0110;
            6 : led <= 4'b0111;
            7 : led <= 4'b1000;
            8 : led <= 4'b1001;
            9 : led <= 4'b1010;
            10 : led <= 4'b1011;
            11 : led <= 4'b1100;
            12 : led <= 4'b1101;
            13 : led <= 4'b1110;
            14 : led <= 4'b1111;
            default: led <= led;
        endcase




endmodule
结果


可以不使用仿真直接烧录,xdc匹配到对应的管脚即可

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

粉丝