目录

此文主要用于状态机的理解,及代码书写的对比(同之前写的交通灯)。

状态机

状态机注意要点:

依据久思路重写交通灯

控制模块

仿真截图

显示模块

解决上次遗留问题(新代码的控制)

此文主要用于状态机的理解,及代码书写的对比(同之前写的交通灯)。

原来的交通灯:https://blog.csdn.net/qq_41467882/article/details/83651966

对于状态机的理解,此处参考这三篇博文(感谢)

FPGA三段式状态机的思维陷阱:https://blog.csdn.net/NarutoInspire/article/details/53893779

fpga状态机详解:https://blog.csdn.net/ruanyz_nobody/article/details/49892037

FPGA 学习之路(八)深入理解状态机:https://blog.csdn.net/GOGOmusic/article/details/54768462

状态机

笔者将重写交通灯,同之前的进行对比同时解决上次文章末尾留下来的一段代码的问题。这些文章中所提及的知识点笔者将尽可能的体现在代码的书写中。

由于之博文前介绍了原理等其他问题,这里直接上代码,所有问题我将在代码注释或者代码后边解决。

//第一个进程,同步时序always块,形式固定
always@(posedge clk or negedge rst_n)
beginif(!rst_n)current_state <= idle;else current_state <= next_state;
end
//第二个always,组合逻辑模块,描述状态迁移条件判断
always@(*)
begincase(current_state)idle:beginif(...)next_state = elsenext_state = ends0:beginends1:beginenddefault:beginnext_state = idle;endendcase
end
//第三个进程,描述输出,同步时序always块
always@(posedge clk or negedge rst_n)
beginif(!rst_n)dout <= 1'b0;else begincase(next_state)idle         : dout <= ;s0           : dout <= ;s1           : dout <= ;default      : dout <= ;endcase end
end

状态机注意要点:

  1. 三个always块,第一个第三个为同步时序always块(用非阻塞赋值方式)。第二个为组合逻辑always块(使用阻塞赋值方式)。
  2. 组合逻辑模块敏感列表采用*
  3. 第三段状态输出为next_state。用current_state会晚一个时钟周期(应该是由于D触发器的原因)
  4. 三段式并不是有三个always块。后面一段是(第三个,第四个......)是用来描述状态输出的

依据久思路重写交通灯

接下来我用上面这个模板写出来新的交通灯。这里只用了A路口,B路口只不过就是改改转换条件。代码过程中的异或我会加在注释里。同样只写控制模块。

控制模块

module traffic_control(clk,rst_n,emgercy_brake,digitA,ledA);
input clk;
input rst_n;
input emgercy_brake;output [5:0] digitA;
output [2:0] ledA;
parameter   idle = 4'b0001,s0      = 4'b0010,s1   = 4'b0100,s2   = 4'b1000;
reg [3:0] stateA;
//第一个进程,同步时序always块
/*
reg [3:0] next_state;
reg [3:0] current_state;
always@(posedge clk or negedge rst_n)
beginif(!rst_n)current_state <= idle;else current_state <= state;
end
//后面的state全部替换成next_state。不然会延时一个时钟周期
*/
/*第二个always,组合逻辑模块,描述状态迁移条件(这一段笔者是在无能,因
为计数器不知道怎么在下一个时钟周期中表示出来并且同时控制状态的跳转)
另外,实在是觉得这种思路的交通灯用三段式不是那么好表示,觉得非要写成
组合逻辑没多大意义,下面将下面一个代码将写成组合逻辑*/
//注释解释A路口
reg [5:0] cntA;
always@(posedge clk or negedge rst_n)
beginif(!rst_n)beginstateA <= idle;cntA <= 6'd35;endelse case(stateA)idle:beginif(emgercy_brake == 1'b0)stateA <= s0;elsestateA <= idle;ends0:beginif(emgercy_brake == 1'b1)stateA <= idle;else beginif(cntA == 1)begin stateA <= s1;cntA <= 6'd20;end elsebegin cntA <= cntA - 1'b1;end endends1:beginif(emgercy_brake == 1'b1)stateA <= idle;else beginif(cntA == 1)begin stateA <= s2;cntA <= 6'd5;end elsebegin cntA <= cntA - 1'b1;end endends2:beginif(emgercy_brake == 1'b1)stateA <= idle;else beginif(cntA == 1)begin stateA <= s0;cntA <= 6'd35;end elsebegin cntA <= cntA - 1'b1;end endenddefault:beginstateA <= idle;endendcase
endassign digitA = cntA;
//第三个进程,描述输出,同步时序always块
reg [2:0] doutA;
always@(posedge clk or negedge rst_n)
beginif(!rst_n)doutA <= 3'b100;else begincase(stateA)idle  : doutA <= 3'b100;s0       : doutA <= 3'b100;s1       : doutA <= 3'b001;s2       : doutA <= 3'b010;default  : doutA <= 3'b100;endcase end
endassign ledA = doutA;endmodule

仿真截图

显示模块

这里的显示模块比较有趣。

assign H_A = cntA / 10;
assign L_A = cntA % 10;
//依次取cntA的十位和个位

这样简单改写前面的显示模块就很容易完成了。

解决上次遗留问题(新代码的控制)

module traffic_control_1(led,clk,zhidong,cntA_h,cntA_l,cntB_l,cntB_h,rst_n);
input rst_n;
input clk;
input zhidong;output reg [3:0] cntA_h;
output reg [3:0] cntA_l;
output reg [3:0] cntB_h;
output reg [3:0] cntB_l;
output reg [5:0] led;reg flag;
reg [1:0] current_state;
reg [1:0] next_state;parameter [1:0] idle=2'd0,s1=2'd1,s2=2'd2,s3=2'd3;always@(posedge clk or negedge rst_n)
beginif(!rst_n)current_state <= idle;else current_state <= next_state;
end
always@(*)
begincase(current_state)idle    : next_state = flag ? s1   :   current_state;s1        : next_state = flag ? s2   :   current_state;s2        : next_state = flag ? s3   :   current_state;s3        : next_state = flag ? idle :   current_state;endcase
endalways@(posedge clk or negedge rst_n)
beginif(!rst_n)begincntA_h <= 4'd5;cntA_l <= 4'd0;cntB_h <= 4'd4;cntB_l <= 4'd5;flag <= 0;endelse if(zhidong)led <= 6'b100_100;//A红黄绿B红黄绿else case(current_state)idle:beginflag<=0;led<=6'b100_001;//Ared Bgreen  45sif(cntB_h==0&&cntB_l==0) beginflag<=1;cntA_h<=0;cntA_l<=5;cntB_h<=0;cntB_l<=5;endelse if(!cntB_h==0&&cntB_l==0) begincntB_h<=cntB_h-1;cntB_l<=9;endelse if(!cntA_h==0&&cntA_l==0) begincntA_h<=cntA_h-1;cntA_l<=9;endelse begincntA_l<=cntA_l-1;cntB_l<=cntB_l-1;endends1:beginflag<=0;led<=6'b100_010;//Ared Byellow 5sif(cntB_h==0&&cntB_l==0 && cntB_h==0&&cntB_l==0) beginflag<=1;cntA_h<=4;cntA_l<=5;cntB_h<=5;cntB_l<=0;endelse if(!cntB_h==0 && cntB_l==0) begincntB_h<=cntB_h-1;cntB_l<=9;endelse if(!cntA_h==0 && cntA_l==0) begincntA_h<=cntA_h-1;cntA_l<=9;endelse begincntA_l<=cntA_l-1;cntB_l<=cntB_l-1;endends2:beginflag<=0;led<=6'b001_100;//Agreen Bred 45s if(cntB_h==0&&cntB_l==0 && cntB_h==0&&cntB_l==0) beginflag<=1;cntA_h<=0;cntA_l<=5;cntB_h<=0;cntB_l<=5;endelse if(!cntB_h==0 && cntB_l==0) begincntB_h<=cntB_h-1;cntB_l<=9;endelse if(!cntA_h==0&&cntA_l==0) begincntA_h<=cntA_h-1;cntA_l<=9;endelse begincntA_l<=cntA_l-1;cntB_l<=cntB_l-1;endends3:beginflag<=0;led<=6'b100_010;//Ayellow Bredif(cntB_h==0&&cntB_l==0 && cntB_h==0&&cntB_l==0) beginflag<=1;cntA_h<=5;cntA_l<=0;cntB_h<=4;cntB_l<=5;endelse if(!cntB_h==0&&cntB_l==0) begincntB_h<=cntB_h-1;cntB_l<=9;endelse if(!cntA_h==0&&cntA_l==0) begincntA_h<=cntA_h-1;cntA_l<=9;endelse begincntA_l<=cntA_l-1;cntB_l<=cntB_l-1;endendendcase
endendmodule

代码仿真

Verilog实现交通灯(数电课设)-----新--及对于状态机的理解相关推荐

  1. Verilog实现交通灯(数电课设)----------旧

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

  2. 交通灯控制系统(30-5-20-5)【数电课设】

    交通灯控制系统[数电课设] 相关资源 一.红绿灯交通信号系统功能概述 二.任务和要求 三.红绿灯交通信号系统 四.电路设计 1.时钟产生模块 2.状态转换模块 3.计时模块 1)置数单元 2)计时单元 ...

  3. 数电课设之十字路口交通灯

    做完一个模电小实验,终于有时间写之前做过的数电课设----十字路口交通灯.一开始我使用Multisim做仿真,因为Multisim有bug,所以我改用proteus做. 下面是课设的具体要求: 任务: ...

  4. verilog 自动售货机状态机实现_基于Verilog语言的简单自动售货机-数电课设报告(最终版)最新版...

    <基于Verilog语言的简单自动售货机-数电课设报告.docx>由会员分享,可免费在线阅读全文,更多与<基于Verilog语言的简单自动售货机-数电课设报告(最终版)>相关文 ...

  5. 在设计四人抢答器中灯全亮_数电课设四路抢答器的设计

    数电课设四路抢答器的设计 4 路抢答器的设计 绪论 : 随着经济水平的不断提高,当今的社会竞争日益激烈,选拔人才,评选优 胜,知识竞赛之类的活动愈加频繁,智力竞赛是一种生动活泼的教育方式,人 们在物质 ...

  6. sr锁存器 数电_数电课设其实也没那么难2.1

    1 引言 如上就是 课题二.数字式抢答器 课题三.多路彩灯控制器 相比天天在路口见的红绿灯 这俩题可能抽象了一点 我自己是课题三 做的时候发现 这题还真不是最简单的一个... 一步一步来吧 数电并不是 ...

  7. 【全套资料.zip下载】数电课设-走廊声光控延时节能灯电路设计【Multisim仿真+报告+讲解视频.zip下载】

    文章目录 数电课设-走廊声光控延时节能灯电路设计[Multisim仿真+报告+演示视频.zip] 一.Multisim仿真源文件 二.仿真视频原理讲解 三.原理文档报告 资料下载[Multisim仿真 ...

  8. 51单片机数字电子钟设计(数电课设,含时间显示、校准、整点报时、闹钟功能)

    51单片机数字电子钟设计(数电课设,含时间显示.校准.整点报时.闹钟功能) 首先展示硬件设计部分,此处采用proteus仿真演示.其中液晶屏上面一行显示的是实际时间,下面一行显示的是设定闹钟时间.通过 ...

  9. Multisim数电课设-乒乓球游戏实现-设计分享

    题目要求 设计题目 乒乓球游戏机.用LED表示乒乓球位置和球拍.控制球拍在合适的时机击球.一方失球另外一方得分. 期望功能 1).设置8个LED表示球的位置,球可以往复运动 2).球运动到最边缘时,检 ...

最新文章

  1. 网络营销专员浅析网络营销推广基本形式你更中意哪种?
  2. 物联网与应用数字战略
  3. MacroMedia FreeHand 10中文版
  4. 制定数据丢失防范策略的六个要点
  5. python3.7安装wordcloud_Python中的wordcloud库安装问题及解决方法
  6. 获取设备IMEI ,手机名称,系统SDK版本号,系统版本号
  7. ITK:在一张图像中设置像素值
  8. 1070: [SCOI2007]修车
  9. MySQL 8.0 压缩包版安装方法
  10. 飞鸽传书该如何去优化?
  11. java 解析ppt动画_上映17天,姜子牙口碑一路狂跌,但这份PPT让它又火了!
  12. 悟透delphi 第五章 包
  13. jQuery lightbox插件(相册全屏效果)
  14. 磁力搜索引擎ZSKY一键安装包
  15. C语言经典例70-编写求字符串长度函数
  16. c盘满了怎么清理垃圾而不误删?教你瞬间多出20个G
  17. for循环2000年到3000年的闰年
  18. 2021年全国职业院校技能大赛 “大数据技术与应用”—模拟赛题(三)
  19. css浏览器兼容性的问题
  20. pca降维算法java_PCA 降维算法详解 以及代码示例

热门文章

  1. IIS网站无法播放视频的解决方法
  2. 我应该如何解释接口和抽象类之间的区别?
  3. oracle安装错误10301,Oracle数据库案例整理-Oracle系统运行时故障-表空间所在的目录没有可用空间导致收集统计信息失败...
  4. win11下载时卡住0%不动怎么办 Windows11下载卡在0%的解决方法
  5. rosweb,roslib:bug汇总。报Warning: Invalid argument “/map“ passed to canTransform
  6. 光线传感器,方向传感器Android
  7. python动态属性_Python进阶之@property动态属性的实现
  8. IoT:MQTT协议详解
  9. python做病毒传播的空间数据_利用4行Python代码监测每一行程序的运行时间和空间消耗...
  10. 操作元素之修改元素属性