verilog課程設計交通燈
『壹』 數字電路verilog HDL語言設計交通燈控制器
mole LIGHT_CTRL(
clk , //sys clk 24mhz
rst_n , //n_reset
road_a_grn , //Road A Green
road_a_red , //Road A Red
road_b_grn , //Road B Green
road_b_red //Road B Red
);
//Input PIN
input clk ; //sys clk 24mhz
input rst_n ; //n_reset
//Output PIN
output road_a_grn ; //Road A Green
output road_a_red ; //Road A Red
output road_b_grn ; //Road B Green
output road_b_red ; //Road B Red
//Register And Wire
//1sec pulse
wire n_1s_cnt_end ;
wire n_500ms_pls ;
reg [31:0] r_cnt ;
//light ctrl state(1sec pls transition)
reg [2:0] r_state ;
//second cnt
reg [4:0] r_sec_cnt ;
//second cnt
reg r_blk_flg ;
//light output
wire n_road_a_grn ;
wire n_road_a_red ;
wire n_road_b_grn ;
wire n_road_b_red ;
reg road_a_grn ;
reg road_a_red ;
reg road_b_grn ;
reg road_b_red ;
//***RTL***
//1sec pulse and 500ms pulse
assign n_1s_cnt_end = (r_cnt == 32'h016E_35FF)? 1'b1 : 1'b0; //when cnt=23999999,1s pulse
assign n_500ms_pls = (r_cnt == 32'h00B7_1AFF)? 1'b1 : 1'b0; //when cnt=11999999,500ms pulse
always @(posedge clk or negedge rst_n) begin
if (~) begin
r_cnt <= 32'h0000_0000;
end
else begin
if(n_1s_cnt_end == 1'b1)
r_cnt <= 32'h0000_0000;
else
r_cnt <= r_cnt + 1'b1;
end
end
//light ctrl state(1sec pls transition)
//1st 24sec:00
//1st 3sec :10
//2nd 3sec :11
//others :goto 00
always @(posedge clk or negedge rst_n) begin
if (~rst) begin
r_state <= 3'b000;
end
else begin
if(n_1s_cnt_end == 1'b1)
if((r_state[1:0] == 2'b00) && (r_sec_cnt == 5'b1_0111)
r_state <= {r_state[2],2'b10};
else if((r_state[1:0] == 2'b10) && (r_sec_cnt == 5'b0_0010)
r_state <= {r_state[2],2'b11};
else if((r_state[1:0] == 2'b11) && (r_sec_cnt == 5'b0_0010)
r_state <= {~r_state[2],2'b00};
else if(r_state[1:0] == 2'b01)
r_state <= 3'b000;
else
r_state <= r_state;
else
r_state <= r_state;
end
end
................................
做完了 你確認了 我把程序發給你qq
『貳』 急!verilog編寫的交通燈
建議使用三段狀態機描述,可以避免毛刺的出現,代碼如下(已經編譯通過)
mole traffic(clk,rst,b,L0,L1,L2,L3);
input clk,rst,b;
output L0,L1,L2,L3;
reg l0,l1,l2,l3;
parameter S0 = 2'b00;
parameter S1 = 2'b01;
parameter S2 = 2'b10;
parameter S3 = 2'b11;
reg [1:0] counter;
reg [1:0] cs,ns;
reg b_req;
always@(posedge clk or posedge rst) begin
if(rst) b_req <= 1'b0;
else if(b)
b_req <= 1'b1;
end
always@(posedge clk or posedge rst)begin
if(rst)begin
counter <= 2'b0;
end
else begin
counter <= counter + 1'b1;
end
end
always@(posedge clk or posedge rst)begin
if(rst) begin
cs <= S0;
end
else begin
cs <= ns;
end
end
always@(b or b_req or cs or rst or counter)
begin
ns = 2'bx;
case(cs)
S0: begin
if(counter == 2'b11)begin
if(b_req) ns = S2;
else ns = S1;
end
else
ns = S0;
end
S1: begin
if(counter == 2'b11)begin
if(b_req) ns = S3;
else ns = S0;
end
else
ns = S1;
end
S2: begin
if(counter == 2'b11)
ns = S1;
else
ns = S2;
end
S3: begin
if(counter == 2'b11)
ns = S0;
else
ns = S3;
end
default:;
endcase
end
always@(posedge clk or posedge rst)begin
if(rst)begin
l0 <= 1'b0;
l1 <= 1'b0;
l2 <= 1'b0;
l3 <= 1'b0;
end
else begin
case(ns)
S0: begin
b_req <= 1'b0;
l0 <= 1'b1;
l1 <= 1'b0;
l2 <= 1'b0;
l3 <= 1'b1;
end
S1: begin
b_req <= 1'b0;
l0 <= 1'b0;
l1 <= 1'b1;
l2 <= 1'b1;
l3 <= 1'b0;
end
S2: begin
l0 <= 1'b0;
l1 <= 1'b1;
l2 <= 1'b0;
l3 <= 1'b1;
end
S3: begin
l0 <= 1'b0;
l1 <= 1'b1;
l2 <= 1'b0;
l3 <= 1'b1;
end
default:;
endcase
end
end
assign L0 = l0;
assign L1 = l1;
assign L2 = l2;
assign L3 = l3;
endmole
不知道reset的要求,隨便寫了一個reset
別的應該問題不大,可能3秒還是4秒會有點問題
水平有限,請指正
『叄』 用Verilog設計一個交通燈,程序已經寫好。就是不知道把各個模塊連接起來。
如果有多個模塊的話寫個頂層模塊,通過例化調用每個子模塊就好了;
『肆』 verilog語言設計交通燈的問題
我們將問題分解為2部分,來自同步時鍾域信號的處理和來自非同步時鍾域信號的處理。前者要簡單許多,所以先討論前者,再討論後者。
1.同步時鍾域信號的處理
一般來說,在全同步設計中,如果信號來自同一時鍾域,各模塊的輸入不需要寄存。只要滿足建立時間,保持時間的約束,可以保證在時鍾上升沿到來時,輸入信號已經穩定,可以采樣得到正確的值。但是如果模塊需要使用輸入信號的跳變沿(比如幀同步信號),千萬不要直接這樣哦。
always @ (posedge inputs)
begin
...
end
因為這個時鍾inputs很有問題。如果begin ... end語句段涉及到多個D觸發器,你無法保證這些觸發器時鍾輸入的跳變沿到達的時刻處於同一時刻(准確的說是相差在一個很小的可接受的范圍)。因此,如果寫出這樣的語句,EDA工具多半會報clock skew > data delay,造成建立/保持時間的沖突。本人曾經也寫出過這樣的語句,當時是為了做分頻,受大二學的數字電路的影響,直接拿計數器的輸出做了後面模塊的時鍾。當初用的開發工具是max+plusII,編譯也通過了,燒到板子上跑倒也能跑起來(估計是因為時鍾頻率較低,6M:lol:),但後來拿到 QuartusII中編譯就報clock skew > data delay。大家可能會說分頻電路很常見的啊,分頻輸出該怎麼用呢。我一直用的方法是採用邊沿檢測電路,用HDL語言描述大概是這樣:
always @ (posedge Clk)
begin
inputs_reg <= inputs;
if (inputs_reg == 1'b0 && inputs == 1'b1)
begin
...
end
...
end
這是上跳沿檢測的電路,下跳沿電路大家依此類推。
2.非同步時鍾域信號的處理
這個問題也得分單一信號和匯流排信號來討論。
2.1單一信號(如控制信號)的處理
如果這個輸入信號來自非同步時鍾域(比如FPGA晶元外部的輸入),一般採用同步器進行同步。最基本的結構是兩個緊密相連的觸發器,第一拍將輸入信號同步化,同步化後的輸出可能帶來建立/保持時間的沖突,產生亞穩態。需要再寄存一拍,減少(注意是減少)亞穩態帶來的影響。這種最基本的結構叫做電平同步器。
如果我們需要用跳變沿而不是電平又該怎樣處理呢,還記得1裡面講的邊沿檢測電路么?在電平同步器之後再加一級觸發器,用第二級觸發器的輸出和第三級觸發器的輸出來進行操作。這種結構叫做邊沿同步器。
always @ (posedge Clk)
begin
inputs_reg1 <= inputs;
inputs_reg2 <= inputs_reg1;
inputs_reg3 <= inputs_reg2;
if (inputs_reg2 == 1'b1 && inputs_reg3 == 1'b0)
begin
...
end
...
end
以上兩種同步器在慢時鍾域信號同步入快時鍾域時工作的很好,但是反過來的話,可能就工作不正常了。舉一個很簡單的例子,如果被同步的信號脈沖只有一個快時鍾周期寬,且位於慢時鍾的兩個相鄰跳變沿之間,那麼是采不到的。這時就需要採用脈沖同步器。這種同步器也是由3個觸發器組成,同時需要對發送信號做一些處理,具體結構大家可以在網上搜。
2.2匯流排信號的處理
如果簡單的對非同步時鍾域過來的一組信號分別用同步器的話,那麼對這一組信號整體而言,亞穩態出現的幾率將大大上升。基於這一觀點,對於匯流排信號的處理可以有兩種方式。
如果這組信號只是順序變化的話(如存儲器的地址),可以將其轉換為格雷碼後再發送,由於格雷碼相鄰碼字只相差一個比特,上面說的同步器可以很好的發揮作用。
但是如果信號的變化是隨機的(如存儲器的數據),這種方法便失效了,這時可以採用握手的方式或者採用FIFO或DPRAM進行緩存。RAM緩存的方式在突發數據傳輸中優勢比較明顯,現在高檔一點的FPGA中都有不少的BlockRAM資源,且支持配置為DPRAM或FIFO,這種處理方法在通信電路中非常常用。
『伍』 verilog語言交通燈實驗
這個可以的,有硬體平台嗎?
懂事電子設計 vgz
『陸』 我在做數電的課設,設計交通燈,用verilog寫,關於黃燈閃爍的部分怎麼解決謝謝
hi 兄弟,
黃燈閃爍其實就是,燈亮一陣子,燈在暗一陣子.
以下是流程
我不知道你時專鍾多快,我就屬假設 1M Hz.
a. 用8 bit計數器,每次都算到 249 (0.25sec),
b. 將計數計重置 (設回8'b0)
c. 然後把黃燈 = ~黃燈;
還看不懂再說,這電路不難的.
『柒』 用Verilog設計交通燈
交通燈控制器
/* 信號定義與說明:
CLK: 為同步時鍾;
EN: 使能信號,為1 的話,則控制器開始工作;
LAMPA: 控制A 方向四盞燈的亮滅;其中,LAMPA0~LAMPA3,分別控制A 方向的
左拐燈、綠燈、黃燈和紅燈;
LAMPB: 控制B 方向四盞燈的亮滅;其中,LAMPB0 ~ LAMPB3,分別控制B 方向的
左拐燈、綠燈、黃燈和紅燈;
ACOUNT: 用於A 方向燈的時間顯示,8 位,可驅動兩個數碼管;
BCOUNT: 用於B 方向燈的時間顯示,8 位,可驅動兩個數碼管。*/
mole traffic(CLK,EN,LAMPA,LAMPB,ACOUNT,BCOUNT);
output[7:0] ACOUNT,BCOUNT;
output[3:0] LAMPA,LAMPB;
input CLK,EN;
reg[7:0] numa,numb;
reg tempa,tempb;
reg[2:0] counta,countb;
reg[7:0] ared,ayellow,agreen,aleft,bred,byellow,bgreen,bleft;
reg[3:0] LAMPA,LAMPB;
always @(EN)
if(!EN)
begin //設置各種燈的計數器的預置數
ared <=8'd55; //55 秒
ayellow <=8'd5; //5 秒
agreen <=8'd40; //40 秒
aleft <=8'd15; //15 秒
bred <=8'd65; //65 秒
byellow <=8'd5; //5 秒
bleft <=8'd15; //15 秒
bgreen <=8'd30; //30 秒
end
assign ACOUNT=numa;
assign BCOUNT=numb;
always @(posedge CLK) //該進程式控制制A 方向的四種燈
begin
if(EN)
begin
if(!tempa)
begin
tempa<=1;
case(counta) //控制亮燈的順序
0: begin numa<=agreen; LAMPA<=2; counta<=1; end
1: begin numa<=ayellow; LAMPA<=4; counta<=2; end
2: begin numa<=aleft; LAMPA<=1; counta<=3; end
3: begin numa<=ayellow; LAMPA<=4; counta<=4; end
4: begin numa<=ared; LAMPA<=8; counta<=0; end
default: LAMPA<=8;
endcase
end
else begin //倒計時
if(numa>1)
if(numa[3:0]==0) begin
numa[3:0]<=4'b1001;
numa[7:4]<=numa[7:4]-1;
end
else numa[3:0]<=numa[3:0]-1;
if (numa==2) tempa<=0;
end
end
else begin
LAMPA<=4'b1000;
counta<=0; tempa<=0;
end
end
always @(posedge CLK) //該進程式控制制B 方向的四種燈
begin
if (EN)
begin
if(!tempb)
begin
tempb<=1;
case (countb) //控制亮燈的順序
0: begin numb<=bred; LAMPB<=8; countb<=1; end
1: begin numb<=bgreen; LAMPB<=2; countb<=2; end
2: begin numb<=byellow; LAMPB<=4; countb<=3; end
3: begin numb<=bleft; LAMPB<=1; countb<=4; end
4: begin numb<=byellow; LAMPB<=4; countb<=0; end
default: LAMPB<=8;
endcase
end
else
begin //倒計時
if(numb>1)
if(!numb[3:0]) begin
numb[3:0]<=9;
numb[7:4]<=numb[7:4]-1;
end
else numb[3:0]<=numb[3:0]-1;
if(numb==2) tempb<=0;
end
end
else begin
LAMPB<=4'b1000;
tempb<=0; countb<=0;
end
end
endmole
『捌』 verilog交通燈設計修改
//定義輸出變數初始值
red1= 1′回b0; yellow1= 1′b0; green1= 1′b0;
red2= 1′b0; yellow2= 1′b0; green2= 1′b0;
這部分需要用答
if(reset)
begin
red1= 1′b0; yellow1= 1′b0; green1= 1′b0;
red2= 1′b0; yellow2= 1′b0; green2= 1′b0;
end
else....
『玖』 verilog HDL交通燈設計中各模塊的原理及作用
traffic(clk,urgency,east_west,south_north,led);
input clk;
input urgency;
output [7:0]east_west,south_north;
output [5:0]led;
reg [7:0]east_west,south_north;
reg [5:0]led;
initial begin
east_west<=8'b0;
south_north<=8'b0;
led<=6'b100001;end
always @(posedge clk)
begin if(urgency==1) led<=6'b100100;
else if(east_west==8'b0 && south_north==8'b0) begin
east_west<=8'b00101101;
south_north<=8'b00101000;
led<=6'b100001;end
else if(east_west==8'b00000110 && south_north==8'b1) begin
east_west<=8'b00000101;
south_north<=8'b00000101;
led<=6'b100010; end
else if(east_west==8'b1 && south_north==8'b1 && led[5]==1'b1) begin
east_west<=8'b00101000;
south_north<=8'b00101101;
led<=6'b001100; end
else if(east_west==8'b1 && south_north==8'b00000110) begin
east_west<=8'b00000101;
south_north<=8'b00000101;
led<=6'b010100;end
else if(east_west==8'b1 && south_north==8'b1 && led[2]==1'b1) begin
east_west<=8'b00101101;
south_north<=8'b00101000;
led<=6'b100001; end
else if(east_west[3:0]==4'b0000) begin
east_west<=east_west-8'b111;
south_north<=south_north-1'b1; end
else if(south_north[3:0]==4'b0000) begin
east_west<=east_west-1'b1;
south_north<=south_north-8'b111; end
else begin
east_west<=east_west-1'b1;
south_north<=south_north-1'b1;
end
end
endmole
自己前段時間寫的簡單交通燈控制模塊。定義了兩個輸入,三個輸出。兩個輸入分別是時鍾信號和緊急情況信號。輸出信號分別是南北,東西,以及led燈信號。具體實現方式是先給緊急情況下定義個狀態,然後通過計數器來實現各個狀態的改變。