習題8 #第8章 Verilog有限狀態機設計-4 #Verilog #Quartus #modelsim
阿新 • • 發佈:2020-10-14
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-144 //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 35state<=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上皆可驗證正確。期待更好的解法。