1. 实现关键点
计数器级联 每500ms多亮一个灯。
主要代码:
//****************************************************************
//--cnt_500ms
//****************************************************************
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt_500ms <= 'd0;
end
else if(add_cnt_500ms)begin
if(end_cnt_500ms)begin
cnt_500ms <= 'd0;
end
else begin
cnt_500ms <= cnt_500ms + 1'b1;
end
end
end
assign add_cnt_500ms = 1'b1;
assign end_cnt_500ms = add_cnt_500ms && cnt_500ms == TM_500MS - 1'b1 ;
//****************************************************************
//--cnt_s
//****************************************************************
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt_s <= 'd0;
end
else if(add_cnt_s)begin
if(end_cnt_s)begin
cnt_s <= 'd0;
end
else begin
cnt_s <= cnt_s + 1'b1;
end
end
end
assign add_cnt_s = end_cnt_500ms ;
assign end_cnt_s = add_cnt_s && cnt_s == MUX - 1'b1 ;
2. 完整代码:
/**************************************功能介绍***********************************
Description: 跑马灯
Change history:
*********************************************************************************/
//---------<模块及端口声名>------------------------------------------------------
module run_led(
input clk ,
input rst_n ,
output reg [3:0] led
);
//---------<参数定义>---------------------------------------------------------
parameter TM_500MS = 25_000_000,
MUX = 8;
//---------<内部信号定义>-----------------------------------------------------
reg [24:0] cnt_500ms ;
wire add_cnt_500ms ;
wire end_cnt_500ms ;
reg [3:0] cnt_s ;
wire add_cnt_s ;
wire end_cnt_s ;
//****************************************************************
//--cnt_500ms
//****************************************************************
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt_500ms <= 'd0;
end
else if(add_cnt_500ms)begin
if(end_cnt_500ms)begin
cnt_500ms <= 'd0;
end
else begin
cnt_500ms <= cnt_500ms + 1'b1;
end
end
end
assign add_cnt_500ms = 1'b1;
assign end_cnt_500ms = add_cnt_500ms && cnt_500ms == TM_500MS - 1'b1 ;
//****************************************************************
//--cnt_s
//****************************************************************
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt_s <= 'd0;
end
else if(add_cnt_s)begin
if(end_cnt_s)begin
cnt_s <= 'd0;
end
else begin
cnt_s <= cnt_s + 1'b1;
end
end
end
assign add_cnt_s = end_cnt_500ms ;
assign end_cnt_s = add_cnt_s && cnt_s == MUX - 1'b1 ;
//****************************************************************
//--led输出
//****************************************************************
//always @(posedge clk or negedge rst_n)begin
// if(!rst_n)begin
// led <= 4'b0000;
// end
// else begin
// case(cnt_s)
// 0,6 : led <= 4'b0001;
// 1,5 : led <= 4'b0011;
// 2,4 : led <= 4'b0111;
// 3, : led <= 4'b1111;
// 7, : led <= 4'b0000;
// default : led <= 4'b1111;
// endcase
// end
//end
always @(*)begin
case(cnt_s)
0,6 : led <= 4'b0001;
1,5 : led <= 4'b0011;
2,4 : led <= 4'b0111;
3, : led <= 4'b1111;
7, : led <= 4'b0000;
default : led <= 4'b1111;
endcase
end
endmodule
3. 上板验证
跑马灯