FPGA 交通灯
設(shè)計要求
實現(xiàn)開發(fā)板上東西南北 4 個方向,每個方向上的 3 個 LED 燈按照“綠燈--黃燈--紅燈--綠燈- -黃燈......”依次循環(huán)變化。變化的速度不同,東面的間隔時間為 1 秒;西面的間隔時間為 2 秒;南 面的間隔時間為 3 秒;北面的間隔時間為 4 秒。 具體要求: 1、每個方向的燈分開獨立設(shè)計。 2、首先設(shè)計東向的燈:設(shè)計一個計時 1 秒的計數(shù)器,用來計算燈的狀態(tài)變化的時間間隔。 3、如果計時 1 秒到了,把黃燈點亮;再過 1 秒把紅燈點亮;再過 1 秒,把綠燈點亮...... 依次循環(huán)。 4、設(shè)計西方向的燈:設(shè)計一個計時 2 秒的計數(shù)器,其他的類似。
2
根據(jù)題目功能要求,東西南北四個方向 LED 燈顏色變換的速度都不同。因為在數(shù)字電路中的延 時都是通過計數(shù)器實現(xiàn)的,計數(shù)器*時鐘周期=延時時間。本模塊中,由于輸入時鐘是 50MHz,時鐘周 期為 20ns,功能要求每 1 秒變化一次。我們通過 counter 來表示延時,當(dāng)其值為 1s/20ns=5000_00 00 時,表示 1 秒時間到。 本工程架構(gòu)由四個計數(shù)器組成:e_counter w_counter n_counter s_counter。
可以看到 50000000*4 位寬為28位 所以所有計數(shù)器位寬都為[27:0].
parameter COUNT_1S = 26'd5000_0000;
always @(posedge clk or negedge rst_n) begin
if (rst_n==0) begin
e_counter <= 0;
end
else if(add_e_counter) begin
if(end_e_counter)
e_counter <= 0;
else e_counter <= e_counter+1 ;
end
end
assign add_e_counter = 1;
assign end_e_counter = add_e_counter && e_counter == COUNT_1S-1 ;
LED 燈信號的變化,根據(jù)功能要求,東面的間隔時間為 1 秒;西面的間隔時間為 2 秒;南面 2 的間隔時間為 3 秒;北面的間隔時間為 4 秒。計數(shù)時間到時變化;時間沒到,則不變化。每一時 刻每個方向只有一個燈亮,并且亮燈的顏色順序按照“綠燈--黃燈--紅燈--綠燈--黃燈.....”依次循環(huán)變 化。 東西南北四個方向的各有三盞不同顏色的 LED 燈,每個方向的三個 LED 燈都由 3 比特信號控 制,最高位為紅燈,最低位為綠燈,并且低電平時 LED 燈亮。led_east 表示東面三個 LED 燈,led_ west 表示西面三個 LED 燈,led_south 表示南面三個 LED 燈,led_north 表示北面三個 LED 燈。 三色 LED 燈的循環(huán)變換控制可以通過拼接的方法使數(shù)據(jù)循環(huán)左移來實現(xiàn)。
接下來就是燈的控制信號 這里采用移位拼接的方法;led_east<={{(LED_LEN-1){1'b1}},1'b0};
led_east<={{(LED_LEN-1){1'b1}},1'b0};
代碼如下:采用一個時序邏輯來控制。
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
led_east<={{(LED_LEN-1){1'b1}},1'b0};
end
else if(end_e_counter)begin
led_east<={led_east[LED_LEN-2:0],led_east[LED_LEN-1]};
end
else begin
led_east<=led_east;
end
end
最后輸出端口output如下
?
總體代碼如下
module jiaotongden (input wire clk,input wire rst_n,output reg [2:0] led_east,output reg [2:0] led_south,output reg [2:0] led_west,output reg [2:0] led_north);reg [27:0] e_counter;reg [27:0] w_counter;reg [27:0] n_counter;reg [27:0] s_counter;parameter COUNT_1S = 26'd5000_0000; parameter LED_LEN = 3;always @(posedge clk or negedge rst_n)begin if(!rst_n)begin e_counter<= 0; end else if(add_e_counter)begin if(end_e_counter)e_counter <= 0; elsee_counter <=e_counter + 1; end endassign add_e_counter = 1; assign end_e_counter = add_e_counter && e_counter==COUNT_1S-1 ; always @(posedge clk or negedge rst_n) begin if (rst_n==0) beginw_counter <= 0; endelse if(add_w_counter) beginif(end_w_counter)w_counter <= 0; elsew_counter <= w_counter+1 ;end end assign add_w_counter = 1; assign end_w_counter = add_w_counter && w_counter == 2*COUNT_1S-1 ;always @(posedge clk or negedge rst_n) begin if (rst_n==0) begins_counter <= 0; endelse if(add_s_counter) beginif(end_s_counter)s_counter <= 0; elses_counter <= s_counter+1 ;end end assign add_s_counter = 1; assign end_s_counter = add_s_counter && s_counter == 3*COUNT_1S-1 ;always @(posedge clk or negedge rst_n) begin if (rst_n==0) beginn_counter <= 0; endelse if(add_n_counter) beginif(end_n_counter)n_counter <= 0; elsen_counter <= n_counter+1 ;end end assign add_n_counter = 1; assign end_n_counter = add_n_counter && n_counter == 4*COUNT_1S-1 ; always @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled_east<={{(LED_LEN-1){1'b1}},1'b0};endelse if(end_e_counter)beginled_east<={led_east[LED_LEN-2:0],led_east[LED_LEN-1]};endelse beginled_east<=led_east;end endalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled_west<={{(LED_LEN-1){1'b1}},1'b0};endelse if(end_w_counter)beginled_west<={led_west[LED_LEN-2:0],led_west[LED_LEN-1]};endelse beginled_west<=led_west;end endalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled_south<={{(LED_LEN-1){1'b1}},1'b0};endelse if(end_s_counter)beginled_south<={led_south[LED_LEN-2:0],led_south[LED_LEN-1]};endelse beginled_south<=led_south;end endalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled_north<={{(LED_LEN-1){1'b1}},1'b0};endelse if(end_n_counter)beginled_north<={led_north[LED_LEN-2:0],led_north[LED_LEN-1]};endelse beginled_north<=led_north;end endendmodule總結(jié)
- 上一篇: 高中电子技术——比较器构成的自锁开关电路
- 下一篇: 专业术语定义