1. 程式人生 > 實用技巧 >習題8 #第8章 Verilog有限狀態機設計-4 #Verilog #Quartus #modelsim

習題8 #第8章 Verilog有限狀態機設計-4 #Verilog #Quartus #modelsim

4.用狀態機設計交通燈控制器,設計要求:A路和B路,每路都有紅、黃、綠三種燈,持續時間為:紅燈45s,黃燈5s,綠燈40秒。

A路和B路燈的狀態轉換是:

(1) A紅,B綠(持續時間40s);

(2) A紅,B黃(持續時間5s);

(1) A綠,B紅(持續時間40s);

(1) A綠,B黃(持續時間5s);

4.1設計思路:

由題知共4個狀態,每個狀態及其輸出持續的時間分別為40s或5秒。故設計一個模為90的計數器,分4段,對應每個狀態持續的

時間,然後順序迴圈。

4.2兩路交通燈控制電路原始碼如下:

 1 //triffic lights
 2 //ex8_4
 3 //2020-10-14
4 //by YongFengXie 5 module ex8_4(clk,rst_n,lights); 6 input clk; 7 input rst_n; 8 output reg [5:0] lights; //A and B light 9 10 reg [6:0] cnt; // counter 90 11 reg [3:0] state; 12 13 parameter s0=4'b0001,s1=4'b0010,s2=4'b0100, 14 s3=4'b1000; 15 16 always @(posedge clk or negedge rst_n) 17 begin 18 if
(!rst_n) 19 cnt<=7'd0; 20 else if(cnt<7'd90) 21 cnt<=cnt+1'b1; 22 else 23 cnt<=7'd0; 24 end 25 26 always @(posedge clk or negedge rst_n) 27 begin 28 if(!rst_n) 29 begin 30 state<=s0; 31 lights<=6'b100_001; 32 end 33 else if(cnt<7'd40) 34 begin 35
state<=s0; 36 lights<=6'b100_001; //RYG(A)_RYG(B) 37 end 38 else if(cnt>7'd39 &&cnt<7'd45) 39 begin 40 state<=s1; 41 lights<=6'b100_010; //RYG(A)_RYG(B) 42 end 43 else if(cnt>7'd44 && cnt<7'd85) 44 begin 45 state<=s2; 46 lights<=6'b001_100; //RYG(A)_RYG(B) 47 end 48 else 49 begin 50 state<=s3; 51 lights<=6'b001_010; //RYG(A)_RYG(B) 52 end 53 end 54 55 endmodule

4.3交通燈控制器的測試程式碼:

 1 //ex8_4 testbench
 2 //2020-10-14
 3 //by YongFengXie
 4 `timescale 1ns/1ns
 5 module ex8_4tb;
 6 reg clk;
 7 reg rst_n;
 8 wire [5:0] lights;
 9 
10 ex8_4 ub(clk,rst_n,lights);
11 
12 initial begin
13           clk=1'b0;
14           rst_n=1'b0;
15           #20 rst_n=1'b1;
16           #1000 $stop;
17         end
18 
19 always #5 clk=~clk;
20 
21 endmodule 

4.4交通燈控制器的模擬結果如圖ex8_4_1所示:

圖ex8_4_1交通燈控制器模擬結果

4.5 總結:交通燈控制器這個電路的狀態轉換挺簡單,題目裡已經詳細列出。難在每種狀態持續時間不一樣,這是跟前面的序列檢測不同的地 方。按照上述設計,在Quartus裡未生成狀態轉換圖,模擬和DE2-115上皆可驗證正確。期待更好的解法。