使用使能时钟代替分频时钟好处:
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
最终结果图:
可见最终输出效果一致