基于FPGA的交通灯设计(状态机)
基于FPGA的交通灯控制器的设计说明书

设计内容及要求
1、主、支干道的四个路口各设绿、黄、红、左拐、右拐、人行六个指示灯用于 指示状态,两位显示数码管用于显示倒计时时间。 2、当主、支道均有车时,两者交替允许通行,主干道每次放行45s,支干道每次 放行40s,在每次由绿灯转换为左拐,左拐变换为红灯时,要有5s的黄灯作为 过渡。 3、每个灯亮到最后5s时,都有闪烁。 4、通行延时功能,智能交通灯控制:当某一干道遇到紧急情况时,需要一直通 行时,允许这支干道处于常通行状态,相应另一条干道处于禁行状态。 5、电子眼功能:当某一干道处于红灯时,如果有车闯过警戒线,那么就会被高 清数码照相机照下来。 6、路况显示功能:当某一干道处于通行时,可以动态的显示:车速,以及路况 信息。 7、硬件主要由FPGA构成,电路复杂,结构紧凑 ,硬件成本比较低。 8、用Verilog HDL语言设计上述功能的交通灯控制器,并用层次化设计方法该电 路。
闪烁子程序
12864显 示子程序
交通灯6个指示灯子程序流程图
状态机设计
整个程序包括五个状态机 例:十字路口左上角的交通灯对应这的9个状态: 分别是红、绿、黄、左拐、黄、右拐、黄、人行、红。
通行延时控制子程序流程图
交通灯闪烁子程序流程图
闯红灯监测子程序流程图
测车辆速度子程序流程图
MS12864R显示子程序流程图
例:主干道绿灯通行,且通行不畅的状态。
此时键8为1,从图4-24看出二极管D7(绿灯)亮,(交通处于通 行状态)数码管显示为11,MS12864R第一行显示的是车013km/h ,第二行显示的是路况:不畅。(此时有车通过,且第一辆车作为 开启MS12864R)
谢谢大家!
谢谢大家!
感谢您的观看!
欢迎批评指导!!
FPGA实验8实验八 用有限状态机设计交通灯代码

状态机:LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.std_logic_unsigned.ALL;ENTITY xhd ISPort(clk : in std_logic;ra,rb,ya,yb,ga,gb : out std_logic );END xhd;Architecture a of xhd istype state is (S0,S1,S2,S3);signal presentstate,nextstate : state;signal tmp1,tmp2 : integer range 0 to 30;signal timeout1,timeout2: std_logic;signal q: std_logic_vector(21 downto 0);signal sec: std_logic;Begin----get 1 hz clock pulseprocess(clk)beginif clk'event and clk='1' then q<=q+1; end if;sec<=q(21); --get 1 hz clock pulseend process;timing: process(sec)beginif sec'event and sec='1' thenif tmp1=29 then timeout1<='1'; timeout2<='0'; tmp1<=0; else if timeout1='1' thenif tmp2=4 then timeout2<='1'; timeout1<='0'; tmp2<=0;else tmp2<=tmp2+1; end if;else tmp1<=tmp1+1; end if;end if;end if;end process;changestate: process(presentstate)Begincase presentstate iswhen S0 => if timeout1='0' thennextstate<=s0;ra<='0'; ya<='0'; ga<='1';rb<='1'; yb<='0'; gb<='0';else nextstate<=s1; end if;when S1 => if timeout2='0' thennextstate<=s1;ra<='0'; ya<='1'; ga<='0';rb<='1'; yb<='0'; gb<='0';else nextstate<=s2; end if;when S2 => if timeout1='0' thennextstate<=s2;ra<='1'; ya<='0'; ga<='1';rb<='0'; yb<='0'; gb<='1';else nextstate<=s3; end if;when S3 => if timeout2='0' thennextstate<=s3;ra<='1'; ya<='0'; ga<='0';rb<='0'; yb<='1'; gb<='0';else nextstate<=s0; end if;when others => nextstate<=s0;timeout1<='0'; timeout2<='0';end case;end process;end a;ENTITY xhd ISPort(clk : in std_logic;ra,rb,ya,yb,ga,gb : out std_logic );END xhd;Architecture a of xhd is 里面的xhd根据你们文件具体情况设定秒表10进制--*******************************************--程序包library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;--*******************************************--实体ENTITY shijinzhi is--Cn 计数脉冲--Rest 清零信号-- En 允许计数信号--Dout[3..0] 十进制BCD码-- Cy 进位码port(Cn,Rest,En :in std_logic;Dout : out std_logic_VECTOR ( 3 Downto 0 );Cy : out std_logic);end shijinzhi ;--******************************************* --结构体architecture sun1 of shijinzhi isbeginProcess (Cn,Rest,En)Variable Cqi : std_logic_VECTOR ( 3 Downto 0 ); BeginIf Rest ='1' Then Cqi :=(Others =>'0');Cy<='0';Elsif Cn'Event and Cn='1' thenIf En='1' thenIf Cqi <"1001" thenCqi :=Cqi+1;Cy<='0';elsif cqi="1001"then Cy<='1';Cqi :=(others =>'0');end If;end If;end If;Dout<=Cqi;END Process;End sun1;--******************************************* 修改同上编写成功后,封装六进制:--******************************************* --程序包library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;--******************************************* --实体ENTITY liujinzhi is--CLK 计数脉冲--RST 清零信号-- EN 允许计数信号--Dout[3..0] 十进制BCD码-- CY 进位码port(CLK,RST,EN :in std_logic;DOUT : out std_logic_VECTOR ( 3 Downto 0 );CY : out std_logic);end liujinzhi ;--*******************************************--结构体architecture SUN2 of liujinzhi isbeginProcess (CLK,RST,EN)Variable Cq : std_logic_VECTOR ( 3 Downto 0 );BeginIf RST ='1' Then Cq :=(Others =>'0');CY<='0';Elsif CLK'Event and CLK='1' thenIf EN='1' thenIf Cq <"0101" thenCq :=Cq+1;CY<='0';elsif cq="0101"then CY<='1';Cq :=(others =>'0');end If;end If;end If;DOUT<=Cq;END Process;End SUN2;--*******************************************修改同上:编译、封装七段:程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY qiwei ISPORT ( Q : IN STD_LOGIC_VECTOR(3 DOWNTO 0);DOUT : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END qiwei; ARCHITECTURE behave OF qiwei ISBEGINPROCESS(Q) BEGINCASE Q ISWHEN "0000"=> DOUT<="0111111";WHEN "0001"=> DOUT<="0000110";WHEN "0010"=> DOUT<="1011011";WHEN "0011"=> DOUT<="1001111";WHEN "0100"=> DOUT<="1100110";WHEN "0101"=> DOUT<="1101101";WHEN "0110"=> DOUT<="1111101";WHEN "0111"=> DOUT<="0000111";WHEN "1000"=> DOUT<="1111111";WHEN "1001"=> DOUT<="1101111";WHEN OTHERS=> DOUT<="0000000";END CASE;END PROCESS;END behave;修改同上,编译,封装仿真波形如图所示:分频(1):library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity fenpin isport ( CLK:in std_logic;FCLK:out std_logic);end fenpin;architecture bhv of fenpin issignal CK:std_logic;beginprocess(CLK)variable counter:integer range 0 to 100000;beginif(CLK'EVENT AND CLK='1') THENIF(counter=99999)THEN counter:=0;CK<=NOT CK;ELSE counter:=counter+1;end if;end if;end process;FCLK<=CK;end bhv;分频(2):library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity fenpin isport ( clk,clr:in std_logic;q:buffer std_logic);end fenpin;architecture b of fenpin issignal counter:integer range 0 to 49999;beginprocess(clr,clk)beginif(CLK='1' AND clk'EVENT) THENIF clr='1' then counter<=0;ELSIF COUNTER=49999 THEN counter<=0;q<=not q;ELSE counter<=counter+1;END IF;END IF;end process;end b;。
基于FPGA的交通灯的设计

课程设计一、设计任务要求基于FPGA的交通灯控制器设计1、总体要求:实现十字路口的交通灯有序显示2、具体要求:按照开发板上的两组红、黄、绿做为南北双向指示灯红灯亮60秒,绿灯亮55秒,黄灯亮5秒要求采用状态机实现状态切换3、附加要求:采用两组两位数码管实现时间倒计时显示二、设计思路1、总体设计方案由设计任务要求可知输入部分有:CLK时钟频率输入,可由实验板上直接提供,本设计选用1kHZ时钟频率。
输出部分有:1)东西方向和南北方向各使用3个LED显示,红黄绿各代表红黄绿灯。
2)东西方向和南北方向计时均为2位数,共需要4个LED七段数码管显示。
由于为共阴极控制,输出三个SEL0,SEL1,SEL2信号控制选择数码管显示,A,B,C,D,E,F,G信号为输出显示的内容。
3)R1,G1,Y1;R2,G2,Y2信号分别为东西南北红绿灯的输出控制信号。
总体设计软件原理图如下所示设计方案原理图:图1A对应13脚; B对应30脚;C对应15脚; D对应31脚;E对应33脚; F对应32脚;G对应35脚; R1对应4脚;R2对应5脚;Y1对应3脚;Y2对应10脚;G2对应8脚;SEL0对应14脚; SEL1对应11脚;SEL2对应12脚.CLK对应24脚;交通灯系统结构图如下所示:红黄绿红黄绿图2状态切换的状态图如下图:图2、模块设计及结果在VHDL设计中,采用自顶向下的设计思路。
顶层模块中,根据硬件设计,设置如下端口:外部时钟信号:Clk东西方向状态灯控制信号:R1,G1,Y1;南北方向状态灯控制信号:R2,G2,Y2;(1)分频模块:由于外部时钟信号clk的频率为1KHz,而实际需要的内部计时时钟频率为1Hz,需要一个分频电路。
输入端口:clk外部时钟信号输出端口:clk_out分频后信号源程序代码如下:数码管显示信号:A,B,C,D,E,F,G;数码管共阴极控制:SEL0,SEL1,SEL2;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity Frequency1 isport(clk:in std_logic; --外部时钟信号clk_out:out std_logic --分频后信号);end Frequency1;architecture Frequency1_arc of Frequency1 isbeginprocess(clk)variable temp:integer range 0 to 999;beginif(clk'event and clk='1')thenif(temp=999)then --分频计数temp:=0;clk_out<='0';elsetemp:=temp+1;clk_out<='1';end if;end if;end process;end;图4(2)状态选择模块:由于共需要显示4个数字,需要循环点亮7位数码管,该模块通过输入的时钟信号,循环输出4个选择信号。
基于FPGA的交通灯控制器设计21674

数字系统课程设计基于FPGA的交通控制灯设计姓名:学号:班级:摘要随着社会的发展,城市规模的不断扩大,城市交通成为制约城市发展的一大因素。
人口和汽车日益增长,市区交通也日益拥挤,人们的安全问题当然也日益重要。
因此,红绿交通信号灯成为交管部门管理交通的重要工具之一。
有了交通灯,人们的安全出行也有了很大的保障。
自从交通灯诞生以来,其内部的电路控制系统就不断的被改进,设计方法也开始多种多样,从而使交通灯显得更加智能化。
尤其是近几年来,随着电子与计算机技术的飞速发展,电子电路分析和设计方法有了很大的改进,电子设计自动化也已经成为现代电子系统中不可或缺的工具和手段,这些都为交通灯控制系统的设计提供了一定的技术基础。
本课程设计运用erilog HDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示,并最后进行了软件实现,达到了系统要求的功能。
设计原理设计要求设计一个交通控制器,用LED 显示灯表示交通状态,并以7段数码显示器显示当前状态剩余秒数 主干道绿灯亮时,支干道红灯亮;反之亦然,二者交替允许通行,主干道每次放行35s ,支干道每次放行25s 。
每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为5s 。
能进行特殊状态显示,特殊状态时东西、南北路口均显示红灯状态。
用LED 灯显示倒计时,并且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。
能实现特殊状态的功能显示, 设计思路和原理本次设计是针对十字路口,进行南北和东西直行情况下交通灯控制。
设定东西方向为主干道方向,根据交通灯的亮的规则,在初始状态下四个方向的都为红灯亮启,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续35S 后,主干道和支干道上的黄灯都亮启,持续5S 后,主干道上红灯亮启,支干道上绿灯亮启持续25S ,之后主干道和支干道上的黄灯都亮启5s ,一个循环完成。
循环往复的直行这个过程。
基于FPGA的交通灯控制电路设计

基于FPGA的交通灯控制电路设计本文介绍了一种基于FPGA的交通灯控制电路设计。
交通灯控制是城市交通管理的一个重要部分,它有助于维护交通秩序,减少交通事故,提高交通效率。
在本电路设计中,我们使用FPGA作为主控制器,并通过数码管、按钮和LED模块与外部交互。
同时,我们还采用了状态机设计方法,以实现灵活的控制逻辑和连续的动态过渡。
首先介绍了本电路设计的硬件设计。
在本设计中,我们使用了FPGA作为主控制器,数码管用于显示当前状态,按钮用于进行手动控制,LED模块用于显示当前灯颜色。
在硬件设计中,我们通过适当的寄存器和时钟模块,实现了稳定的时序控制和同步操作。
接着,我们介绍了本电路设计的软件设计。
在软件设计中,我们采用了状态机设计方法,将交通控制逻辑分为多个状态,通过状态间的转移完成交通灯的切换控制。
具体地,我们将交通灯控制状态划分为三种:绿灯、黄灯和红灯。
在每种状态下,我们通过计数器和状态转移条件来实现精确的时间控制和灯颜色的自动切换。
同时,为了提高控制的灵活性,我们设计了手动控制模式,让用户可以通过按钮手动切换交通灯状态。
最后,我们介绍了本电路设计的实现结果。
在实现过程中,我们使用了Quartus II软件进行综合、布局和验证,并将设计的电路下载到FPGA开发板上进行实验。
实验结果表明,本交通灯控制电路设计实现了稳定、灵活和精确的交通控制,能够满足不同的交通道路需求。
综上所述,本文介绍了一种基于FPGA的交通灯控制电路设计,通过硬件和软件设计,实现了稳定、灵活和精确的交通控制。
该设计可以为城市交通管理提供帮助,为交通事故和交通拥堵的缓解做出贡献。
基于FPGA的智能交通信号灯的设计

基于FPGA的智能交通信号灯的设计智能交通信号灯是一个重要的交通设施,能够引导道路上的交通流动,提高道路交通的效率和安全性。
传统的信号灯系统通常是固定的时间间隔来控制交通流量,但是这种方式无法根据实际道路情况做出灵活的调整,并且无法提前预测交通拥堵的情况。
基于FPGA的智能交通信号灯设计可以利用其高度可编程的特性,结合实时数据分析,实现智能的信号控制系统。
首先,设计智能交通信号灯需要采集道路上的实时交通数据。
可以利用传感器、视频监控等技术,获取车辆的数量、速度、流量等信息,以及行人的行走情况。
这些数据将作为信号灯系统的输入,用于实时分析和控制。
其次,设计一个智能交通信号灯的控制算法。
基于FPGA的灵活性,可以采用神经网络、遗传算法等方法,对采集到的实时数据进行分析和预测,进而生成相应的信号控制策略。
通过实时调整信号灯的绿灯时间,根据交通流量的情况的不断优化信号灯的控制算法,进一步提高交通效率。
接下来,利用FPGA实现智能交通信号灯的控制系统。
FPGA具有高度可编程的特性,可以根据设计需求进行灵活的硬件设计。
使用HDL语言(如Verilog或VHDL)来编写信号灯控制逻辑,并通过FPGA进行硬件设计与实现。
FPGA还可以与传感器、通信模块等其他硬件设备进行连接,实现与外部数据的交互。
最后,进行实际的实验和测试。
将设计好的智能交通信号灯系统应用于实际的道路交通场景中,收集实际使用情况下的数据,进一步改进和优化系统性能。
通过实验和测试,可以验证智能信号灯系统的可行性和实用性,并对系统进行改进和完善。
总结起来,基于FPGA的智能交通信号灯设计需要从数据采集、控制算法、硬件设计和实验测试等方面进行综合考虑。
通过充分利用FPGA的高度可编程性和实时性,结合实时数据分析和控制算法,可以实现更加智能和高效的交通信号灯系统,提高道路交通的流畅性和安全性。
基于FPGA的交通灯设计(课程设计)

FPGA综合设计实验报告题目基于FPGA的交通灯控制器的设计作者专业日期 2013年3月29日1.设计任务:基于FPGA的交通灯控制器的设计2.设计要求:(1)十字路口由一条东西方向的主干道和一条南北方向的支干道构成,主干道和支干道均有红、黄、绿3种信号灯;(2)保持主、支干道红、绿交替变换;(3)绿灯转红灯过程中,先由绿灯转为黄灯,5秒后再由黄灯转为红灯;同时对方由红灯转为绿灯;(4)系统需具有复位及特殊情况紧急处理功能。
(5)了解交通灯控制器的工作原理,完成控制器的硬件电路设计及软件设计。
3.总体设计方案:从题目中计数值与交通灯的亮灭的关系如图(1)所示。
当主干道绿灯55秒和5秒黄灯过渡时,支干道必须禁止通行,即支干道红灯亮55+5=60秒;当支干道由红灯转为绿灯时,支干道亮55秒绿灯和5秒黄灯过渡,此时主干道红灯应亮55+5=60秒。
图1 交通灯控制要求4.硬件电路基本原理分析:动态LED显示的设计方法是将不同LED模块的所有的LED的驱动端一对一地连接到一起,而将其公共极(阴极或阳极)分别由不同的IO口来驱动(主要针对7段码和LED点阵模块)。
动态显示方式主要是出于简化电路和产品成本考虑在大多数场合都可以达到用户要求。
动态显示虽然占用的CPU时间多,但使用的硬件少,能节省线路板空间。
另外,本设计显示需要使用的是4个七段显示数码管。
在计时结果显示电路中,七段数码管显示部分是一个不容忽视的环节,如若处理不得当,可能引起系统功率过大,产生散热问题,严重时甚至会导致系统的烧毁。
为了解决好以上问题,下面就对七段数码管显示电路做简要的分析和介绍。
通常点亮一个LED所需的电流是5~50 mA,通电的电流愈大,LED的亮度愈高,相对的也会使其寿命缩短。
一般以10 mA的导通电流来估算它所必须串联的阻值,其计算方式参考如图1所示。
图1 单个LED的串接电阻计算方式七段显示器可分为共阳极、共阴极型两种,它们都可以等效成8个LED的连接电路,其中如图2就是共阴极型七段显示器的等效电路和每节LED的定义位置图。
基于FPGA的交通灯控制器设计06876

基于FPGA的交通灯控制器设计06876交通灯控制器是城市交通系统中非常重要的一部分,其正确的设计和运行对于交通的安全与效率至关重要。
在本文中,我们将介绍一种基于FPGA(现场可编程门阵列)的交通灯控制器设计。
首先,我们需要了解交通灯控制器的基本原理。
传统的交通灯控制器通常由定时器和状态机组成。
定时器用于控制信号灯的时间段,状态机用于根据规定的时间段和信号灯的状态切换来确定交通灯的工作状态。
FPGA是一种可编程的芯片,可以用来实现各种数字电路的功能。
它具有高度的可编程性和灵活性,可以通过改变编程来实现不同的功能。
基于FPGA的交通灯控制器设计可以提供更大的灵活性和可扩展性,因为它可以根据实际需求进行定制和修改。
在基于FPGA的交通灯控制器设计中,我们需要考虑以下几个方面:1.信号灯的时间控制:根据不同的道路交通流量和需要的通行效率,我们可以灵活地设置每个信号灯的时长。
这可以通过FPGA中的计数器和定时器来实现。
通过编程可以设置不同的时长,并确保相应的信号灯按照预定的规则进行切换。
2.交通流量检测:为了合理地分配交通灯的时间,我们需要在交通道路上安装传感器来检测交通流量。
这些传感器可以根据车辆的数量和速度来确定不同的交通流量。
在基于FPGA的设计中,我们可以使用IO接口将传感器与FPGA相连,并通过编程来读取和处理传感器数据。
3. 状态机设计:状态机是交通灯控制的核心。
它可以根据预先确定的规则和输入,确定交通灯的状态。
基于FPGA的设计中,我们可以使用状态机设计的编程语言(如VHDL或Verilog)来实现状态机。
状态机可以根据交通流量和交通灯状态的不同情况来切换不同的状态,并通过FPGA中的逻辑门来控制交通灯。
4.故障检测和容错设计:在交通灯控制器中,故障检测和容错设计非常重要。
当一些部件发生故障时,控制器应能够自动切换到备用部件或安全模式,以确保交通的安全和通行效率。
通过FPGA的灵活性,我们可以轻松地实现故障检测和容错设计,例如通过监测一些部件的输出电压或信号来检测故障。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于FPGA的交通灯设计规范
一、功能描述:
本设计实现一个交通信号灯,具体功能如下:
1.异步信号复位,复位后1组为红灯亮2组为绿灯亮,数码管显示从24开始
依次递减计数
2.实现红黄绿灯的延时交替亮灭,分两组灯,1组红灯亮时,2组为黄灯,5
秒后,1组红灯亮,2组绿灯亮;25秒后,1组黄灯亮,2组红灯亮;5秒后,1组绿灯亮,2组红灯亮。
如此交替重复
3.计时时间25秒、5秒显示在数码管上。
分别为:从24依次递减到0,从4
依次递减到0
二、输入输出信号描述:
系统结构框图
顶层模块说明:
1、fenpin:将50MHz晶振转为1Hz作为时钟频率;
2、delay:计数延时;
3、state:指出状态转移顺序;
4、shuma:将计数延时用数码管输出显示。
设计说明:
设计分为分频、延时、状态机、数码管显示四个模块。
分频,将50MHz的系统时钟转为1Hz。
计数延时,让状态机能在合适的时间点进行状态切换。
状态机,完成状态间的切换,输出。
数码管显示,将延时模块的计时输出值转换为数码管输出显示。
状态机的输出状态信号标志flag=out[1]|out[4],即为:判断此时的两组输出是否有黄灯亮。
flag_data=flag,作为计数延时模块的输入,用状态信号标志flag_data和计数值cnt来共同控制计数模块是5秒还是25秒。
四、子模块描述:
4.1、fenpin:分频模块
1、功能描述
将实验板上的50MHz的石英晶振频率转为1Hz。
2、管脚描述
每当clock时钟上升沿来临时,内部寄存器sum从0递加,加至25000000时,对clk进行取反操作,则可得到频率为1Hz的clk时钟
4.2、delay:延时模块
1、功能描述
计数延时,让状态机能在合适的时间点进行状态切换。
用计数值和状态信号标志的与结果(cnt==0 && flag_data)来判断计数延时的初始值应为24还是4
4.3、state:状态机模块
1、功能描述
完成状态间的切换,输出。
状态信号标志flag=out[1]|out[4]。
即为检测当前是否有黄灯亮。
注:out[5:3]对应1组灯的:红黄绿
out[2:0]对应2组灯的:红黄绿
4.4、shuma:数码管显示模块
1、功能描述
将延时模块的计时输出值转换为数码管输出显示。
将m1对10取整接入数码管的十位,m2对10取余接入数码管的个位。
五、验证方案:
1、结果验证
将程序下载至实验板,观测其数码管计数显示和两组灯的亮灭变化。
2、复位验证
下载到实验板,让其运行一段时间,进行复位,观测变化。
3、仿真验证
六、实验截图:
图1:仿真综合
图2:管脚分配
七、源程序代码:
顶层模块:
module traffic_light(clock,rst,out,m1,m2);
input clock,rst;
output [5:0]out;
output[6:0]m1,m2;
wire [4:0] x;
wire y;
fenpin F(.clock(clock),.rst(rst),.clk(clk));
delay D(.clk(clk),.flag_data(y),.rst(rst),.cnt(x)); state S(.in(x),.rst(rst),.flag(y),.clk(clk),.out(out)); shuma M(.data(x),.rst(rst),.m1(m1),.m2(m2)); endmodule
分频模块:
module fenpin(clock,rst,clk);
input clock,rst;
output clk;
reg clk;
reg [25:0]sum;
always@(posedge clock or negedge rst)
begin
if(!rst)
begin
clk<='b0;
sum=0;
end
else if(sum==25000000)
begin
clk<=~clk;
sum<=0;
end
else sum<=sum+1;
end
endmodule
延时模块:
module delay(clk,flag_data,rst,cnt);
input clk,rst,flag_data;
output[4:0]cnt;
reg[4:0]cnt;
always@(posedge clk or negedge rst)
begin
if(!rst)cnt<='d24;
else if(cnt==0 && flag_data==0)cnt<='d4;
else if(cnt==0 && flag_data) cnt<='d24;
else cnt<=cnt-5'b1;
end
endmodule
状态机模块:
module state(clk,in,rst,flag,out);
input clk,rst;
input[4:0]in;
output [5:0]out;
output flag;
reg [5:0]out;
reg[3:0]state;
assign flag=out[1]|out[4];
parameter r1_g2or1_2_y=6'b100010,r1_y2og1_r2=6'b001100, g1_r2oy1_r2=6'b010100,y1_r2or1g2=6'b100001,
A='b0001,B='b0010,C='b0100,D='b1000;
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
state<=A;
out<=y1_r2or1_g2;
end
else
begin
case(state)
A: begin
if(in==0 && flag==0)
begin
state<=B;
out<=r1_g2or1_2_y;
end
else
state<=A;
end
B: begin
if(in==0 && flag)
begin
state<=C;
out<=r1_y2og1_r2;
end
else
state<=B;
end
C: begin
if(in==0 && flag==0)
begin
state<=D;
out<=g1_r2oy1_r2;
end
else
state<=C;
end
D: begin
if(in==0 && flag)
begin
state<=A;
out<=y1_r2or1_g2;
end
else
state<=D;
end
default:state<=A;
endcase
end
end
endmodule
数码管显示模块:
module shuma(data,rst,m1,m2);
input rst;
input[4:0]data;
output[6:0]m1,m2;
reg[6:0]m1,m2;
reg[3:0]n1,n2;
reg[7:0]db[9:0];
parameter
db[0]=7'b1000000;db[1]=7'b1111001;db[2]=7'b0100100;db[3]=7'b0110000;db[4]=7'b0011001; db[5]=7'b0010010;db[6]=7'b0000010;db[7]=7'b1111000;db[8]=7'b0000000;db[9]=7'b0010000; always@(data)
begin
if(!rst)
begin
m1<=db[0];
m2<=db[0];
end
else
begin
n1<=data/'d10;
n2<=data%'d10;
m1<=db[n1];
m2<=db[n2];
end
end
endmodule。