FPGA实验8实验八 用有限状态机设计交通灯代码
交通灯完整代码

unsigned int j;
for(;i>0;i--)
for(j=0;j<60;j++)
{;}
}
void display(uchar a,uchar b,uchar c,uchar d)
{
wela=1;
P0=0xfe;
wela=0;
dula=1;
P0=table[a]; //北十位
dula=0;
wela=0;
dula=1;
P0=table[d]; //西个位
dula=0;
Delay(2);
}
void timer0() interrupt 1 using 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
shu++;
if(shu%20==0)
{
xianshi--;
void init()//初始化函数
{
shu=0;
xianshi=30;
xianshi2=35;
aa=3;
bb=0;
cc=3;
dd=5;
P0=0xff;
P1=0;
TMOD=0x01; //用定时器0方式1
EA=1; //打开中断
ET0=1;//打开定时器0中断
TL0=25536/256;
TH0=25536%256;
EX0=1;//外部中断0
EX1=1;//外部中断1
IT0=0;//外部中断0电平触发
IT1=0;//外部中断1电平触发
PX1=1;//设定外部中断1为高优先级
}
void delayms(uint z)
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课程设计 交通灯控制电路的设计

交通灯控制电路的设计1. 设计原理交通灯控制电路的原理框图如图3.3所示。
其中,clkgen是分频器,将EDA实训仪主板提供的20MHz的主频经20000000分频后,得到电路所需的1Hz(秒)时钟。
Cnt10de(两个)是十进制减法计数器,产生道路东西和南北通行和禁止的倒计时时间。
Contr是控制电路,控制整个系统的工作。
控制器接收倒计时的结果,当倒计时归0时,改变电路的控制模式,输出倒计时的初始时间和交通灯亮灭控制信号。
图3.3 交通灯控制电路的原理框图2. 设计要求①用EDA实训仪上的4只八段数码管分别显示道路东西和南北通行和禁止的倒计时时间。
②能设置道路东西和南北两侧通行和禁止的倒计时时间,最大设置时间为99秒,最小设置时间为1秒。
③交通灯用红、绿、黄三种发光二极管(LED)显示控制的结果。
④红、绿、黄灯显示的次序应符合实际交通道路控制的要求。
图2 交通灯控制电路的原理图图2是我们小组本次实训设计的交通灯控制电路的逻辑原理图。
交通灯工作的四种工作状态方式如下:工作状态一:东西——红——倒计时:20 → 4 (秒)南北——绿——倒计时:16 → 0 (秒)工作状态二:东西——红——倒计时: 3 → 0 (秒)南北——黄——倒计时: 3 → 0 (秒)工作状态三:东西——绿——倒计时:16 → 0 (秒)南北——红——倒计时:20 → 4 (秒)工作状态四:东西——黄——倒计时: 3 → 0 (秒)南北——红——倒计时: 3 → 0 (秒)(以上四种工作状态循环进行)1系统软件设计分析逻辑原理图里边一共有四个模块,即1)分频器模块2)蜂鸣器模块3)计数器模块4)控制器模块而我负责完成的模块则是控制器模块,控制器主要控制红绿灯的转换,我增加了一个en使能端,高电平时进入夜晚模式和暂停,不进行倒计时。
lod是预置信号输入端,对倒计时数预置,使芯片的输出状态与预置输入端相同,使芯片进入多种工作状态,。
FPGA 交通灯控制器实验

交通灯控制器一、实验目的熟练掌握EDA软件quartus 2的应用环境,加强利用verilog语言解决生活中实际问题的能力。
二、实验原理和内容利用软件quartus 2进行编写程序实现十字路口交通灯控制器,达到A方向和B方向红、黄、绿三盏灯按合理的顺序亮或灭,并能将灯亮的时间用倒计时的形式显示在数码管上,最后通过软件自带的工具将交通灯控制器的门级电路和RTL级电路自动生成。
三、实验步骤1:首先分析交通灯的原理,整理出所需要的模块,设定每个灯的亮灯时间。
2:运行quartus 2软件、新建工程,然后新建verilog HDL文件,利用verilog语言编写程序实现A和B方向的红黄绿三盏灯合理的交替亮灭,通过对应数码管显示亮灯倒计时。
3:编译程序,若有错误根据错误提示对程序进行修改,直到编译通过,然后设置LED 灯和数码管的引脚,以达到控制A和B那盏灯亮和与之相对应的数码管做倒计时,倒计时结束,亮灯状态转换的效果。
4:将程序烧入FPGA开发板,观察开发板上的LED和数码管显示状况,看是否达到实验目的,若达到则记录实验结果并整理,反之继续修改,直到达到预期效果为止。
5:关闭电源,拆除实验器材。
四、实验数据A方向红灯40s,黄灯10s,绿灯30sB方向红灯40s,黄灯10s,绿灯30s五、实验代码module traffic(clk,en,seg,dig,lampa,lampb);input clk;//时钟信号,50Mhzinput en;// 使能信号,当为高电平时控制器工作,当为低电平时,进行初始化设置。
output[7:0] dig;//数码管位选output[7:0] seg;//数码管段选output[2:0] lampa;//A方向灯亮的情况output[2:0] lampb;//B方向灯亮的情况reg clk_out1;reg clk_out2;reg[15:0] count1;reg[31:0] count2;reg[1:0] a;reg[2:0] lampa;reg[2:0] lampb;reg[3:0] disp_dat;reg[7:0] dig;reg[7:0] seg;reg[7:0] ared,ayellow,agreen,bred,byellow,bgreen;reg[7:0] numa,numb;reg tempa,tempb;reg[1:0] counta, countb;always @(posedge clk)begincount1<=count1+1;if(count1==16'd25000)beginclk_out1<=~clk_out1;count1<=0;endendalways @(posedge clk)begincount2<=count2+1;if(count2==32'd2*******)beginclk_out2<=~clk_out2;count2<=0;endendalways @(en) //给各种灯亮的时间预置数,注意此处为十六进制的数beginif (!en)beginared <= 8'h40;ayellow <= 8'h10;agreen <= 8'h30;bred <=8'h40;byellow <= 8'h10;bgreen <= 8'h30;endendalways @(posedge clk_out2) //控制A方向的四种灯的亮灭及亮的时间beginif(en)beginif(!tempa)begintempa <= 1;case(counta)2'd0:begin numa <= ared; lampa <= 3'b011; counta <= 2'd1;end2'd1:begin numa <= agreen; lampa <= 3'b110; counta <= 2'd2;end2'd2:begin numa <= ayellow; lampa <= 3'b101; counta <= 2'd0;endendcaseendelsebeginif(numa[3:0]==0)beginnuma[3:0] <= 4'd9;numa[7:4] <= numa[7:4]-1;endelse numa[3:0] <= numa[3:0]-1;if (numa == 8'd2)tempa <= 0;endendelsebeginlampa <= 3'b000;counta <= 0; tempa <= 0;endendalways @(posedge clk_out2) //控制B方向的四种灯的亮灭及亮的时间beginif(en)beginif(!tempb)begintempb <= 1;case(countb)2'd0:begin numb <= bgreen; lampb <= 3'b110; countb <= 2'd1;end2'd1:begin numb <= byellow; lampb <= 3'b101; countb <= 2'd2;end2'd2:begin numb <= bred; lampb <= 3'b011; countb <= 2'd0;endendcaseendelsebeginif(numb[3:0]==0)beginnumb[3:0] <= 4'd9;numb[7:4] <= numb[7:4]-1;endelse numb[3:0] <= numb[3:0]-1;if (numb == 8'd2)tempb <= 0;endendelsebeginlampb <= 3'b000;countb <= 0; tempb <= 0;endendalways @(posedge clk_out1)begina<=a+1;endalways @(posedge clk_out1)begincase(a) //数码管显示什么样的数2'd0:disp_dat = numa[3:0];2'd1:disp_dat = numa[7:4];2'd2:disp_dat = numb[3:0];2'd3:disp_dat = numb[7:4];endcasecase(a) //数码管位选2'd0:dig = 8'b10111111;2'd1:dig = 8'b01111111;2'd2:dig = 8'b11111110;2'd3:dig = 8'b11111101;endcaseendalways @(disp_dat)begincase(disp_dat) //数码管译码4'h0:seg = 8'hc0; //显示04'h1:seg = 8'hf9; //显示14'h2:seg = 8'ha4; //显示24'h3:seg = 8'hb0; //显示34'h4:seg = 8'h99; //显示44'h5:seg = 8'h92; //显示54'h6:seg = 8'h82; //显示64'h7:seg = 8'hf8; //显示74'h8:seg = 8'h80; //显示84'h9:seg = 8'h90;endcaseendendmodule交通灯RTL电路交通灯门级网表实际效果。
基于FPGA的智能交通灯控制器

数字逻辑课程设计报告题目:基于FPGA的智能交通灯控制器课程名称:数字逻辑课程设计专业班级:学号:姓名:报告日期:2013-9-12计算机科学与技术学院1. 实验目的通过V erilog的编程,深入了解并掌握可编程芯片的使用技术,完成规定的设计任务,加强对《数字逻辑》课程所学知识的理解,培养学生创造性思维能力和独立解决实际问题的能力。
2. 实验内容用V erilog代码实现智能交通灯信号控制器设计,具体内容及要求如下:(1)在主干道与次干道公路十字交叉路口,为确保人员、车辆安全、迅速地通过,在交叉路口的每个入口处设置了红、绿、黄三色信号灯。
红灯禁止通行;绿灯允许通行;黄灯亮则给行驶中的车辆有时间行驶到禁行线之外。
(2)主干道和次干道公路十字交叉路口都安装了车辆检测传感器(C),要求如下:(A)在每日的早、晚高峰时段,双边“C=1”则主干道通行时间是次干道通行时间的2倍;(B)全天主、次干道有车一方有优先通行权;(3)主干道公路路口安装有人员通过请求按钮(PQ),一旦有请求信息,控制器应给与放行。
(4)Online控制信号由交通控制中心发出,(Online=1)一旦它有效,则主干道放行,十字交叉路口控制器“失效”,Online=0十字交叉路口控制器恢复控制权。
(6)在每次由绿灯亮变成红灯亮的转换过程中间,要亮5s时间的黄灯作为过渡。
(7)用“开关”代替传感器作为人员通过请求和车辆是否到来的信号。
用红、绿、黄三种颜色的发光二极管作交通灯。
(8)要求显示时间,倒计时。
3. 实验环境PC 个人计算机、ISE14.2 软件、Adept软件、开发板Basys2、USB下载线4. 实验设计方案4.1 输入输出与引脚分配说明4.1.1输入信号:PQ,人员请求信号——接板子“E2”开关ONLINE, 控制中心接管信号——接“N3”SET, 控制器开关——接“P11”RST, 复位开关——接“L3”RUSH, 高峰判断开关——接“F3”CM, 主道车辆传感器——接“G3”CC, 支道车辆传感器——接“B4”CLK, 系统时钟——接“B8”4.1.2输出信号:[2:0] ML, ML0~2 主道绿、黄、红灯——分别接“G1、P4、N4”[2:0] CL , CL0~1 支道绿、黄、红灯——分别接“P7、M11、M5”[6:0] a_to_g, 七段数码管接口——a_to_g0~6分别接“M12、L13、P12、N11、N14、H12、L14”[3:0] an, 四选一控制接口——an0~4分别接“F12、J12、M13、K14”4.2 模块图4.2.1 模块层级图4.2.2 模块1.时钟生成模块4.2.3 模块2. 控制模块【1】输入信号input wire clk1s, 近似1s的时钟信号input wire PQ, 人员请求信号input wire ONLINE, 控制中心请求信号input wire SET, 控制器开关信号input wire RST, 复位信号input wire RUSH, 高峰信号input wire CM, 主道车辆检测信号input wire CC, 支道车辆检测信号【2】输出信号output reg [2:0] ML, 主道信号灯接口output reg [2:0] CL, 支道信号灯接口output [7:0] ACOUNT,存放主道两个时间数字的8421码output [7:0] BCOUNT,存放支道两个时间数字的8421码(ACOUNT、BCOUNT整合到顶层文件b[15:0]中,方便调用七段显示模块)【3】模块内部流程图4.2.4 模块3. 七段显示模块【1】显示原理使用同步扫描电路,对4位数码管的控制端口进行扫描,每一个时刻只有一个数码管亮,只要设置足够快的频率扫描,由于眼睛的视觉停留效应,就会使得显示结果达到4位同时亮的效果。
verilog交通灯设计(FPGA)

本控制系统控制交通灯按红灯,黄灯,绿灯,黄灯的顺序循环点亮,点亮时间分别是5s、2s、5s、2s。
时间数值通过数码管进行倒计时显示。
程序清单错误!文档中没有指定样式的文字。
.1 程序基本信息/************************************文件信息************************************** ** 文件名称:traffic_shuma_led.v** 功能描述:程序分为分频模块、状态机模块和段码输出模块,通过三个模块控制交通** 按红灯,黄灯,绿灯,黄灯的顺序循环点亮,点亮时间分别是5s、2s、5s、** 2s。
时间数值通过数码管进行倒计时显示。
********************************************************************************/程序清单错误!文档中没有指定样式的文字。
.2 引脚及变量定义/************************************引脚及变量定义****************************** module traffic_shuma_led(clk,rst_n,red,green,yellow,data_out);input clk; // 系统时钟信号input rst_n; // 复位信号output red; // 红灯控制信号output green; // 绿灯控制信号output yellow; // 黄灯控制信号output [7:0] data_out; // 数码管显示控制信号wire clk; // 系统时钟信号变量wire rst_n; // 复位信号变量reg red; // 红灯信号寄存器reg green; // 绿灯信号寄存器reg yellow; // 黄灯信号寄存器reg [27:0] count; // 分频计数寄存器reg [3:0] count1; // 状态机计数寄存器reg [3:0] count2; // 数码管计数寄存器reg [7:0] data_out; // 数码管显示寄存器reg [1:0] state; // 状态机寄存器reg clk_1hz; // 分频后频率寄存器parameter s1 = 0, // 状态机1s2 = 1, // 状态机2s3 = 2, // 状态机3s4 = 3; // 状态机4parameter on = 0, // 交通灯亮off = 1; // 交通灯灭/*********************************************************/// 模块名称:分频模块// 模块功能:将系统时钟信号clk分频得到1HZ的频率信号clk_1hz//****************************************************************************** always@(posedge clk or negedge rst_n)beginif(!rst_n) // 判断复位信号是否有效begincount <= 0; // 计数器清0endelsebeginif(count==28'd2*******) // 判断计数器是否计满beginclk_1hz <= 1; // 输出1Hz信号count <= 0; // 计数器清0endelsebeginclk_1hz <= 0; // 输出1Hz信号的低电平count <= count + 28'd1; // 计数器加1endendend//******************************************************************************* // 模块名称:状态机模块// 模块功能:通过时钟信号和复位信号对交通灯的状态进行控制//****************************************************************************** always@(posedge clk_1hz or negedge rst_n)beginif(!rst_n) // 判断复位信号是否有效beginstate <= s1; // 初始状态为S1count1 <= 0; // 计数器清0count2 <= 4'b0101; // 计数器置数endelsebegincase(state)s1: // 状态1begingreen <= off; // 绿灯不亮yellow <= off; // 黄灯不亮red <= on; // 红灯亮count1 <= count1 + 4'b1; // 计数器加1if (count1 == 4'b0101) // 计数器是否等于5begincount1 <= 0; // 计数器清0state <= s2; // 状态转移count2 <= 4'b0010; // 计数器置2endelsecount2 <= count2-1; // 计数器减1ends2: // 状态2beginred <= off; // 红灯不亮green <= off; // 绿灯不亮yellow <= on; // 黄灯不亮count1 <= count1 + 4'd1; // 计数器加1if(count1 == 4'b0010) // 判断计算器是否等于2begincount1 <= 0; // 计数器清0state <= s3; // 状态转移count2 <= 4'b0101; // 计数器置数endelsecount2 <= count2-1; // 计数器减1 ends3: // 状态3beginred <= off; // 红灯不亮green <= on; // 绿灯亮yellow <= off; // 黄灯不亮count1 <= count1 + 28'd1; // 计数器加1if(count1 == 4'b0101) // 计数器是否等于5begincount1 <= 0; // 计数器清0state <= s4; // 状态转移count2 <= 4'b0010; // 计数器置数endelsecount2 <= count2-1; // 计数器减1ends4: // 状态4beginred <= off; // 红灯不亮green <= off; // 绿灯不亮yellow <= on; // 黄灯亮count1 <= count1 + 4'd1; // 计数器加1if(count1 == 4'b0010) // 判断计数器是否等于2begincount1 <= 0; // 计数器清0state <= s1; // 状态转移count2 <= 4'b0101; // 计数器置数endelsecount2 <= count2-1; // 计数器减1endendcaseendend// 模块名称:数码显示模块// 模块功能:根据数码管计数器信号发送相应的断码信号是数码管显示倒计时//******************************************************************************* always@(*)case(count2)4'b0000:data_out = 8'b00111111; // 显示04'b0001:data_out = 8'b00000110; // 显示14'b0010:data_out = 8'b01011011; // 显示24'b0011: data_out = 8'b01001111; // 显示34'b0100: data_out = 8'b01100110; // 显示4 4'b0101:data_out = 8'b01101101; // 显示5 4'b0110: data_out = 8'b01111101; // 显示6 4'b0111: data_out = 8'b00000111; // 显示7 default: data_out = 8'b01111111; // 显示0 endcaseendmodule。
基于FPGA的交通灯设计(状态机)

基于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还是44.3、state:状态机模块1、功能描述完成状态间的切换,输出。
FPGA(EDA)课程设计——交通灯(附源代码)

技术规范功能描述:实现一个由一条主干道和一条支干道的汇合点形成的十字路口的交通灯控制器,具体功能:(1) 主、支干道各设有一个绿、黄、红指示灯,两个显示数码管。
(2) 主干道处于长允许通行状态,而支干道有车来时才允许通行。
当主干道允许通行亮绿灯时,支干道亮红灯。
而支干道允许通行亮绿灯时,主干道亮红灯。
(3) 当主干道、支干道均有车时,两者交替允许通行,主干道每次通行45 秒,支干道每次通行25 秒,在每次由绿灯向红灯转换的过程中,要亮5 秒的黄灯作为过渡,并进行减计时显示。
AB45秒倒计时绿灯亮50秒倒计时红灯亮30秒? 红灯亮25秒绿灯亮5秒黄5秒黄图一:交通灯闪烁时序图<!--[if !vml]--><!--[endif]--> <!--[if !vml]--><!--[endif]-->每个周期结束时都要进行支干道是否有车的检测,若有车则进行下一个周期,若没有,则主干道亮绿灯,支干道亮红灯,直到检测到支干道有车。
系统总体框图:根据设计要求和系统所具有的功能,并参考相关的文献资料,经行方案设计,可以画出如下图所示的交通信号灯控制器的系统框图。
数码管位码数码管段码LED灯clkcarrst时钟分频模块交通灯控制及计时模块扫描显示译码模<!--[endif]-->图二:系统总体框图总体设计方案交通灯<!--[if !supportLists]-->一、<!--[endif]-->系统详细框图在系统总体框图的基础上进一步详细设计,得到如下系统详细框图数码管位码数码管段码LED灯clkcarrst时钟分频模块交通灯控制及计时模块扫描显示译码模块clk_odd<!--[if !vml]--><!--[endif]-->。
图三:系统详细框图注:系统总体I/O管脚描述请查看技术规范。
<!--[if !supportLists]-->二、<!--[endif]-->具体模块设计1.时钟分频模块系统的动态扫描需要10KHZ的脉冲,而系统时钟计时模块需要1 HZ的脉冲。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
状态机: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;。