hyhyx1 发表于 2019-11-7 14:57:02

交通信号灯的真真明德扬至简设计法实现

我看了一下现在采用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    led_east;
output reg      led_south;
output      led_west;
output         led_north;

reg        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       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



年年有余 发表于 2020-6-14 12:47:31

结合数码管显示倒计时怎么实现

Mamani 发表于 2021-1-17 23:00:25

不错的设计 技巧
页: [1]
查看完整版本: 交通信号灯的真真明德扬至简设计法实现