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

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

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

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

设计要求:

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

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

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

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

第一种方法

设计思路:

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

模块介绍(代码的书写)

分频模块:

module fenpin(clk,rst_n,clk1);
input clk;//系统时钟
output  reg clk1;//分频后的时钟
input rst_n;//复位信号
reg [25:0] cnt;always@(posedge clk or negedge rst_n)    begin  if(!rst_n)cnt <= 0;else if(cnt==26'd24_999_999)//当cnt为24_999_999的时候,重新计数并且将clk1反转begincnt <= 0;   clk1 <= ~clk1;endelsecnt <= cnt + 1'b1;        end
endmodule

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

数码管动态显示模块:

module xianshi(input  clk,input  rst_n,input [7:0] B,input [7:0] A,output reg [6:0]Y,//显示器段选output reg [3:0]an,//显示器位选output reg dp);
parameter AB=18'd300000;
reg[17:0] cnt;//动态扫描计数器
//这个时间其实可以自己控制,只要在人眼不能观察到间隔就行
always@(posedge clk or negedge rst_n)if(!rst_n)cnt<=1'b0;else if (cnt==AB-1)cnt<=1'b0;else cnt<=cnt+1;
/*动态扫描  选择要显示的数码管(第一个要显示),当速度快到人眼无法区分的时候就是“所有”数码管一//起显示了*/
reg[3:0]digit;//定义一个储存要显示数据的寄存器always@(posedge clk or negedge rst_n)beginif(!rst_n) beginan<=4'b1110;dp<= 0;endelse if(cnt==AB-1) beginan<={an[0],an[3:1]};dp <= 1'b1;endend
//当某一个数码管被点亮的时候,赋予其对应位置的数据
always@(posedge clk or negedge rst_n)beginif(!rst_n)digit<=4'b1111;else if(an==4'b1110)digit<=B[3:0];else if(an==4'b1101)digit<=B[7:4];else if(an==4'b1011)digit<=A[3:0];else if(an==4'b0111)digit<=A[7:4];end
//七段译码器(显示器)always@(*)begincase(digit)4'b0000:Y<=7'b0000001;4'b0001:Y<=7'b1001111;4'b0010:Y<=7'b0010010;4'b0011:Y<=7'b0000110;4'b0100:Y<=7'b1001100;4'b0101:Y<=7'b0100100;4'b0110:Y<=7'b0100000;4'b0111:Y<=7'b0001111;4'b1000:Y<=7'b0000000;4'b1001:Y<=7'b0000100;default Y<=7'b0000001;endcaseend
endmodule

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

控制模块:

module control(clk,rst_n,ledA,ledB,A,B,en);
input clk;
input rst_n;
input en;output  reg [2:0] ledA;//控制三个ledA方向
output  reg [2:0] ledB;reg [2:0] stateA;
reg [2:0] stateB;
output reg [7:0] A;
output reg [7:0] B;parameter redB = 3'b100,greenB = 3'b001,yellowB = 3'b010;
parameter redA = 3'b100,greenA = 3'b001,yellowA = 3'b010;always @ ( posedge clk or negedge rst_n)begin if(!rst_n)begin  stateA <= 3'b100 ; A <= 8'b0010_0000;  endelse if(en)   case ( stateA )              //交通灯状态变换redA : begin if(A==0) beginA <= 8'b0001_0101;stateA <= greenA;endelse if(A[3:0] == 0 && !A[7:4] == 0) beginA[7:4] <= A[7:4] - 1'b1;A[3:0] <= 4'b1001;endelse if(!A[3:0] == 0) beginA[3:0] <= A[3:0] - 1'b1;end elsestateA <= redA;endgreenA : begin if(A==0) begin  A <= 8'b0000_0100;stateA <= yellowA;endelse if(A[3:0] == 0 && !A[7:4] == 0) beginA[7:4] <= A[7:4] - 1'b1;A[3:0] <= 4'b1001;endelse if(!A[3:0] == 0) beginA[3:0] <= A[3:0] - 1'b1;end else stateA <= greenA;end yellowA :begin if(A==0) beginA <= 8'b0010_0000;stateA <= redA;endelse if(A[3:0] == 0 && !A[7:4] == 0) beginA[7:4] <= A[7:4] - 1'b1;A[3:0] <= 4'b1001;endelse if(!A[3:0] == 0) beginA[3:0] <= A[3:0] - 1'b1;end else stateA <= yellowA;enddefault : stateA <= redA ;endcaseend
always@(*)
begin
case (stateA)
redA : ledA <= redA;
yellowA : ledA <= yellowA;
greenA : ledA <= greenA;
endcase
endalways @ ( posedge clk or negedge rst_n)begin if(!rst_n)begin  stateB <= 3'b001 ; B<= 8'b0001_0101;  endelse if(en)   case ( stateB )              //交通灯状态变换greenB: begin if(B==0) beginB<= 8'b0000_0100;stateB <= yellowB;endelse if(B[3:0] == 0 && !B[7:4] == 0) beginB[7:4] <= B[7:4] - 1'b1;B[3:0] <= 4'b1001;endelse if(!B[3:0] == 0) begin            B[3:0] <= B[3:0] - 1'b1;end elsestateB <= greenB;endyellowB: begin if(B == 0) beginB <= 8'b0010_0000;stateB <= redB;endelse if(B[3:0] == 0 && !B[7:4] == 0) beginB[7:4] <= B[7:4] - 1'b1;B[3:0] <= 4'b1001;endelse if(!B[3:0] == 0) beginB[3:0] <= B[3:0] - 1'b1;end else stateB <= redB;end redB:begin if(B == 0) beginB <= 8'b0001_0101;stateB <= greenB;endelse if(B[3:0] == 0 && !B[7:4] == 0) beginB[7:4] <= B[7:4] - 1'b1;B[3:0] <= 4'b1001;endelse if(!B[3:0] == 0) beginB[3:0] <= B[3:0] - 1'b1;end else stateB <= redB;enddefault : stateB <= redB;endcaseend
always@(*)
begin
case (stateB)
redB: ledB<= redB;
yellowB: ledB<= yellowB;
greenB: ledB<= greenB;
endcase
end
endmodule

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

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

top文件:

module new1_top(clk,rst_n,Y,an,ledA,ledB,en,dp);
input clk;
input rst_n;
input en;output  [2:0] ledA,ledB;
output  [6:0] Y;
output  [3:0] an;
output dp;wire clk_1s;
wire [7:0] lineA;
wire [7:0] lineB;control A(.clk(clk_1s),.rst_n(rst_n),.ledA(ledA),.ledB(ledB),.A(lineA),.B(lineB),.en(en));fenpin B(.clk(clk),.rst_n(rst_n),.clk1(clk_1s));xianshi C(.clk(clk),.rst_n(rst_n),.B(lineB),.A(lineA),.Y(Y),//显示器段选.an(an),//显示器位选.dp(dp));
endmodule

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

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

module control(led,divclk,zhidong,cntA_h,cntA_l,cntB_l,cntB_h,rst);
input rst;
input divclk;
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 cs,ns;parameter [1:0] s0=2'd0,s1=2'd1,s2=2'd2,s3=2'd3;always@(posedge divclk or posedge rst)
if(rst)
cs<=s0;
else
cs<=ns;always@(*)
begincase(cs)s0:ns=flag?s1:s0;s1:ns=flag?s2:s1;s2:ns=flag?s3:s2;s3:ns=flag?s0:s3;endcase
endalways@(posedge divclk or posedge rst)
beginif(rst)begincntA_h<=5;cntA_l<=0;cntB_h<=4;cntB_l<=5;flag<=0;endelse if(zhidong)led<=6'b100_100;//A红黄绿B红黄绿else case(cs)s0: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_h-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_h-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_h-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_h-1;endendendcase
end
endmodule

Verilog实现交通灯(数电课设)----------旧相关推荐

  1. Verilog实现交通灯(数电课设)-----新--及对于状态机的理解

    目录 此文主要用于状态机的理解,及代码书写的对比(同之前写的交通灯). 状态机 状态机注意要点: 依据久思路重写交通灯 控制模块 仿真截图 显示模块 解决上次遗留问题(新代码的控制) 此文主要用于状态 ...

  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. Google Ajax Search 参考
  2. 软件测试中7个令人匪夷所思的真理
  3. 微软Excel竟能实现CV算法:亚马逊工程师妙用,人脸检测、字符识别都不在话下...
  4. 使Mybatis开发变得更加轻松的增强工具 — Ourbatis
  5. excel调用python编程-使用Python对Excel进行读写操作
  6. 我要做 Android 之面笔试总结
  7. Selenium_用selenium webdriver实现selenium RC中的类似的方法
  8. 0046-简单的分段函数(二)
  9. git submoule 更新_微软Surface Duo双屏手机键盘更新:支持分体式输入
  10. console.log()与alert()的区别
  11. dubbo注册中心的细节
  12. XeCJK 使用系统字体
  13. 计算机职业规划范文300字,我的职业生涯规划,300字
  14. 英语语法详解:名词修饰名词
  15. c#网络通信框架networkcomms内核解析之六 处理接收到的二进制数据
  16. 邓白氏编码官方查询地址
  17. 现代控制理论2——状态空间分析法
  18. 生死狙击2等待服务器响应,《生死狙击2》劫掠测试结束:热爱不止 来日再战!...
  19. git commit -amend报错 ! [remote rejected] HEAD -> refs/for/master (duplicate request) error: failed to
  20. 【Windows】Word文档中的Endnote“乱码”

热门文章

  1. 解决 mac ssh空闲 连接断开问题
  2. libreoffice转换文件为pdf文件乱码问题解决办法
  3. 微信分享网页链接缩略图不显示解决方法
  4. 【linux-command not find解决方法 】
  5. 几种常见的Windows 服务器无法联网/无法连接远程桌面等故障解决方案
  6. [PVE]解决 ProXmoX VE升级 apt-get update 报错的问题
  7. Java 如何抛出异常、自定义异常、手动或主动抛出异常
  8. 用于检测浏览器语言偏好的JavaScript
  9. Webots安装,及urdf转webots,通过3d模型获取Proto_indexedFaceset数据,MoveIt机械臂路径规划
  10. 关于MultiActionController异步请求Ajax,pc端正常,手机端报error错误;此问题一般是通过setInterval,seTimeout,做Ajax轮询时会产生此问题;