当前位置:   article > 正文

Verilog实现交通灯(数电课设)----------旧_verilog交通灯课程设计

verilog交通灯课程设计

这里是新写的交通灯Verilog实现交通灯(数电课设)----------新:https://blog.csdn.net/qq_41467882/article/details/86626507

里边又两个核心代码和数码管显示的新方法及对状态机的新理解。。

参考思路:https://www.cnblogs.com/christsong/p/5629643.html

里边有思路框架,可以用来参考。

设计要求:

1,交通灯可以自行转换状态,红黄绿灯分别进行,绿灯转红灯需要五秒的黄灯作为延时

2,可以暂停红黄绿灯的计数

3,可以进入紧急制动状态(红灯全部亮)

4,倒计时显示在数码管上,六个led分别代表红黄绿灯。

第一种方法

设计思路:

状态机的运用,状态的转换,用的basys2板子

模块介绍(代码的书写)

分频模块:

  1. module fenpin(clk,rst_n,clk1
  2. );
  3. input clk;//系统时钟
  4. output reg clk1;//分频后的时钟
  5. input rst_n;//复位信号
  6. reg [25:0] cnt;
  7. always@(posedge clk or negedge rst_n)
  8. begin
  9. if(!rst_n)
  10. cnt <= 0;
  11. else if(cnt==26'd24_999_999)//当cnt为24_999_999的时候,重新计数并且将clk1反转
  12. begin
  13. cnt <= 0;
  14. clk1 <= ~clk1;
  15. end
  16. else
  17. cnt <= cnt + 1'b1;
  18. end
  19. endmodule

很简单的一个分频模块,系统时钟为50mhz,分频后周期为1s。

数码管动态显示模块:

  1. module xianshi(
  2. input clk,
  3. input rst_n,
  4. input [7:0] B,
  5. input [7:0] A,
  6. output reg [6:0]Y,//显示器段选
  7. output reg [3:0]an,//显示器位选
  8. output reg dp
  9. );
  10. parameter AB=18'd300000;
  11. reg[17:0] cnt;//动态扫描计数器
  12. //这个时间其实可以自己控制,只要在人眼不能观察到间隔就行
  13. always@(posedge clk or negedge rst_n)
  14. if(!rst_n)
  15. cnt<=1'b0;
  16. else if (cnt==AB-1)
  17. cnt<=1'b0;
  18. else cnt<=cnt+1;
  19. /*动态扫描 选择要显示的数码管(第一个要显示),当速度快到人眼无法区分的时候就是“所有”数码管一//起显示了*/
  20. reg[3:0]digit;//定义一个储存要显示数据的寄存器
  21. always@(posedge clk or negedge rst_n)
  22. begin
  23. if(!rst_n) begin
  24. an<=4'b1110;
  25. dp<= 0;
  26. end
  27. else if(cnt==AB-1) begin
  28. an<={an[0],an[3:1]};
  29. dp <= 1'b1;
  30. end
  31. end
  32. //当某一个数码管被点亮的时候,赋予其对应位置的数据
  33. always@(posedge clk or negedge rst_n)
  34. begin
  35. if(!rst_n)
  36. digit<=4'b1111;
  37. else if(an==4'b1110)
  38. digit<=B[3:0];
  39. else if(an==4'b1101)
  40. digit<=B[7:4];
  41. else if(an==4'b1011)
  42. digit<=A[3:0];
  43. else if(an==4'b0111)
  44. digit<=A[7:4];
  45. end
  46. //七段译码器(显示器)
  47. always@(*)
  48. begin
  49. case(digit)
  50. 4'b0000:Y<=7'b0000001;
  51. 4'b0001:Y<=7'b1001111;
  52. 4'b0010:Y<=7'b0010010;
  53. 4'b0011:Y<=7'b0000110;
  54. 4'b0100:Y<=7'b1001100;
  55. 4'b0101:Y<=7'b0100100;
  56. 4'b0110:Y<=7'b0100000;
  57. 4'b0111:Y<=7'b0001111;
  58. 4'b1000:Y<=7'b0000000;
  59. 4'b1001:Y<=7'b0000100;
  60. default Y<=7'b0000001;
  61. endcase
  62. end
  63. endmodule

数码管显示需要进行段选和位选,具体解释位于上述代码

控制模块:

  1. module control(clk,rst_n,ledA,ledB,A,B,en
  2. );
  3. input clk;
  4. input rst_n;
  5. input en;
  6. output reg [2:0] ledA;//控制三个ledA方向
  7. output reg [2:0] ledB;
  8. reg [2:0] stateA;
  9. reg [2:0] stateB;
  10. output reg [7:0] A;
  11. output reg [7:0] B;
  12. parameter redB = 3'b100,greenB = 3'b001,yellowB = 3'b010;
  13. parameter redA = 3'b100,greenA = 3'b001,yellowA = 3'b010;
  14. always @ ( posedge clk or negedge rst_n)
  15. begin
  16. if(!rst_n)
  17. begin
  18. stateA <= 3'b100 ;
  19. A <= 8'b0010_0000;
  20. end
  21. else if(en)
  22. case ( stateA ) //交通灯状态变换
  23. redA :
  24. begin
  25. if(A==0) begin
  26. A <= 8'b0001_0101;
  27. stateA <= greenA;
  28. end
  29. else if(A[3:0] == 0 && !A[7:4] == 0) begin
  30. A[7:4] <= A[7:4] - 1'b1;
  31. A[3:0] <= 4'b1001;
  32. end
  33. else if(!A[3:0] == 0) begin
  34. A[3:0] <= A[3:0] - 1'b1;
  35. end else
  36. stateA <= redA;
  37. end
  38. greenA :
  39. begin
  40. if(A==0) begin
  41. A <= 8'b0000_0100;
  42. stateA <= yellowA;
  43. end
  44. else if(A[3:0] == 0 && !A[7:4] == 0) begin
  45. A[7:4] <= A[7:4] - 1'b1;
  46. A[3:0] <= 4'b1001;
  47. end
  48. else if(!A[3:0] == 0) begin
  49. A[3:0] <= A[3:0] - 1'b1;
  50. end else
  51. stateA <= greenA;
  52. end
  53. yellowA :
  54. begin
  55. if(A==0) begin
  56. A <= 8'b0010_0000;
  57. stateA <= redA;
  58. end
  59. else if(A[3:0] == 0 && !A[7:4] == 0) begin
  60. A[7:4] <= A[7:4] - 1'b1;
  61. A[3:0] <= 4'b1001;
  62. end
  63. else if(!A[3:0] == 0) begin
  64. A[3:0] <= A[3:0] - 1'b1;
  65. end else
  66. stateA <= yellowA;
  67. end
  68. default : stateA <= redA ;
  69. endcase
  70. end
  71. always@(*)
  72. begin
  73. case (stateA)
  74. redA : ledA <= redA;
  75. yellowA : ledA <= yellowA;
  76. greenA : ledA <= greenA;
  77. endcase
  78. end
  79. always @ ( posedge clk or negedge rst_n)
  80. begin
  81. if(!rst_n)
  82. begin
  83. stateB <= 3'b001 ;
  84. B<= 8'b0001_0101;
  85. end
  86. else if(en)
  87. case ( stateB ) //交通灯状态变换
  88. greenB:
  89. begin
  90. if(B==0) begin
  91. B<= 8'b0000_0100;
  92. stateB <= yellowB;
  93. end
  94. else if(B[3:0] == 0 && !B[7:4] == 0) begin
  95. B[7:4] <= B[7:4] - 1'b1;
  96. B[3:0] <= 4'b1001;
  97. end
  98. else if(!B[3:0] == 0) begin
  99. B[3:0] <= B[3:0] - 1'b1;
  100. end else
  101. stateB <= greenB;
  102. end
  103. yellowB:
  104. begin
  105. if(B == 0) begin
  106. B <= 8'b0010_0000;
  107. stateB <= redB;
  108. end
  109. else if(B[3:0] == 0 && !B[7:4] == 0) begin
  110. B[7:4] <= B[7:4] - 1'b1;
  111. B[3:0] <= 4'b1001;
  112. end
  113. else if(!B[3:0] == 0) begin
  114. B[3:0] <= B[3:0] - 1'b1;
  115. end else
  116. stateB <= redB;
  117. end
  118. redB:
  119. begin
  120. if(B == 0) begin
  121. B <= 8'b0001_0101;
  122. stateB <= greenB;
  123. end
  124. else if(B[3:0] == 0 && !B[7:4] == 0) begin
  125. B[7:4] <= B[7:4] - 1'b1;
  126. B[3:0] <= 4'b1001;
  127. end
  128. else if(!B[3:0] == 0) begin
  129. B[3:0] <= B[3:0] - 1'b1;
  130. end else
  131. stateB <= redB;
  132. end
  133. default : stateB <= redB;
  134. endcase
  135. end
  136. always@(*)
  137. begin
  138. case (stateB)
  139. redB: ledB<= redB;
  140. yellowB: ledB<= yellowB;
  141. greenB: ledB<= greenB;
  142. endcase
  143. end
  144. endmodule

具体代码已经粘贴在上边了。简单介绍下我的思路。

通过一个状态机来控制一个红绿灯的亮灭情况,然后倒计时(采用格雷码的形式)掉到0的时候开始进行下一个状态的跳转。但具体实现的时候有一个小bug。在每次黄灯跳转的时候,会有一秒的延时。所以我将每个黄灯的时间改为5s。(具体原因不太清楚)有兴趣可以交流。

top文件:

  1. module new1_top(clk,rst_n,Y,an,ledA,ledB,en,dp
  2. );
  3. input clk;
  4. input rst_n;
  5. input en;
  6. output [2:0] ledA,ledB;
  7. output [6:0] Y;
  8. output [3:0] an;
  9. output dp;
  10. wire clk_1s;
  11. wire [7:0] lineA;
  12. wire [7:0] lineB;
  13. control A(
  14. .clk(clk_1s),
  15. .rst_n(rst_n),
  16. .ledA(ledA),
  17. .ledB(ledB),
  18. .A(lineA),
  19. .B(lineB),
  20. .en(en)
  21. );
  22. fenpin B(
  23. .clk(clk),
  24. .rst_n(rst_n),
  25. .clk1(clk_1s)
  26. );
  27. xianshi C(
  28. .clk(clk),
  29. .rst_n(rst_n),
  30. .B(lineB),
  31. .A(lineA),
  32. .Y(Y),//显示器段选
  33. .an(an),//显示器位选
  34. .dp(dp)
  35. );
  36. endmodule

 

下板子没有问题。可以正常工作。(没有加紧急制动状态,相加的的可以自己加,也很简单)

接下来用一种新的方法写控制模块(没有仿真,下板子,不过应该可以):这里只写控制模块

  1. module control(led,divclk,zhidong,cntA_h,cntA_l,cntB_l,cntB_h,rst
  2. );
  3. input rst;
  4. input divclk;
  5. input zhidong;
  6. output reg [3:0] cntA_h;
  7. output reg [3:0] cntA_l;
  8. output reg [3:0] cntB_h;
  9. output reg [3:0] cntB_l;
  10. output reg [5:0] led;
  11. reg flag;
  12. reg cs,ns;
  13. parameter [1:0] s0=2'd0,s1=2'd1,s2=2'd2,s3=2'd3;
  14. always@(posedge divclk or posedge rst)
  15. if(rst)
  16. cs<=s0;
  17. else
  18. cs<=ns;
  19. always@(*)
  20. begin
  21. case(cs)
  22. s0:ns=flag?s1:s0;
  23. s1:ns=flag?s2:s1;
  24. s2:ns=flag?s3:s2;
  25. s3:ns=flag?s0:s3;
  26. endcase
  27. end
  28. always@(posedge divclk or posedge rst)
  29. begin
  30. if(rst)
  31. begin
  32. cntA_h<=5;
  33. cntA_l<=0;
  34. cntB_h<=4;
  35. cntB_l<=5;
  36. flag<=0;
  37. end
  38. else if(zhidong)
  39. led<=6'b100_100;//A红黄绿B红黄绿
  40. else
  41. case(cs)
  42. s0:begin
  43. flag<=0;
  44. led<=6'b100_001;//Ared Bgreen 45s
  45. if(cntB_h==0&&cntB_l==0) begin
  46. flag<=1;
  47. cntA_h<=0;
  48. cntA_l<=5;
  49. cntB_h<=0;
  50. cntB_l<=5;
  51. end
  52. else if(!cntB_h==0&&cntB_l==0) begin
  53. cntB_h<=cntB_h-1;
  54. cntB_l<=9;
  55. end
  56. else if(!cntA_h==0&&cntA_l==0) begin
  57. cntA_h<=cntA_h-1;
  58. cntA_l<=9;
  59. end
  60. else begin
  61. cntA_l<=cntA_l-1;
  62. cntB_l<=cntB_h-1;
  63. end
  64. end
  65. s1:begin
  66. flag<=0;
  67. led<=6'b100_010;//Ared Byellow 5s
  68. if(cntB_h==0&&cntB_l==0&&cntB_h==0&&cntB_l==0) begin
  69. flag<=1;
  70. cntA_h<=4;
  71. cntA_l<=5;
  72. cntB_h<=5;
  73. cntB_l<=0;
  74. end
  75. else if(!cntB_h==0&&cntB_l==0) begin
  76. cntB_h<=cntB_h-1;
  77. cntB_l<=9;
  78. end
  79. else if(!cntA_h==0&&cntA_l==0) begin
  80. cntA_h<=cntA_h-1;
  81. cntA_l<=9;
  82. end
  83. else begin
  84. cntA_l<=cntA_l-1;
  85. cntB_l<=cntB_h-1;
  86. end
  87. end
  88. s2:begin
  89. flag<=0;
  90. led<=6'b001_100;//Agreen Bred 45s
  91. if(cntB_h==0&&cntB_l==0&&cntB_h==0&&cntB_l==0) begin
  92. flag<=1;
  93. cntA_h<=0;
  94. cntA_l<=5;
  95. cntB_h<=0;
  96. cntB_l<=5;
  97. end
  98. else if(!cntB_h==0&&cntB_l==0) begin
  99. cntB_h<=cntB_h-1;
  100. cntB_l<=9;
  101. end
  102. else if(!cntA_h==0&&cntA_l==0) begin
  103. cntA_h<=cntA_h-1;
  104. cntA_l<=9;
  105. end
  106. else begin
  107. cntA_l<=cntA_l-1;
  108. cntB_l<=cntB_h-1;
  109. end
  110. end
  111. s3:begin
  112. flag<=0;
  113. led<=6'b100_010;//Ayellow Bred
  114. if(cntB_h==0&&cntB_l==0&&cntB_h==0&&cntB_l==0) begin
  115. flag<=1;
  116. cntA_h<=5;
  117. cntA_l<=0;
  118. cntB_h<=4;
  119. cntB_l<=5;
  120. end
  121. else if(!cntB_h==0&&cntB_l==0) begin
  122. cntB_h<=cntB_h-1;
  123. cntB_l<=9;
  124. end
  125. else if(!cntA_h==0&&cntA_l==0) begin
  126. cntA_h<=cntA_h-1;
  127. cntA_l<=9;
  128. end
  129. else begin
  130. cntA_l<=cntA_l-1;
  131. cntB_l<=cntB_h-1;
  132. end
  133. end
  134. endcase
  135. end
  136. endmodule

 

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

闽ICP备14008679号