习题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所示:

习题8 #第8章 Verilog有限状态机设计-4 #Verilog #Quartus #modelsim

 

   图ex8_4_1 交通灯控制器仿真结果

4.5  总结:交通灯控制器这个电路的状态转换挺简单,题目里已经详细列出。难在每种状态持续时间不一样,这是跟前面的序列检测不同的地               方。按照上述设计,在Quartus里未生成状态转换图,仿真和DE2-115上皆可验证正确。期待更好的解法。 

上一篇:Shaass and Lights CodeForces - 294C


下一篇:设计模式——命令模式