21ic电子技术开发论坛

标题: 从画时序图开始的二进制灯 [打印本页]

作者: 不是张角    时间: 2025-3-6 17:24
标题: 从画时序图开始的二进制灯
#申请原创# #每日话题# #有奖活动#@21小跑堂


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

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

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

  17. //HS到第4位就回去
  18.     always @(posedge clk or negedge reset_n) //表示只要是始终上升沿或复位下降沿都会运行
  19.         if(!reset_n)
  20.             count3_0 <= 'd0;
  21.         else if(count3_0 == 'd4)
  22.             count3_0 <= 0;
  23.         else if(counter_delay_s == MAX_COUNT_S)
  24.             count3_0 <= count3_0 + 1'd1;
  25. //HS呼吸灯
  26.     always @(posedge clk or negedge reset_n)
  27.         if(!reset_n)
  28.             led <= 0;
  29.         else case (count3_0)
  30.             0 : led <= 4'b0001;
  31.             1 : led <= 4'b0010;
  32.             2 : led <= 4'b0100;
  33.             3 : led <= 4'b1000;
  34.             default: led <= led;
  35.         endcase
  36. endmodule
下来是仿真
复制
  1. module binary_led_tb;

  2.     reg   clk                                  = 0 ;
  3.     reg   reset_n                              = 0 ;

  4.     // led Outputs
  5.     wire  [3:0]led                                  ;



  6.     parameter MAX_COUNT_S  = 'd49_999_999;
  7.     initial clk = 1;
  8.     always #10 clk = ~clk;
  9.     binary_led #(
  10.     .MAX_COUNT_S ( 49_99 ))
  11.     u_led (
  12.     .clk                     ( clk       ),
  13.     .reset_n                 ( reset_n   ),

  14.     .led                     ( led       )
  15.     );
  16.     initial begin
  17.         reset_n = 0;
  18.         #201;
  19.         reset_n = 1;
  20.         #40000000;
  21.         $stop;   
  22.     $finish;
  23. end


  24. endmodule
时序图
[attach]2377766[/attach]
以下为二进制流水灯
复制
  1. module binary_led(
  2.     input clk,
  3.     input reset_n,
  4.     output reg [3:0]led
  5.     );

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

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

  17. //HS到第4位就回去
  18.     always @(posedge clk or negedge reset_n) //表示只要是始终上升沿或复位下降沿都会运行
  19.         if(!reset_n)
  20.             count3_0 <= 'd0;
  21.         else if(count3_0 == 'd15)
  22.             count3_0 <= 0;
  23.         else if(counter_delay_s == MAX_COUNT_S)
  24.             count3_0 <= count3_0 + 1'd1;
  25. //HS呼吸灯
  26.     // always @(posedge clk or negedge reset_n)
  27.     //     if(!reset_n)
  28.     //         led <= 0;
  29.     //     else case (count3_0)
  30.     //         0 : led <= 4'b0001;
  31.     //         1 : led <= 4'b0010;
  32.     //         2 : led <= 4'b0100;
  33.     //         3 : led <= 4'b1000;
  34.     //         default: led <= led;
  35.     //     endcase



  36. // HS二进制灯
  37.     always @(posedge clk or negedge reset_n)
  38.         if(!reset_n)
  39.             led <= 0;
  40.         else case (count3_0)
  41.             0 : led <= 4'b0001;
  42.             1 : led <= 4'b0010;
  43.             2 : led <= 4'b0011;
  44.             3 : led <= 4'b0100;
  45.             4 : led <= 4'b0101;
  46.             5 : led <= 4'b0110;
  47.             6 : led <= 4'b0111;
  48.             7 : led <= 4'b1000;
  49.             8 : led <= 4'b1001;
  50.             9 : led <= 4'b1010;
  51.             10 : led <= 4'b1011;
  52.             11 : led <= 4'b1100;
  53.             12 : led <= 4'b1101;
  54.             13 : led <= 4'b1110;
  55.             14 : led <= 4'b1111;
  56.             default: led <= led;
  57.         endcase




  58. endmodule
结果
[attach]2377768[/attach]

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

作者: 蚊子的噩梦    时间: 2025-4-20 09:29
这个二进制灯的代码看起来逻辑很清晰,不过我注意到MAX_COUNT_S的值设置得非常大,这在实际应用中可能会导致计数器溢出。建议根据实际需求调整这个值。





欢迎光临 21ic电子技术开发论坛 (https://bbs.21ic.com/) Powered by Discuz! X3.5