当前位置:   article > 正文

基于FPGA的交通灯设计(加强版,涵盖倒计时)_12mhz分频成1hz

12mhz分频成1hz

##一、实验任务要求

adaf8de744ca489e930a646331da4efb.png

 

1)实现一交通十字路口处红绿灯的基本定时控制功能,要求东西方向灯色循环为绿灯45秒,黄灯5秒,左拐灯15秒,黄灯5秒,红灯40秒,黄灯5秒;南北方向灯色循环为红灯65秒,黄灯5秒,绿灯20秒,黄灯5秒,左拐灯15秒,黄灯5秒。

2)实现东西方向和南北方向各种灯的倒计时数码显示功能。

 

##二、LED分模块设计(用于调用使用)

  1. module LED (seg_data_1,seg_data_2,seg_led_1,seg_led_2);
  2. input [3:0] seg_data_1; //数码管需要显示0~9十个数字,所以最少需要4位输入做译码
  3. input [3:0] seg_data_2; //小脚丫上第二个数码管
  4. output [8:0] seg_led_1; //在小脚丫上控制一个数码管需要9个信号 MSB~LSB=DIG、DP、G、F、E、D、C、B、A
  5. output [8:0] seg_led_2; //在小脚丫上第二个数码管的控制信号 MSB~LSB=DIG、DP、G、F、E、D、C、B、A
  6. reg [8:0] seg [9:0]; //定义了一个reg型的数组变量,相当于一个10*9的存储器,存储器一共有10个数,每个数有9位宽
  7. initial //在过程块中只能给reg型变量赋值,Verilog中有两种过程块always和initial
  8. //initial和always不同,其中语句只执行一次
  9. begin
  10. seg[0] = 9'h3f; //对存储器中第一个数赋值9'b00_0011_1111,相当于共阴极接地,DP点变低不亮,7段显示数字 0
  11. seg[1] = 9'h06; //7段显示数字 1
  12. seg[2] = 9'h5b; //7段显示数字 2
  13. seg[3] = 9'h4f; //7段显示数字 3
  14. seg[4] = 9'h66; //7段显示数字 4
  15. seg[5] = 9'h6d; //7段显示数字 5
  16. seg[6] = 9'h7d; //7段显示数字 6
  17. seg[7] = 9'h07; //7段显示数字 7
  18. seg[8] = 9'h7f; //7段显示数字 8
  19. seg[9] = 9'h6f; //7段显示数字 9
  20. end
  21. assign seg_led_1 = seg[seg_data_1]; //连续赋值,这样输入不同四位数,就能输出对于译码的9位输出
  22. assign seg_led_2 = seg[seg_data_2];
  23. endmodule

##三、主程序代码

  1. module traffic1(Clk_12M,Rst,LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2,Seg7_VH,Seg7_VL,led15,led16,led17,ledCntDis);
  2. parameter S0 = 0; //主路绿灯,支路红灯
  3. parameter S1 = 1; //主路黄灯,支路红灯
  4. parameter S2 = 2; //主路蓝灯,支路红灯
  5. parameter S3 = 3; //主路黄灯,支路黄灯
  6. parameter S4 = 4; //主路红灯,支路绿灯
  7. parameter S5 = 5; //主路红灯,支路黄灯
  8. parameter S6 = 6; //主路红灯,支路蓝灯
  9. parameter S7 = 7; //主路黄灯,支路黄灯
  10. input Clk_12M,Rst;
  11. output LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2;
  12. output [8:0]Seg7_VH,Seg7_VL;
  13. output led15,led16,led17;
  14. reg LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2;
  15. reg Clk_1Hz;//分频器
  16. reg [31:0]Cnt_1Hz;//计数器
  17. output reg[3:0] ledCntDis;

该模块是一个交通信号灯的Verilog描述,通过控制LED灯和数码管来显示不同的交通信号状态。以下是对该模块的解释:

输入:
- Clk_12M:12MHz的时钟信号
- Rst:复位信号

输出:
- LedR_1, LedG_1, LedB_1:控制第一个交通信号灯的红、绿、蓝LED灯
- LedR_2, LedG_2, LedB_2:控制第二个交通信号灯的红、绿、蓝LED灯
- Seg7_VH, Seg7_VL:控制数码管显示的高位和低位数码
- led15, led16, led17:辅助LED灯输出
- ledCntDis:控制数码管显示的计数器输出

内部变量:
- Clk_1Hz:1Hz的时钟信号,通过分频器实现
- Cnt_1Hz:1Hz的计数器,用于控制信号灯状态的切换

参数:
- S0-S7:交通信号灯的不同状态,例如S0表示主路绿灯,支路红灯

该模块通过时钟信号进行节拍控制,通过状态机的方式实现交通信号灯的循环切换。通过适时改变LED灯和数码管的输出,实现不同状态下的交通信号显示。具体的状态与信号灯显示对应关系是根据参数定义的。

在每个时钟周期,计数器Cnt_1Hz会自增,并根据计数器的值切换交通信号灯的状态和LED灯的输出。同时,数码管和辅助LED灯也会根据需要进行相应的显示。

需要注意的是,该模块中的LedR_1, LedG_1等输出信号使用reg声明,表示它们是可寄存器的输出信号。

 

 

  1. /*分频器模块*/
  2. always@(posedge Clk_12M or negedge Rst)
  3. begin
  4. if(!Rst)
  5. begin
  6. Cnt_1Hz<=1;
  7. Clk_1Hz<=1; //分频器和计数器全部设置为初值1
  8. end
  9. else
  10. begin
  11. if(Cnt_1Hz>=6000000)//当计数器大于等于2510的六次方
  12. begin
  13. Cnt_1Hz<=1;//计数器置一
  14. Clk_1Hz<=~Clk_1Hz;//分频器取反
  15. end
  16. else
  17. Cnt_1Hz<=Cnt_1Hz+1;
  18. end
  19. end

这部分代码描述了一个分频器模块,用于将输入的12MHz时钟信号分频为1Hz的信号。以下是对代码的解释:

在`always @(posedge Clk_12M or negedge Rst)`的敏感列表中,当输入的时钟信号Clk_12M上升沿或复位信号Rst的下降沿发生时,会执行下面的代码块。

根据复位信号Rst的状态,通过if-else语句进行条件判断和处理:
- 如果复位信号Rst为低电平(即复位有效),则在分频器和计数器的初值都设置为1,表示初始状态。
- 如果复位信号Rst为高电平(即复位无效),则执行下面的逻辑。

在非复位状态下,判断计数器Cnt_1Hz是否大于等于6000000(即25 * 10^6),如果是,则表示达到了1Hz的分频要求:
- 将计数器Cnt_1Hz重新置为1。
- 将分频器Clk_1Hz取反,实现1Hz的方波输出。

如果计数器Cnt_1Hz未达到指定值,则将计数器的值加1。

通过这段代码,实现了将12MHz时钟信号分频为1Hz的功能,并且保持了分频器和计数器的状态在复位前后的一致性。分频器的输出Clk_1Hz可以作为其他模块中需要1Hz时钟信号的输入。
 

  1. /*计数器模块*/
  2. reg[7:0]Cnt70;//用于控制灯的变换
  3. always@(posedge Clk_1Hz or negedge Rst)
  4. begin
  5. if(!Rst)
  6. begin
  7. Cnt70<=0;
  8. end
  9. else
  10. begin
  11. if(Cnt70>=115)
  12. begin
  13. Cnt70<=0;//复位
  14. end
  15. else
  16. Cnt70<=Cnt70+1;
  17. end
  18. end
  19. /*计数器模块*/
  20. reg[7:0]Cnt10;//用于控制数码管的变换
  21. always@(posedge Clk_1Hz or negedge Rst)
  22. begin
  23. if(!Rst)
  24. begin
  25. Cnt10<=115;
  26. end
  27. else
  28. begin
  29. if(Cnt10<=0)
  30. begin
  31. Cnt10<=115;//复位
  32. end
  33. else
  34. Cnt10<=Cnt10-1;
  35. end
  36. end

这部分代码描述了两个计数器模块,分别用于计数到特定的值并进行复位操作。以下是对这两个代码块的解释:

第一个计数器模块:
- 声明了一个8位的寄存器变量Cnt70用于计数。
- 在`always @(posedge Clk_1Hz or negedge Rst)`的敏感列表中,当输入的时钟信号Clk_1Hz上升沿或复位信号Rst的下降沿发生时,会执行下面的代码块。
- 如果复位信号Rst为低电平(即复位有效),则将计数器Cnt70置为0。
- 如果复位信号Rst为高电平(即复位无效),则判断计数器Cnt70是否大于等于115。如果是,表示计数器已经达到了指定的值,将计数器Cnt70复位为0。
- 如果计数器Cnt70未达到指定值,则将计数器的值加1。

第二个计数器模块:
- 同样,声明了一个8位的寄存器变量Cnt10用于计数。
- 在`always @(posedge Clk_1Hz or negedge Rst)`的敏感列表中,当输入的时钟信号Clk_1Hz上升沿或复位信号Rst的下降沿发生时,会执行下面的代码块。
- 如果复位信号Rst为低电平(即复位有效),则将计数器Cnt10置为115。
- 如果复位信号Rst为高电平(即复位无效),则判断计数器Cnt10是否小于等于0。如果是,表示计数器已经减到了指定的值,将计数器Cnt10复位为115。
- 如果计数器Cnt10未减到指定值,则将计数器的值减1。

通过这两个计数器模块,可以实现对计数值的控制和复位操作。这些计数器可用于控制特定时间、时序或事件需要的计数和复位功能。

 

  1. /*数码管模块*/
  2. reg[7:0]CntDis;
  3. reg[7:0]Cnt71;
  4. reg [7:0] Cnt61;
  5. always@(posedge Clk_12M)//BCD码转换
  6. begin
  7. if(Cnt10>70)
  8. begin
  9. Cnt71[7:0]<=(Cnt10-70)/10;
  10. CntDis[7:4]<=Cnt71[3:0];
  11. Cnt61[7:0]<=Cnt10-((Cnt10-70)/10)*10-70;
  12. CntDis[3:0]<=Cnt61[3:0];
  13. end
  14. else if (Cnt10>65)
  15. begin
  16. Cnt71[7:0]<=(Cnt10-65)/10;
  17. CntDis[7:4]<=Cnt71[3:0];
  18. Cnt61[7:0]<=Cnt10-((Cnt10-65)/10)*10-65;
  19. CntDis[3:0]<=Cnt61[3:0];
  20. end
  21. else if (Cnt10>50)
  22. begin
  23. Cnt71[7:0]<=(Cnt10-50)/10;
  24. CntDis[7:4]<=Cnt71[3:0];
  25. Cnt61[7:0]<=Cnt10-((Cnt10-50)/10)*10-50;
  26. CntDis[3:0]<=Cnt61[3:0];
  27. end
  28. else if (Cnt10>45)
  29. begin
  30. Cnt71[7:0]<=(Cnt10-45)/10;
  31. CntDis[7:4]<=Cnt71[3:0];
  32. Cnt61[7:0]<=Cnt10-((Cnt10-45)/10)*10-45;
  33. CntDis[3:0]<=Cnt61[3:0];
  34. end
  35. else if (Cnt10>25)
  36. begin
  37. Cnt71[7:0]<=(Cnt10-25)/10;
  38. CntDis[7:4]<=Cnt71[3:0];
  39. Cnt61[7:0]<=Cnt10-((Cnt10-25)/10)*10-25;
  40. CntDis[3:0]<=Cnt61[3:0];
  41. end
  42. else if (Cnt10>20)
  43. begin
  44. Cnt71[7:0]<=(Cnt10-20)/10;
  45. CntDis[7:4]<=Cnt71[3:0];
  46. Cnt61[7:0]<=Cnt10-((Cnt10-20)/10)*10-20;
  47. CntDis[3:0]<=Cnt61[3:0];
  48. end
  49. else if (Cnt10>5)
  50. begin
  51. Cnt71[7:0]<=(Cnt10-5)/10;
  52. CntDis[7:4]<=Cnt71[3:0];
  53. Cnt61[7:0]<=Cnt10-((Cnt10-5)/10)*10-5;
  54. CntDis[3:0]<=Cnt61[3:0];
  55. end
  56. else if (Cnt10>0)
  57. begin
  58. Cnt71[7:0]<=Cnt10/10;
  59. CntDis[7:4]<=Cnt71[3:0];
  60. Cnt61[7:0]<=Cnt10;
  61. CntDis[3:0]<=Cnt61[3:0];
  62. end
  63. end
  64. always@(posedge Clk_12M)
  65. begin
  66. ledCntDis<=CntDis[3:0];
  67. end
  68. //数码管调用实例
  69. LED hex(CntDis[3:0],CntDis[7:4],Seg7_VL,Seg7_VH);

这部分代码描述了一个数码管模块,它用于将计数器的值转换为BCD码,并将BCD码通过数码管进行显示。以下是对代码的解释:

在第一个always块中,通过对12MHz时钟信号Clk_12M的上升沿进行敏感监听,实现对计数器Cnt10值的转换和BCD码的生成。
- 根据不同的计数范围,将Cnt10的值减去一个基准并除以10,得到一个高位数。
- 通过减法、除法和取余运算,计算得到一个低位数。
- 通过赋值操作,将高位数和低位数分别存储到CntDis的7:4位和3:0位。

在第二个always块中,对12MHz时钟信号Clk_12M的上升沿进行敏感监听,将CntDis的低4位赋值给ledCntDis。这样,ledCntDis可以作为控制数码管显示的信号,通过连接到相应的LED显示模块。

最后,通过实例化一个名为hex的LED模块,将CntDis的3:0位和7:4位分别连接到Seg7_VL和Seg7_VH输入,从而实现数码管的显示。

通过这段代码,可以将计数器的值转换为BCD码,并通过数码管进行显示,实现实时的数值显示功能。

 

  1. //状态转换
  2. reg [2:0] state;
  3. always@(posedge Clk_12M or negedge Rst)
  4. begin
  5. if(!Rst)
  6. begin
  7. LedR_1<=0;
  8. LedG_1<=0;
  9. LedB_1<=0;
  10. LedR_2<=0;
  11. LedG_2<=0;
  12. LedB_2<=0;
  13. end
  14. else
  15. begin
  16. case(state)
  17. S0://主路绿灯45s
  18. begin
  19. if(Cnt70<=45)
  20. begin
  21. LedR_1<=1;
  22. LedG_1<=0;
  23. LedB_1<=1;
  24. LedR_2<=0;
  25. LedG_2<=1;
  26. LedB_2<=1;
  27. end
  28. else
  29. state<=S1;
  30. end
  31. S1://主路黄灯5s
  32. begin
  33. if(Cnt70<=50)
  34. begin
  35. LedR_1<=0;
  36. LedG_1<=0;
  37. LedB_1<=1;
  38. LedR_2<=0;
  39. LedG_2<=1;
  40. LedB_2<=1;
  41. end
  42. else
  43. state<=S2;
  44. end
  45. S2://主路蓝灯15s
  46. begin
  47. if(Cnt70<=65)
  48. begin
  49. LedR_1<=1;
  50. LedG_1<=1;
  51. LedB_1<=0;
  52. LedR_2<=0;
  53. LedG_2<=1;
  54. LedB_2<=1;
  55. end
  56. else
  57. state<=S3;
  58. end
  59. S3://主辅均5s黄
  60. begin
  61. if(Cnt70<=70)
  62. begin
  63. LedR_1<=0;
  64. LedG_1<=0;
  65. LedB_1<=1;
  66. LedR_2<=0;
  67. LedG_2<=0;
  68. LedB_2<=1;
  69. end
  70. else
  71. state<=S4;
  72. end
  73. S4://辅路绿20s
  74. begin
  75. if(Cnt70<=90)
  76. begin
  77. LedR_1<=0;
  78. LedG_1<=1;
  79. LedB_1<=1;
  80. LedR_2<=1;
  81. LedG_2<=0;
  82. LedB_2<=1;
  83. end
  84. else
  85. state<=S5;
  86. end
  87. S5://辅路黄灯5s
  88. begin
  89. if(Cnt70<=95)
  90. begin
  91. LedR_1<=0;
  92. LedG_1<=1;
  93. LedB_1<=1;
  94. LedR_2<=0;
  95. LedG_2<=0;
  96. LedB_2<=1;
  97. end
  98. else
  99. state<=S6;
  100. end
  101. S6://辅路蓝灯15s
  102. begin
  103. if(Cnt70<=110)
  104. begin
  105. LedR_1<=0;
  106. LedG_1<=1;
  107. LedB_1<=1;
  108. LedR_2<=1;
  109. LedG_2<=1;
  110. LedB_2<=0;
  111. end
  112. else
  113. state<=S7;
  114. end
  115. S7://主辅路均黄灯5s
  116. begin
  117. if(Cnt70>=111)
  118. begin
  119. LedR_1<=0;
  120. LedG_1<=0;
  121. LedB_1<=1;
  122. LedR_2<=0;
  123. LedG_2<=0;
  124. LedB_2<=1;
  125. end
  126. else
  127. state<=S0;
  128. end
  129. default
  130. begin
  131. LedR_1<=0;
  132. LedG_1<=0;
  133. LedB_1<=0;
  134. LedR_2<=0;
  135. LedG_2<=0;
  136. LedB_2<=0;
  137. end
  138. endcase
  139. end
  140. end
  141. assign {led17,led16,led15}=state;
  142. endmodule

这段代码是一个用Verilog描述的状态转换逻辑。它根据时钟信号和复位信号来控制LED灯的状态。具体逻辑如下:

1. 如果复位信号(Rst)为低电平,则将所有LED灯的状态置为0。
2. 如果复位信号为高电平,则根据当前的状态(state)执行相应的操作。
3. 当前有三种状态(S0、S1、S2),对应不同的灯光控制逻辑。
   - S0状态:主路绿灯亮,持续45s。
   - S1状态:主路黄灯亮,持续5s。
   - S2状态:其他状态,可以在代码中后续定义。
        如此下去直到进行循环。

具体的操作是根据一个计数器(Cnt70)来控制。当计数器的值小于等于给定的时间时,对应的LED灯亮起;否则,切换到下一个状态。

这段代码中只给出了S0和S1两个状态的逻辑,你可以继续补充其他状态的实现。另外,根据你的具体需求,你可能还需要定义和使用一些其他变量和逻辑来实现完整的状态转换控制。

 

  1. module traffic1(Clk_12M,Rst,LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2,Seg7_VH,Seg7_VL,led15,led16,led17,ledCntDis);
  2. parameter S0 = 0; //主路绿灯,支路红灯
  3. parameter S1 = 1; //主路黄灯,支路红灯
  4. parameter S2 = 2; //主路蓝灯,支路红灯
  5. parameter S3 = 3; //主路黄灯,支路黄灯
  6. parameter S4 = 4; //主路红灯,支路绿灯
  7. parameter S5 = 5; //主路红灯,支路黄灯
  8. parameter S6 = 6; //主路红灯,支路蓝灯
  9. parameter S7 = 7; //主路黄灯,支路黄灯
  10. input Clk_12M,Rst;
  11. output LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2;
  12. output [8:0]Seg7_VH,Seg7_VL;
  13. output led15,led16,led17;
  14. reg LedR_1,LedG_1,LedB_1,LedR_2,LedG_2,LedB_2;
  15. reg Clk_1Hz;//分频器
  16. reg [31:0]Cnt_1Hz;//计数器
  17. output reg[3:0] ledCntDis;
  18. /*分频器模块*/
  19. always@(posedge Clk_12M or negedge Rst)
  20. begin
  21. if(!Rst)
  22. begin
  23. Cnt_1Hz<=1;
  24. Clk_1Hz<=1; //分频器和计数器全部设置为初值1
  25. end
  26. else
  27. begin
  28. if(Cnt_1Hz>=6000000)//当计数器大于等于2510的六次方
  29. begin
  30. Cnt_1Hz<=1;//计数器置一
  31. Clk_1Hz<=~Clk_1Hz;//分频器取反
  32. end
  33. else
  34. Cnt_1Hz<=Cnt_1Hz+1;
  35. end
  36. end
  37. /*计数器模块*/
  38. reg[7:0]Cnt70;
  39. always@(posedge Clk_1Hz or negedge Rst)
  40. begin
  41. if(!Rst)
  42. begin
  43. Cnt70<=0;
  44. end
  45. else
  46. begin
  47. if(Cnt70>=115)
  48. begin
  49. Cnt70<=0;//复位
  50. end
  51. else
  52. Cnt70<=Cnt70+1;
  53. end
  54. end
  55. /*计数器模块*/
  56. reg[7:0]Cnt10;
  57. always@(posedge Clk_1Hz or negedge Rst)
  58. begin
  59. if(!Rst)
  60. begin
  61. Cnt10<=115;
  62. end
  63. else
  64. begin
  65. if(Cnt10<=0)
  66. begin
  67. Cnt10<=115;//复位
  68. end
  69. else
  70. Cnt10<=Cnt10-1;
  71. end
  72. end
  73. /*数码管模块*/
  74. reg[7:0]CntDis;
  75. reg[7:0]Cnt71;
  76. reg [7:0] Cnt61;
  77. always@(posedge Clk_12M)//BCD码转换
  78. begin
  79. if(Cnt10>70)
  80. begin
  81. Cnt71[7:0]<=(Cnt10-70)/10;
  82. CntDis[7:4]<=Cnt71[3:0];
  83. Cnt61[7:0]<=Cnt10-((Cnt10-70)/10)*10-70;
  84. CntDis[3:0]<=Cnt61[3:0];
  85. end
  86. else if (Cnt10>65)
  87. begin
  88. Cnt71[7:0]<=(Cnt10-65)/10;
  89. CntDis[7:4]<=Cnt71[3:0];
  90. Cnt61[7:0]<=Cnt10-((Cnt10-65)/10)*10-65;
  91. CntDis[3:0]<=Cnt61[3:0];
  92. end
  93. else if (Cnt10>50)
  94. begin
  95. Cnt71[7:0]<=(Cnt10-50)/10;
  96. CntDis[7:4]<=Cnt71[3:0];
  97. Cnt61[7:0]<=Cnt10-((Cnt10-50)/10)*10-50;
  98. CntDis[3:0]<=Cnt61[3:0];
  99. end
  100. else if (Cnt10>45)
  101. begin
  102. Cnt71[7:0]<=(Cnt10-45)/10;
  103. CntDis[7:4]<=Cnt71[3:0];
  104. Cnt61[7:0]<=Cnt10-((Cnt10-45)/10)*10-45;
  105. CntDis[3:0]<=Cnt61[3:0];
  106. end
  107. else if (Cnt10>25)
  108. begin
  109. Cnt71[7:0]<=(Cnt10-25)/10;
  110. CntDis[7:4]<=Cnt71[3:0];
  111. Cnt61[7:0]<=Cnt10-((Cnt10-25)/10)*10-25;
  112. CntDis[3:0]<=Cnt61[3:0];
  113. end
  114. else if (Cnt10>20)
  115. begin
  116. Cnt71[7:0]<=(Cnt10-20)/10;
  117. CntDis[7:4]<=Cnt71[3:0];
  118. Cnt61[7:0]<=Cnt10-((Cnt10-20)/10)*10-20;
  119. CntDis[3:0]<=Cnt61[3:0];
  120. end
  121. else if (Cnt10>5)
  122. begin
  123. Cnt71[7:0]<=(Cnt10-5)/10;
  124. CntDis[7:4]<=Cnt71[3:0];
  125. Cnt61[7:0]<=Cnt10-((Cnt10-5)/10)*10-5;
  126. CntDis[3:0]<=Cnt61[3:0];
  127. end
  128. else if (Cnt10>0)
  129. begin
  130. Cnt71[7:0]<=Cnt10/10;
  131. CntDis[7:4]<=Cnt71[3:0];
  132. Cnt61[7:0]<=Cnt10;
  133. CntDis[3:0]<=Cnt61[3:0];
  134. end
  135. end
  136. always@(posedge Clk_12M)
  137. begin
  138. ledCntDis<=CntDis[3:0];
  139. end
  140. //数码管调用实例
  141. LED hex(CntDis[3:0],CntDis[7:4],Seg7_VL,Seg7_VH);
  142. //状态转换
  143. reg [2:0] state;
  144. always@(posedge Clk_12M or negedge Rst)
  145. begin
  146. if(!Rst)
  147. begin
  148. LedR_1<=0;
  149. LedG_1<=0;
  150. LedB_1<=0;
  151. LedR_2<=0;
  152. LedG_2<=0;
  153. LedB_2<=0;
  154. end
  155. else
  156. begin
  157. case(state)
  158. S0://主路绿灯45s
  159. begin
  160. if(Cnt70<=45)
  161. begin
  162. LedR_1<=1;
  163. LedG_1<=0;
  164. LedB_1<=1;
  165. LedR_2<=0;
  166. LedG_2<=1;
  167. LedB_2<=1;
  168. end
  169. else
  170. state<=S1;
  171. end
  172. S1://主路黄灯5s
  173. begin
  174. if(Cnt70<=50)
  175. begin
  176. LedR_1<=0;
  177. LedG_1<=0;
  178. LedB_1<=1;
  179. LedR_2<=0;
  180. LedG_2<=1;
  181. LedB_2<=1;
  182. end
  183. else
  184. state<=S2;
  185. end
  186. S2://主路蓝灯15s
  187. begin
  188. if(Cnt70<=65)
  189. begin
  190. LedR_1<=1;
  191. LedG_1<=1;
  192. LedB_1<=0;
  193. LedR_2<=0;
  194. LedG_2<=1;
  195. LedB_2<=1;
  196. end
  197. else
  198. state<=S3;
  199. end
  200. S3://主辅均5s黄
  201. begin
  202. if(Cnt70<=70)
  203. begin
  204. LedR_1<=0;
  205. LedG_1<=0;
  206. LedB_1<=1;
  207. LedR_2<=0;
  208. LedG_2<=0;
  209. LedB_2<=1;
  210. end
  211. else
  212. state<=S4;
  213. end
  214. S4://辅路绿20s
  215. begin
  216. if(Cnt70<=90)
  217. begin
  218. LedR_1<=0;
  219. LedG_1<=1;
  220. LedB_1<=1;
  221. LedR_2<=1;
  222. LedG_2<=0;
  223. LedB_2<=1;
  224. end
  225. else
  226. state<=S5;
  227. end
  228. S5://辅路黄灯5s
  229. begin
  230. if(Cnt70<=95)
  231. begin
  232. LedR_1<=0;
  233. LedG_1<=1;
  234. LedB_1<=1;
  235. LedR_2<=0;
  236. LedG_2<=0;
  237. LedB_2<=1;
  238. end
  239. else
  240. state<=S6;
  241. end
  242. S6://辅路蓝灯15s
  243. begin
  244. if(Cnt70<=110)
  245. begin
  246. LedR_1<=0;
  247. LedG_1<=1;
  248. LedB_1<=1;
  249. LedR_2<=1;
  250. LedG_2<=1;
  251. LedB_2<=0;
  252. end
  253. else
  254. state<=S7;
  255. end
  256. S7://主辅路均黄灯5s
  257. begin
  258. if(Cnt70>=111)
  259. begin
  260. LedR_1<=0;
  261. LedG_1<=0;
  262. LedB_1<=1;
  263. LedR_2<=0;
  264. LedG_2<=0;
  265. LedB_2<=1;
  266. end
  267. else
  268. state<=S0;
  269. end
  270. default
  271. begin
  272. LedR_1<=0;
  273. LedG_1<=0;
  274. LedB_1<=0;
  275. LedR_2<=0;
  276. LedG_2<=0;
  277. LedB_2<=0;
  278. end
  279. endcase
  280. end
  281. end
  282. assign {led17,led16,led15}=state;
  283. endmodule

以上是程序总代码。

 

##四、运行结果展示

FGPA交通灯展示

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/702142
推荐阅读
相关标签
  

闽ICP备14008679号