当前位置:   article > 正文

北邮22级信通院数电:Verilog-FPGA(12)第十二周实验(1)设计一个汽车尾灯自动控制系统_吉大22级数电汽车尾灯设计

吉大22级数电汽车尾灯设计

北邮22信通一枚~

跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章

持续关注作者 迎接数电实验学习~

获取更多文章,请访问专栏:

北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客

 

目录

一.题目要求

二.代码部分

2.1  car_system.v

 2.2  divide.v

三.管脚分配

四.实现效果


一.题目要求

设计一个汽车尾灯自动控制系统,要求根据汽车行驶状态自动控制汽车尾灯:

直行:尾灯不亮;

右转:右侧尾灯亮而且按秒闪烁,左侧尾灯不亮;

左转:左侧尾灯亮而且按秒闪烁,右侧尾灯不亮;

临时停车或者故障:两侧尾灯同时闪烁;

注:用三色LED代码表左右汽车尾灯,用拨码开关控制汽车行驶状态没还可以考虑用七段数码管和单色LED显示汽车的状态。

二.代码部分

2.1  car_system.v

  1. module car_system
  2. (
  3. input [3:0] sw,
  4. input clk,
  5. input rst_n,
  6. output reg [5:0] led
  7. );
  8. wire clk_1HZ;
  9. divide #(.WIDTH(32),.N(12000000))divide_1
  10. (
  11. .clk(clk),
  12. .rst_n(rst_n),
  13. .clkout(clk_1HZ)
  14. );
  15. parameter [3:0]
  16. start = 4'b0000,
  17. forward = 4'b0000,
  18. turn_left = 4'b0001,
  19. turn_right = 4'b1000,
  20. temp_stop = 4'b1001,
  21. back = 4'b1111;
  22. reg [3:0]
  23. current_state,
  24. next_state;
  25. initial
  26. begin
  27. current_state <= 4'b0000;
  28. next_state <= 4'b0000;
  29. end
  30. always @(posedge clk_1HZ or negedge rst_n)
  31. begin
  32. if(~rst_n)
  33. begin current_state <= start;end
  34. else
  35. begin current_state <= next_state;end
  36. end
  37. always @ (current_state or sw)
  38. begin
  39. case(current_state)
  40. start:
  41. case(sw)
  42. forward : next_state = forward;
  43. turn_left : next_state = turn_left;
  44. turn_right : next_state = turn_right;
  45. temp_stop : next_state = temp_stop;
  46. back : next_state = back;
  47. default : next_state = start;
  48. endcase
  49. forward : next_state = start;
  50. turn_left : next_state = start;
  51. turn_right : next_state = start;
  52. temp_stop : next_state = start;
  53. back : next_state = start;
  54. endcase
  55. end
  56. always @ (current_state)
  57. begin
  58. led = 6'b111111;
  59. case (current_state)
  60. start : led = 6'b111111;
  61. forward :led = 6'b111111;
  62. turn_left : led = 6'b000111;
  63. turn_right : led = 6'b111000;
  64. temp_stop : led = 6'b000000;
  65. back : led = 6'b101101;
  66. default : led = 6'b111111;
  67. endcase
  68. end
  69. endmodule

 2.2  divide.v

  1. module divide ( clk,rst_n,clkout);
  2. input clk,rst_n; //输入信号,其中clk连接到FPGA的C1脚,频率为12MHz
  3. output clkout; //输出信号,可以连接到LED观察分频的时钟
  4. //parameter是verilog里常数语句
  5. parameter WIDTH = 3; //计数器的位数,计数的最大值为 2**WIDTH-1
  6. parameter N = 5; //分频系数,请确保 N < 2**WIDTH-1,否则计数会溢出
  7. reg [WIDTH-1:0] cnt_p,cnt_n; //cnt_p为上升沿触发时的计数器,cnt_n为下降沿触发时的计数器
  8. reg clk_p,clk_n; //clk_p为上升沿触发时分频时钟,clk_n为下降沿触发时分频时钟
  9. //上升沿触发时计数器的控制
  10. always @ (posedge clk or negedge rst_n ) //posedge和negedge是verilog表示信号上升沿和下降沿
  11. //当clk上升沿来临或者rst_n变低的时候执行一次always里的语句
  12. begin
  13. if(!rst_n)
  14. cnt_p<=0;
  15. else if (cnt_p==(N-1))
  16. cnt_p<=0;
  17. else cnt_p<=cnt_p+1; //计数器一直计数,当计数到N-1的时候清零,这是一个模N的计数器
  18. end
  19. //上升沿触发的分频时钟输出,如果N为奇数得到的时钟占空比不是50%;如果N为偶数得到的时钟占空比为50%
  20. always @ (posedge clk or negedge rst_n)
  21. begin
  22. if(!rst_n)
  23. clk_p<=0;
  24. else if (cnt_p<(N>>1)) //N>>1表示右移一位,相当于除以2去掉余数
  25. clk_p<=0;
  26. else
  27. clk_p<=1; //得到的分频时钟正周期比负周期多一个clk时钟
  28. end
  29. //下降沿触发时计数器的控制
  30. always @ (negedge clk or negedge rst_n)
  31. begin
  32. if(!rst_n)
  33. cnt_n<=0;
  34. else if (cnt_n==(N-1))
  35. cnt_n<=0;
  36. else cnt_n<=cnt_n+1;
  37. end
  38. //下降沿触发的分频时钟输出,和clk_p相差半个时钟
  39. always @ (negedge clk)
  40. begin
  41. if(!rst_n)
  42. clk_n<=0;
  43. else if (cnt_n<(N>>1))
  44. clk_n<=0;
  45. else
  46. clk_n<=1; //得到的分频时钟正周期比负周期多一个clk时钟
  47. end
  48. assign clkout = (N==1)?clk:(N[0])?(clk_p&clk_n):clk_p; //条件判断表达式
  49. //当N=1时,直接输出clk
  50. //当N为偶数也就是N的最低位为0,N(0=0,输出clk_p
  51. //当N为奇数也就是N最低位为1,N(0=1,输出clk_p&clk_n。正周期多所以是相与
  52. endmodule

三.管脚分配

四.实现效果

实现效果
拨码开关效果显示
初始状态0000LED全不亮
直行0000LED全不亮
左转0001LED左三个亮灭交替
右转1000LED右三个亮灭交替
临时停车1001LED左三个&&右三个 亮灭交替
倒车1111LED左一个&&右一个 亮灭交替

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

闽ICP备14008679号