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上皆可验证正确。期待更好的解法。