- 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
时序图
[attach]2377766[/attach]
以下为二进制流水灯
- 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
结果
[attach]2377768[/attach]
可以不使用仿真直接烧录,xdc匹配到对应的管脚即可
作者: 蚊子的噩梦 时间: 2025-4-20 09:29
这个二进制灯的代码看起来逻辑很清晰,不过我注意到MAX_COUNT_S的值设置得非常大,这在实际应用中可能会导致计数器溢出。建议根据实际需求调整这个值。
欢迎光临 21ic电子技术开发论坛 (https://bbs.21ic.com/)
Powered by Discuz! X3.5