|
马上注册,看完整文章,学更多FPGA知识。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我看了一下现在采用1s定时计数方法,然后对每个1s进行计数,要计数到30,感觉这样的实现虽然与题目要求相符,但如果
直接采用5s计数器,然后对每个5s进行计数更能体现状态的翻转,而且更为简洁明了,程序代码如下:
module ex3(
clk ,
rst_n ,
led_east ,
led_south ,
led_west ,
led_north
);
parameter TIME_5S=250_000_000 ;
input clk ;
input rst_n ;
output reg [2:0] led_east ;
output reg [2:0] led_south ;
output [2:0] led_west ;
output [2:0] led_north ;
reg [27:0] cnt0 ;
wire add_cnt0 ;
wire end_cnt0 ;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt0 <= 0;
end
else if(add_cnt0)begin
if(end_cnt0)
cnt0 <= 0;
else
cnt0 <= cnt0 + 1'b1;
end
end
assign add_cnt0 = 1;
assign end_cnt0 = add_cnt0 && cnt0==TIME_5S-1 ;
reg [2:0] cnt1 ;
wire add_cnt1 ;
wire end_cnt1 ;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt1 <= 0;
end
else if(add_cnt1)begin
if(end_cnt1)
cnt1 <= 0;
else
cnt1 <= cnt1 + 1'b1;
end
end
assign add_cnt1 = end_cnt0;
assign end_cnt1 = add_cnt1 && cnt1== 6-1;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
led_east <= 3'b110;
end
else begin
case (cnt1)
0,1:led_east <= 3'b110;
2:led_east <= 3'b101;
3,4,5:led_east <= 3'b011;
default:led_east <= 3'b110;
endcase
end
end
assign led_west = led_east;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
led_south <= 3'b011;
end
else begin
case (cnt1)
0,1,2:led_south <= 3'b011;
3,4:led_south <= 3'b110;
5:led_south <= 3'b101;
default:led_south <= 3'b011;
endcase
end
end
assign led_north = led_south;
endmodule
|
|