FPGA交通灯仿真及代码
《FPGA设计与应用》交通灯实验一
《FPGA设计与应用》交通灯实验
一、实验目的和要求
实验目的:
1. 综合运用 Verilog HDL 语言进行时序设计。
实验要求:
1. 两个方向各种灯亮的时间能够进行设置和修改
二、实验内容和原理
1. 编写时间控制程序,利用交通灯实验子板,实现东西,南北向的交通灯计数并亮灯的程序;
2.子板实现所有显示方面的功能,包括十进制倒数计数和红绿黄三色灯的轮流点亮。
三、主要仪器设备
电脑、VIVADO软件
四、操作方法与实验步骤
1.为了在八段数码管上正确显示十进制数据,设计一个函数,程序即上述实验五中的数码管封装模块。
2、将实验板上电,下载程序到 FPGA 芯片中。
3、观察实验结果。
五、实验数据记录和处理
综合:
程序:
六、实验结果与分析
实验仿真结果:
实物操作:
七、讨论和心得
通过这次实验,我加深了用Verilog语言来进行时序设计方法的理解,能够编写简单的时间控制程序,让我verilog语法的运用更加熟练,在实验中还用到了之前学到的模块调用,加深了我对之前知识的理解。
通过本次实验,我不仅学到了关于Verilog的知识,同时也让我感觉到了思考的重要性。
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实现的交通灯控制器详解交通灯控制器是城市交通管理中的重要设备,用来控制红绿灯的改变。
传统的交通灯控制器多采用微控制器或单片机实现,但是这些方式在处理大规模的交通路口时会受到性能和并发处理能力的限制。
为了克服这些问题,近年来,基于FPGA(Field-Programmable Gate Array,现场可编程门阵列)的交通灯控制器逐渐得到应用。
FPGA是一种可编程逻辑器件,能够根据用户需求进行现场编程,具有高度灵活性和可重构性。
基于FPGA的交通灯控制器可以通过并行处理和精确时间管理来提高性能。
FPGA可以为每个交通灯信号灯分配独立的处理器核,同时可以对不同的交通灯进行并发处理。
这种并行处理的方式大大提高了系统的响应速度和处理能力,可以更好地适应高负载的交通场景。
此外,FPGA还可以提供更精确的时间管理。
交通灯的信号改变需要精确地控制时间,以确保交通流畅和交通安全。
传统的微控制器或单片机无法提供足够的精确性和实时性,而FPGA可以通过硬件电路和时钟管理单元来实现高精度的时间控制。
这种精确的时间管理能够对交通流量进行准确的判断和调度,提高交通效率。
此外,基于FPGA的交通灯控制器还具有可扩展性和灵活性。
FPGA的可编程特性使得交通灯控制器可以轻松地进行功能扩展和升级,满足不同场景和需求的要求。
而且,FPGA还可以进行实时调度和优化,可以根据实际交通情况进行动态调整,使交通灯控制系统更加智能和高效。
总之,基于FPGA的交通灯控制器具有高性能、精确的时间管理、可扩展性和灵活性等优点。
它可以提供更好的交通管理和安全保障,适用于大规模的交通路口和复杂的交通场景。
随着FPGA技术的不断发展和成熟,基于FPGA的交通灯控制器将会得到更广泛的应用。
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的交通灯(verilog)
基于同步FSM交通信号控制器试验目的1、进一步熟悉FSM原理;2、交通信号控制逻辑的抽象建模方法;3、掌握同步有限状态机的置位与复位方法;3、掌握编写可综合的FSM一般指导原则;试验原理Verilog HDL和VHDL亍为描述用于综合还只有十年的历史,可综合风格的VerilogHDL和VHD啲语法只是它们各自语言的一个子集;HDL的可综合性研究近年来非常活跃,可综合子集的国际标准目前尚未最后形成,因此,各厂商的综合器所支持的HDL子集也略有不同;对于有关可综合的VerilogHDL的内容我们只着重于介绍RTL算法级和门级结构的描述;把一个时序逻辑抽象成一个同步有限状态机是设计可综合VerilogHDL 模块的关键。
有限状态机是设计各种时序逻辑电路的关键。
具体的有限状态机的原理可以参看试验七有关原理的介绍。
下面介绍一般的可综合有限状态机的编写原则每个always 块只能有一个事件控制@(event_expression) ,而且要紧跟在always 关键字后面;always 可以表示时序逻辑或者组合逻辑;也可以用always 块既表示电平敏感的锁存器又同时表示组合逻辑;带有posedge或negedge关键字的事件表达式表示边沿触发的时序逻辑,没有posedge或negedge关键字的表示组合逻辑或者电平敏感的锁存器,或者两者都表示;每个表示时序的always 块只能由一个时钟跳变沿触发,置位和复位最好也由该始终跳变沿触发;每个在always 块中赋值的信号必须定义为reg 类型或者整型;Always 块中应该避免组合反馈回路;实验步骤和实验内容1、本试验交通信号控制灯的逻辑关系该交通信号灯控制器用于控制一条主干道与一条乡村公路的交叉口的交通( 如图8-1 所示) ,它必须具有下面的功能;由于主干道上来往的车辆较多,因此控制主干道的交通信号灯具有最高优先级,在默认情况下,主干道的绿灯点亮;乡村公路间断性地有车经过,有车来时乡村公路的交通灯必须变为绿灯,只需维持一段足够的时间,以便让车通过。
基于FPGA的交通控制灯源程序
源程序lcd显示及顶层模块程序:modulLCD(clk,key,LCD_RS,LCD_DB,LCD_RW,LCD_E,a_red,a_green,a_yellow,b_red,b_green, b_yellow, a_left,b_left );input clk,key;output LCD_RS;output [3:0] LCD_DB;output LCD_RW;output LCD_E;output a_red,a_green,a_yellow,b_red,b_green,b_yellow,a_left,b_left;wire a_red,a_green,a_yellow,b_red,b_green,b_yellow,a_left,b_left;wire [7:0] a_count,b_count;reg LCD_RS,LCD_E,LCD_RW;reg [3:0] LCD_DB;wire clken_ms; // ms clock enable signreg [15:0] cnt_clk ;reg[7:0] cnt_cmd ;reg rs = 1'b0;reg reset = 1'b0;reg[3:0] DB = 4'h0;wire rst;transport1 r1(.clk(clk),.rst(rst),.a_count(a_count),.a_left(a_left),.b_left(b_left),.a_red(a_red),.b_count(b_count),.a_green(a_green),.a_yellow(a_yellow),.b_red(b_red),.b_green(b_green),.b_yellow(b_yellow));key key1(.clk(clk),.key(key),.out(rst));// create 1ms clock enable sign (clken_ms)always @( posedge clk or posedge rst)beginif(rst)cnt_clk <= 16'hC350;else if( clken_ms == 1'b1 )cnt_clk <= 16'hC350;elsecnt_clk <= cnt_clk - 1;endassign clken_ms = ~(|cnt_clk);// FSMalways @( posedge clk or posedge rst )begincnt_cmd <=8'h00;elseif( cnt_cmd == 8'hff )cnt_cmd <= 8'h40;elseif( clken_ms )cnt_cmd <= cnt_cmd + 1;endalways @( * )begincase( cnt_cmd )// LCD init8'd32:begin DB <= 4'h3; rs <= 1'b0; reset <= 1'b1; end 8'd38: // send "Function Set"begin DB <= 4'h3; rs <= 1'b0; reset <= 1'b1; end8'd40: // send "Function Set"begin DB <= 4'h3; rs <= 1'b0; reset <= 1'b1; end 8'd42: // send "Function Set"begin DB <= 4'h2; rs <= 1'b0; reset <= 1'b1; end//set LCD function8'd44: // send function setbegin DB <= 4'h2; rs <= 1'b0; reset <= 1'b1; end 8'd46: // send function setbegin DB <= 4'h8; rs <= 1'b0; reset <= 1'b1; end8'd48: // send "Display On/Off control"begin DB <= 4'h0; rs <= 1'b0; reset <= 1'b1; end 8'd50: // send "Display On/Off control"begin DB <= 4'hC; rs <= 1'b0; reset <= 1'b1; end8'd52: // send "Display clear"begin DB <= 4'h0; rs <= 1'b0; reset <= 1'b1; end 8'd54: // send "Display clear"begin DB <= 4'h1; rs <= 1'b0; reset <= 1'b1; end8'd56: // send "Entry mode set"begin DB <= 4'h0; rs <= 1'b0; reset <= 1'b1; end 8'd58: // send "Entry mode set"begin DB <= 4'h6; rs <= 1'b0; reset <= 1'b1; end8'd60: // send "Set CGRAM address"begin DB <= 4'h5; rs <= 1'b0; reset <= 1'b1; end8'd62: // send "Set CGRAM address"begin DB <= 4'h0; rs <= 1'b0; reset <= 1'b1; end//Display First Line /////////////////////////////////////8'd64: // send "Set DDRAM address" /// begin DB <= 4'h8; rs <= 1'b0; reset <= 1'b1; end///8'd66: // send "Set DDRAM address" /// begin DB <= 4'h1; rs <= 1'b0; reset <= 1'b1; end/////////////////////////////////////////////////////////////8'd68: // abegin DB <= 4'h4; rs <= 1'b1; reset <= 1'b1; end8'd70: // abegin DB <= 4'h1; rs <= 1'b1; reset <= 1'b1; end8'd72: // :begin DB <= 4'h3; rs <= 1'b1; reset <= 1'b1; end8'd74: // :begin DB <= 4'hA; rs <= 1'b1; reset <= 1'b1; end8'd76: // a_count[7:4]begin DB <= 4'h3; rs <= 1'b1; reset <= 1'b1; end8'd78:begin DB <= a_count[7:4]; rs <= 1'b1; reset <= 1'b1; end8'd80: // a_count[3:0]begin DB <= 4'h3; rs <= 1'b1; reset <= 1'b1; end8'd82:begin DB <=a_count[3:0]; rs <= 1'b1; reset <= 1'b1; end// show bit on second line /////////////////////////////////8'd92: // send "Set DDRAM address" ///// begin DB <= 4'hC; rs <= 1'b0; reset <= 1'b1; end/////8'd94: // send "Set DDRAM address" ///// begin DB <= 4'h1; rs <= 1'b0; reset <= 1'b1; end/////////////////////////////////////////////////////////////////8'd96: // Bbegin DB <= 4'h4; rs <= 1'b1; reset <= 1'b1; end8'd98:begin DB <= 4'h2; rs <= 1'b1; reset <= 1'b1; end8'd100: // send :begin DB <= 4'h3; rs <= 1'b1; reset <= 1'b1; end8'd102:begin DB <= 4'hA; rs <= 1'b1; reset <= 1'b1; end8'd104: // send b_count[7:4]begin DB <= 4'h3; rs <= 1'b1; reset <= 1'b1; end8'd106:begin DB <=b_count[7:4]; rs <= 1'b1; reset <= 1'b1; end8'd108: // send b_count[3:0]begin DB <= 4'h3; rs <= 1'b1; reset <= 1'b1; end8'd110:begin DB <=b_count[3:0]; rs <= 1'b1; reset <= 1'b1; enddefault: begin DB <= 4'h0; rs <= 1'b0; reset <= 1'b0; end endcaseend// cmd_counter to make the right time_control for LCD_TIMEreg[7:0] cmd_counter ;always @ ( posedge clk or posedge rst)beginif(rst)beginLCD_DB <= 0;LCD_RS <= 0;LCD_E <= 0;LCD_RW <= 0;endelsebeginif(reset)beginLCD_DB <= DB ;LCD_RS <= rs ;LCD_E <= 0 ;LCD_RW <= 0 ;endelsebeginif ( cmd_counter == 2 )LCD_E <= 1 ;elseif ( cmd_counter == 10 )LCD_E <= 0 ;endend// control of cmd_counteralways @ ( posedge clk )beginif ( reset )cmd_counter <= 0;elseif ( cmd_counter != 10)begincmd_counter <= cmd_counter + 1 ;endendendmodule交通灯各灯转换及计数模块:`timescale 10ps/1psmoduletransport1(clk,rst,a_count,b_count,a_red,a_green,a_yellow,b_red,b_green,b_yellow,a_left,b_left);input clk,rst;output[7:0] a_count,b_count;output a_red,a_green,a_yellow,b_red,b_green,b_yellow,a_left,b_left;reg a_red,a_green,a_yellow,b_red,b_green,b_yellow,a_left,b_left;reg [7:0] a_count,b_count;reg [2:0] state;parameterstate0=3'b000,state1=3'b001,state2=3'b010,state3=3'b011,state4=3'b100,state5=3'b101,state6=110 ;parametera_red_cnt=8'b00011001,a_green_cnt=8'b00010011,a_yellow_cnt=8'b00000011,a_left_cnt=8'b000 00101;parameterb_red_cnt=8'b00100011,b_green_cnt=8'b00001001,b_yellow_cnt=8'b00000011,b_left_cnt=8'b00 000101;reg [7:0] cnt_1;reg [7:0] cnt_2;reg [7:0] cnt_3;reg [1:0] cnt_4;reg c1,c2,c3;reg pluse;always@(posedge clk or posedge rst)if(rst)a_count<=a_green_cnt;b_count<=b_red_cnt;state<=state0;endelsebeginif(pluse==1)case(state)state0: beginif(a_count==8'd0)begina_count<=a_yellow_cnt;b_count<=b_count-1;state<=state1;endelseif(a_count[3:0]==0)begina_count[3:0]<=8'd9;a_count[7:4]<=a_count[7:4]-1;endelsea_count<=a_count-1;if(b_count[3:0]==0)beginb_count[3:0]<=8'd9;b_count[7:4]<=b_count[7:4]-1;endelseb_count<=b_count-1;endstate1: beginif(a_count==0)beginstate<=state2;b_count<=b_count-1;a_count<=a_left_cnt;endelsebeginif(a_count[3:0]==0)begina_count[3:0]<=8'd9;a_count[7:4]<=a_count[7:4]-1;endelsea_count<=a_count-1;if(b_count[3:0]==0)beginb_count[3:0]<=8'd9;b_count[7:4]<=b_count[7:4]-1;endelseb_count<=b_count-1;endendstate2: beginif(a_count==0||b_count==0)beginstate<=state3;a_count<=a_red_cnt;b_count<=b_green_cnt;endelsebeginif(a_count[3:0]==0)begina_count[3:0]<=8'd9;a_count[7:4]<=a_count[7:4]-1;endelsea_count<=a_count-1;if(b_count[3:0]==0)beginb_count[3:0]<=8'd9;b_count[7:4]<=b_count[7:4]-1;endelseb_count<=b_count-1;endend //state3: beginif(b_count==0)beginstate<=state4;b_count<=b_yellow_cnt;a_count<=a_count-1;if(a_count[3:0]==0)begina_count[3:0]<=8'd9;a_count[7:4]<=a_count[7:4]-1;endendelsebeginif(a_count[3:0]==0)begina_count[3:0]<=8'd9;a_count[7:4]<=a_count[7:4]-1;endelsea_count<=a_count-1;if(b_count[3:0]==0)beginb_count[3:0]<=8'd9;b_count[7:4]<=b_count[7:4]-1;endelseb_count<=b_count-1;endendstate4: beginif(b_count==0)beginstate<=state5;a_count<=a_count-1;b_count<=b_left_cnt;endelsebeginif(a_count[3:0]==0)begina_count[3:0]<=8'd9;a_count[7:4]<=a_count[7:4]-1;endelsea_count<=a_count-1;if(b_count[3:0]==0)beginb_count[3:0]<=8'd9;b_count[7:4]<=b_count[7:4]-1;endelseb_count<=b_count-1;endendstate5: beginif(b_count==0||a_count==0)beginstate<=state0;a_count<=a_green_cnt;b_count<=b_red_cnt;endelsebeginif(a_count[3:0]==0)begina_count[3:0]<=8'd9;a_count[7:4]<=a_count[7:4]-1;endelsea_count<=a_count-1;if(b_count[3:0]==0)beginb_count[3:0]<=8'd9;b_count[7:4]<=b_count[7:4]-1;endelseb_count<=b_count-1;endenddefault: begina_count<=a_green_cnt;b_count<=b_red_cnt;state<=state0;endendcaseendalways@(state)begincase(state)state0:{a_red,a_green,a_yellow,a_left,b_red,b_green,b_yellow,b_left}=8'b01001000;state1:{a_red,a_green,a_yellow,a_left,b_red,b_green,b_yellow,b_left}=8'b00101000;state2:{a_red,a_green,a_yellow,a_left,b_red,b_green,b_yellow,b_left}=8'b00011000;state3:{a_red,a_green,a_yellow,a_left,b_red,b_green,b_yellow,b_left}=8'b10000100;state4:{a_red,a_green,a_yellow,a_left,b_red,b_green,b_yellow,b_left}=8'b10000010;state5:{a_red,a_green,a_yellow,a_left,b_red,b_green,b_yellow,b_left}=8'b10000001;default:{a_red,a_green,a_yellow,a_left,b_red,b_green,b_yellow,b_left}=8'b01001000;endcaseendalways @(posedge clk or posedge rst)if (rst)cnt_1 <= 0;elsecnt_1 <= cnt_1+1;always @(posedge clk )c1 <= (cnt_1 == 8'd254);always @(posedge clk or posedge rst)if (rst)cnt_2 <= 8'h0;else if (c1)cnt_2 <= cnt_2 + 1;always @(posedge clk)c2 <= cnt_2 == 8'd254;always @(posedge clk or posedge rst)if (rst)cnt_3 <= 8'h 0;else if (c1 & c2)cnt_3 <= cnt_3 + 1;always @(posedge clk)c3 <= cnt_3 == 8'd254;always @(posedge clk or posedge rst)if (rst)cnt_4 <= 2'h 0;else if (c1 && c2 && c3 && (cnt_4 == 2'b10))cnt_4 <= 2'h 0;else if (c1 && c2 && c3)cnt_4 <= cnt_4 + 1;always @(posedge clk )pluse<= ((cnt_4 == 2'b 10) && c1 && c2 && c3);endmodule按键源程序:module key(clk,key,out);input clk;input key;output out;reg key_rst=1'b0;always@(posedge clk)key_rst<=key;reg key_rst_r=1'b0;always@(posedge clk)key_rst_r<=key_rst;wire key_an=key_rst_r & (~key_rst); reg [19:0] cnt=20'd0;always @ (posedge clk)if(key_an==1'd1)cnt<=20'd0;elsecnt<=cnt+1'b1;reg low_sw=1'b0;always @(posedge clk)if(cnt==20'hfffff)low_sw<=key;reg low_sw_r=1'b0;always @ (posedge clk)low_sw_r<=low_sw;wire ctr=low_sw_r& (~low_sw);reg d1=1'b0;always @ (posedge clk)beginif(ctr)d1<=~d1;endassign out=d1? 1'b1 : 1'b0; endmodule测试激励源程序:module test_transport;reg clk;reg key;wire a_red,a_green,a_yellow,a_left,b_red,b_green,b_yellow,b_left;wire [7:0] a_count,b_count;transport1 transport(.clk(clk),.key(key),.a_red(ared), .a_green(agreen),.a_yellow(ayellow),.a_left(aleft),.b_red(bred), .b_green(bgreen),.b_yellow(byellow),.b_left(bleft),.a_count(a_count),.b_count(b_count));always #2 clk=~clk;initialbegin$monitor($time,"clk=%b,key=%b,a_red=%b,a_green=%b,a_yellow=%b,a_left=%b,b_red=%b,b_ green=%b,b_yellow=%b,b_left=%b,a_count=%b,b_count=%b",clk,key,a_red,a_green,a_yellow, a_left,b_red,b_green,b_yellow,b_left,a_count,b_count);endinitialbeginclk=1; key=1;#200 key=0;#500000 key=1;endendmodule。
基于FPGA的交通灯控制器设计21674
数字系统课程设计基于FPGA的交通控制灯设计姓名:学号:班级:摘要随着社会的发展,城市规模的不断扩大,城市交通成为制约城市发展的一大因素。
人口和汽车日益增长,市区交通也日益拥挤,人们的安全问题当然也日益重要。
因此,红绿交通信号灯成为交管部门管理交通的重要工具之一。
有了交通灯,人们的安全出行也有了很大的保障。
自从交通灯诞生以来,其内部的电路控制系统就不断的被改进,设计方法也开始多种多样,从而使交通灯显得更加智能化。
尤其是近几年来,随着电子与计算机技术的飞速发展,电子电路分析和设计方法有了很大的改进,电子设计自动化也已经成为现代电子系统中不可或缺的工具和手段,这些都为交通灯控制系统的设计提供了一定的技术基础。
本课程设计运用erilog HDL语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示,并最后进行了软件实现,达到了系统要求的功能。
设计原理设计要求设计一个交通控制器,用LED 显示灯表示交通状态,并以7段数码显示器显示当前状态剩余秒数 主干道绿灯亮时,支干道红灯亮;反之亦然,二者交替允许通行,主干道每次放行35s ,支干道每次放行25s 。
每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为5s 。
能进行特殊状态显示,特殊状态时东西、南北路口均显示红灯状态。
用LED 灯显示倒计时,并且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。
能实现特殊状态的功能显示, 设计思路和原理本次设计是针对十字路口,进行南北和东西直行情况下交通灯控制。
设定东西方向为主干道方向,根据交通灯的亮的规则,在初始状态下四个方向的都为红灯亮启,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续35S 后,主干道和支干道上的黄灯都亮启,持续5S 后,主干道上红灯亮启,支干道上绿灯亮启持续25S ,之后主干道和支干道上的黄灯都亮启5s ,一个循环完成。
循环往复的直行这个过程。
基于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的脉冲。
基于FPGA的交通信号灯课程设计(以VHDL语言实现)
基于FPGA的数字电子技术课程设计(以VHDL语言实现)课题:交通信号灯设计题目:1.由主干道A和支干道B的汇合点形成十字交叉路口,在交叉路口处设有红绿黄三色信号灯。
红灯亮禁止通行;绿灯亮允许通行;黄灯亮则让行驶到路口的车辆有时间停靠到禁止线外。
用两位数码管显示当前主支干道所处的状态。
红黄绿分别用R,Y,G表示。
2.主干道车辆较多,所以绿灯亮灯时间为50S;支干道亮绿灯时间设为30S。
当主干道允许通行亮绿灯时则支干道亮红灯;支干道亮绿灯时也相反。
每次由绿灯转变为红灯时,期间要亮5S的黄灯。
3.交通灯正常运行时,用四位数码管显示主干道和支干道的倒计时时间。
4.能实现系统总清0,清0后计数器由初始状态开始计数。
5.具有一定的扩展功能。
一.设计思路1.根据设计题目要求可以得出交通信号灯控制器的设计用“状态法”来实现较好,因此先划分出交通灯显示时的几个较大的状态。
设状态用S表示。
S0:主干道亮黄灯支干道亮红灯亮灯5SS1:主干道亮红灯支干道亮绿灯亮灯30SS2:主干道亮红灯支干道亮黄灯亮灯5SS3:主干道亮绿灯支干道亮红灯亮灯50S状态之间应该要能实现循环:S0=>S1=>S2=>S3=>S02.然后再考虑在每个状态下要能够实现的功能。
根据题目可知在每个状态下要能实现将交通灯的颜色变换以字母的形式显示在两位数码管上,每位各表示一条道路。
在交通灯颜色输出的同时还要能够实现计数的输出,也就是各路灯转换前剩余的时间量。
3.在实现了各个状态下的功能后就要考虑加上清0功能与紧急功能,清0也就是复位功能。
在复位时实现系统清0,并且清0后计数器从初始状态开始计时,在此将S0状态视为初始状态。
也就是清0完毕后系统进入S0状态。
课题中将紧急功能设为两条路都显示红灯,并且计数器全置0。
4.这些实现的功能都加入后就可以对所写的VHDL语言进行测试与仿真了。
在其中实现对所写语言的改进和完善,并得到仿真图结合仿真图再进行修改。
基于FPGA的交通灯控制器设计06876
基于FPGA的交通灯控制器设计06876交通灯控制器是城市交通系统中非常重要的一部分,其正确的设计和运行对于交通的安全与效率至关重要。
在本文中,我们将介绍一种基于FPGA(现场可编程门阵列)的交通灯控制器设计。
首先,我们需要了解交通灯控制器的基本原理。
传统的交通灯控制器通常由定时器和状态机组成。
定时器用于控制信号灯的时间段,状态机用于根据规定的时间段和信号灯的状态切换来确定交通灯的工作状态。
FPGA是一种可编程的芯片,可以用来实现各种数字电路的功能。
它具有高度的可编程性和灵活性,可以通过改变编程来实现不同的功能。
基于FPGA的交通灯控制器设计可以提供更大的灵活性和可扩展性,因为它可以根据实际需求进行定制和修改。
在基于FPGA的交通灯控制器设计中,我们需要考虑以下几个方面:1.信号灯的时间控制:根据不同的道路交通流量和需要的通行效率,我们可以灵活地设置每个信号灯的时长。
这可以通过FPGA中的计数器和定时器来实现。
通过编程可以设置不同的时长,并确保相应的信号灯按照预定的规则进行切换。
2.交通流量检测:为了合理地分配交通灯的时间,我们需要在交通道路上安装传感器来检测交通流量。
这些传感器可以根据车辆的数量和速度来确定不同的交通流量。
在基于FPGA的设计中,我们可以使用IO接口将传感器与FPGA相连,并通过编程来读取和处理传感器数据。
3. 状态机设计:状态机是交通灯控制的核心。
它可以根据预先确定的规则和输入,确定交通灯的状态。
基于FPGA的设计中,我们可以使用状态机设计的编程语言(如VHDL或Verilog)来实现状态机。
状态机可以根据交通流量和交通灯状态的不同情况来切换不同的状态,并通过FPGA中的逻辑门来控制交通灯。
4.故障检测和容错设计:在交通灯控制器中,故障检测和容错设计非常重要。
当一些部件发生故障时,控制器应能够自动切换到备用部件或安全模式,以确保交通的安全和通行效率。
通过FPGA的灵活性,我们可以轻松地实现故障检测和容错设计,例如通过监测一些部件的输出电压或信号来检测故障。
基于FPGA的交通灯控制器设计(VHDl代码全,各个模块均调.
2.3 FPGA 主控实现方案设计结合已有的 PLC 实现和单片机应用实现的经验,并吸收两种设计的优势之处,再根据交通灯控制系统的设计要求和 FPGA 模块化功能实现,确定了以下方案,因每个方向相对的信号灯状态及倒计时显示器的显示完全一致,根据设计要求和系统所具有的功能,交通灯控制器系统框图如图 2-6 所示。
图 2-6 交通灯控制器系统框图确定的方案中, 系统具有复位功能, 能使系统重新开始计时; 在红绿灯交通信号系统中, 大多数的情况是通过自动控制的方式指挥交通的, 但为了配合高峰时段,防止交通拥挤,有时还必须使用手动控制。
为此主体包括系统复位,手动 /自动,红绿灯切换,主控模块,显示器,报警器。
具体主控部分用 FPGA 来实现。
图 2-7 交通灯通行示意图结合实现方案,主要有东西、南北、南北左拐,东西左拐,跟手动控制 5种工作方式,具体由 M2~M0设定,具体如表 2-1。
表2-1 交通灯工作方式表方式 M2(0:自动, 1:手动 M1(0:A向,1:B向M0(O:直行, 1:左拐1 0 0 02 0 0 13 0 1 04 0 1 15 1 * *当出现特殊情况时,可选择方式 1 到方式 4 中的任何一种方式,停止正常运行,进入特殊运行状态。
此时交通灯按工作方式显示,计时电路停止计时,计时时间闪烁显示。
当系统总复位时,控制电路和计时电路复位,信号灯全部熄灭。
3 各功能模块的设计与实现3.1总体设计思路3.1.1系统组成框图结合设计任务要求和确定的实现方案, 假设某个十字路口是由一条主干道和一条次干道回合而成, 在每个方向设置红绿黄 3种信号灯, 红灯亮禁止通行, 绿灯亮允许通行。
黄灯亮允许行驶中车辆有时间停考到禁止线以外。
按照自顶向下的层次化设计方法, 整个系统可分为 4个模块, 系统时序发生电路、红绿灯计数时间选择模块、定时控制电路、红绿灯信号译码电路。
其系统组成方框图如图 3-1所示。
《FPGA系统设计》实验报告》交通灯控制系统的设计实验
《FPGA系统设计》实验报告》交通灯控制系统的设计实验一 .实验目的了解交通灯及控制系统的控制及其显示模块。
二.实验要求1.交通灯从绿色变成红色时,要经过黄色的过渡,黄色灯亮的时间为5秒:2.交通灯从红色变成绿色时,不要需要经过黄色灯的过渡,直接由红色变成绿色,绿色灯点亮的时间为25秒,红色灯点亮的时间为20秒;3.各种灯点亮时,要实现时间的倒计时显示。
三.实验操作步骤假设十字路口的方向为xy两方向,对两个方向需要两个控制模块来控制交通灯的点亮,还需要时间倒计时显示,即需要显示模块,因此系统的总设计模块图由三大模块组成,分别是xy两方向的控制模块,显示模块。
其中显示模块又由三个子模块构成,分别是数码管选择模块,数据分配模块,数码管驱动模块。
控制模块的设计控制模块是控制系统的核心部分,它实现了交通灯的三种颜色的交替点亮和时间倒计时的控制。
x方向控制代码如下:LIBRARY IEEE;USE IEEE .STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CORNA ISPORT (CLK:IN STD_LOGIC;R,G,Y:OUT STD_LOGIC;TIMH,TIML:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END CORNA;ARCHITECTURE CORNER OF CORNA ISTYPE RGY IS (GREEN,YELLOW,RED);BEGINPROCESS(CLK)VARIABLE A:STD_LOGIC;VARIABLE TH,TL:STD_LOGIC_VECTOR(3 DOWNTO 0);VARIABLE STATE:RGY;BEGINIF(CLK'EVENT AND CLK='1')THENCASE STATE ISWHEN GREEN=>IF A='0'THENTH:="0001";TL:="1001";A:='1';G<='1';R<='0';Y<='0';ELSEIF NOT(TH="0000" AND TL="0001")THENIF TL="0000" THENTL:="1001";TH:=TH-1;ELSETL:=TL-1;END IF;ELSETH:="0000";TL:="0000";A:='0';STATE:=YELLOW;END IF;END IF;WHEN YELLOW=>IF A='0' THENTH:="0000";TL:="0100";A:'1';Y<='1';G<='0';R<='0';ELSEIF NOT(TH="0000" AND TL="0001")THEN TL:=TL-1;ELSETH:="0000" ;TL:="0000";A:='0';STATE:=RED;END IF;END IF;WHEN RED=>IF A='0' THENTH:="0010";TL:="0100";A:='1';R<='1';Y<='0';G<='0';ELSEIF NOT(TH="0000" AND TL="0001")THEN IF TL="0000"THENTL:="1001";TH:=TH-1;ELSETL:=TL-1;END IF;ELSETH:="0000";TL:="0000";A:='0';STATE:=GREENEND IF;END IF;END CASE;END IF;TIMH<=TH;TIML<=TL;END PROCESS;END CORNER;在以上程序中,实体部分定义的输入时钟信号clk为1Hz的脉冲信号,r、g、y为接水通灯的信号,timh 和timl为时间显示信号的十位和个位值。
基于FPGA的交通信号灯设计说明
《 CPLD/FPGA设计及应用课程设计》课程设计报告题目:基于FPGA的交通信号灯设计院(系):信息科学与工程学院专业班级:通信工程学生:20 16 年 03 月 14 日至20 16 年 04 月 8 日目录一设计目的 (1)1.交通灯介绍 (2)2. EDA技术的发展 (2)3. 基于FPGA的交通灯的优点 (3)二设计过程 (4)1.总体设计思路 (4)2.总体设计模块 (5)3. 控制电路的模块VHDL设计实现 (6)3.1分频模块 (6)3.2定时模块 (7)3.3状态转换模块 (8)3.4 禁止通行模块 (12)3.5显示模块 (14)4.硬件电路设计与调试 (16)三实验总结 (17)参考文献 (17)附录一(程序代码) (18)一设计目的引言:随着社会和汽车工业的快速发展,近几年机动车辆急剧增加,道路超负荷承载现象日趋严重,致使交通事故逐年增加。
交通信号灯是城市交通有序、安全、快速运行的重要保障,而交通信号灯的正常工作就成了保障交通有序、安全、快速运行的关键。
如何实现人、车、路三者关系的协调,已成为交通管理部门需要切实解决的问题。
该设计分析了现代城市交通控制与管理问题的现状,结合城乡交通的实际情况阐述了交通灯控制系统的工作原理,采用了层次化的设计方法,基于VHDL语言实现红绿灯的自动指挥的硬件实现方法。
通过电路优化设计,可以使用规模更小的可编程逻辑芯片,从而降低系统成本。
该设计是针对交通信号灯控制器的设计问题,采用EDA技术实现的交通灯控制电路的设计方案。
本设计有效的克服了传统的交通灯控制的缺点而采取自上而下的设计思路。
该设计在软件QuartusⅡ11.0下应用硬件描述语言VHDL语言完成设计文件,并对其进行了功能仿真和时序仿真,且给出了相应的仿真结果,绘制出了具体的逻辑电路,最后将其下载到Alter公司生产的CycloneⅡ系列的EP2C8Q208开发板上进行逻辑验证,实现软件和硬件的安全连接,达到了对交通灯的自动安全控制的目的。
(完整版)FPGA毕业课程设计--交通灯
目录1.设计思路 (1)1.1设计思想 (1)1.2 系统功能与要求 (1)1.3总体设计 (2)2.主要模块设计程序 (4)2.1时基脉冲发生模块 (4)2.2技术及红绿灯控制模块 (5)2.3译码模块 (9)2.4主程序 (11)3. 所实现功能说明 (14)3.1实现功能 (14)3.2仿真波形 (14)4. 所设计原理图及故障分析 (15)5.心得体会 (17)参考文献 (18)附录1 元件清单 (19)附录2 管脚 (20)1.设计思路1.1设计思想交通灯是城市交通监管系统的重要组成部分,对于保证机动车辆的安全运行,维持城市道路的顺畅起到了重要作用。
目前很多城市交叉路口的交通灯实行的是定时控制,灯亮的时间是预先设定好的,在时间和空间方面的应变性能较差,一定程度上造成了交通资源的浪费,加重了道路交通压力。
本文在EDA技术的基础上,利用FPGA的相关知识设计了交通灯控制系统,可以根据实际情况对灯亮时间进行自由调整,整个设计系统通过Max+PlusⅡ软件进行了模拟仿真,并下载到FPGA器件中进行硬件的调试,验证了设计的交通信号灯控制电路完全可以实现预定的功能,具有一定的实用性。
1.2 系统功能与要求交通灯控制器控制两个主干道交叉路口的交通,路口车辆多,直行信号、左转弯信号分开显示,a,b两个主干道的通行时间相等,其中指示直行的绿灯亮30 s,指示左转弯的绿灯亮12 s,绿灯变至红灯时,黄灯亮3 s,以便于车辆能停在停车线内,红灯信号的最后 3 s相应的黄灯也同时亮,以便提示驾驶人员准备起步。
在两个主干道路口都配备传感器用来检测有无车辆通行。
当两个主干道都有车辆时,自动处于主干道a绿灯,主干道b红灯的状态,然后轮流切换通行。
当主干道a无车辆时,自动处于主干道b绿灯,主干道a红灯的状态;反之亦然,以提高通行效率。
所设计的交通信号灯控制电路,主要适用于在两条干道汇合点形成的十字交叉路口,路口设计两组红绿灯分别对两个方向上的交通运行状态进行管理。
FPGA交通灯仿真及代码
控制模块设计`timescale 1ns/1nsmodule M_control(clk,rst,Leds,S_M,G_M,S_B,G_B);input rst,clk; //Time clock and resetoutput [7:0]Leds; //mainroad lights L R Y G, Branch lights L R Y G.output[3:0] S_M,G_M,S_B,G_B;//S_M main road shiwei G_M is mainrod gewei//S_B main road shiwei G_B is mainrod geweireg [7:0]Leds;reg[3:0] S_M,G_M,S_B,G_B;reg [7:0]state; //S1?S2...S8reg [6:0] count1,count2; //count1 main, road count2 branchparameter S1=8'b0_0_0_0_0_0_0_1,S2=8'b0_0_0_0_0_0_1_0,S3=8'b0_0_0_0_0_1_0_0,S4=8'b0_0_0_0_1_0_0_0,S5=8'b0_0_0_1_0_0_0_0,S6=8'b0_0_1_0_0_0_0_0,S7=8'b0_1_0_0_0_0_0_0,S8=8'b1_0_0_0_0_0_0_1;//-------------------------------------------------------------------always (posedge clk or posedge rst)beginif(rst)beginS_M<=0;G_M<=0;S_B<=0;G_B<=0;state<=S1;Leds<=8'b00010100;count1<=44;count2<=64;endelse begincase (state)S1: if(count1==0)beginstate<=S2;Leds<=8'b00100100; //main road yellow branch redcount1<=4;count2<=count2-1;endelse begincount1<=count1-1;count2<=count2-1;endS2: if(count1==0)beginstate<=S3;Leds<=8'b10000100; //main road Turn Left branch redcount1<=9;count2<=count2-1;endelse begincount1<=count1-1;count2<=count2-1;endS3: if(count1==0)beginstate<=S4;Leds<=8'b00100100; //main road yellow branch redcount1<=4;count2<=count2-1;endelse begincount1<=count1-1;count2<=count2-1;endS4: if (count1==0 && count2==0)beginstate<=S5;Leds<=8'b01000001; //main road red branch greencount1<=59;count2<=19;endelse begincount1<=count1-1;count2<=count2-1;endS5: if (count2==0)beginstate<=S6;Leds<=8'b01000010; //main road red branch yellowcount1<=count1-1;count2<=4;endelse begincount1<=count1-1;count2<=count2-1;endS6: if (count2==0) beginstate<=S7;Leds<=8'b01001000; // main road red branch turn leftcount1<=count1-1;count2<=9;endelse begincount1<=count1-1;count2<=count2-1;endS7: if (count2==0) beginstate<=S8;Leds<=8'b01000010; //main road red branch yellow count1<=count1-1;count2<=4;endelse begincount1<=count1-1;count2<=count2-1;endS8: if (count1==0 && count2==0) beginstate<=S1;Leds<=8'b00010100; //main road green branch redcount1<=44;count2<=64;endelse begincount1<=count1-1;count2<=count2-1;enddefault: beginstate<=S1;Leds<=8'b00010100; //main road green branch redcount1<=44;count2<=64;endendcaseendendalways (posedge clk)beginS_M<=count1/10;G_M<=count1%10;S_B<=count2/10;G_B<=count2%10;endendmodule显示模块源代码`timescale 1ns/1nsmodule xianshi( clk,rst,S_M,G_M,S_B,G_B,sel1,sel2,sel3,sel4); input clk,rst;input[3:0] S_M,G_M,S_B,G_B;output[6:0]sel1,sel2,sel3,sel4;reg[6:0]sel1,sel2,sel3,sel4;always(posedge rst or posedge clk)beginif(rst)beginsel1=7'b0000000;sel2=7'b0000000;sel3=7'b0000000;sel4=7'b0000000;endelsebegincase(S_M)4'b0000:sel1=7'b1111110;4'b0001:sel1=7'b0110000;4'b0010:sel1=7'b1101101;4'b0011:sel1=7'b1111001;4'b0100:sel1=7'b0110011;4'b0101:sel1=7'b1011011;4'b0110:sel1=7'b1011111;4'b0111:sel1=7'b1110000;4'b1000:sel1=7'b1111111;4'b1001:sel1=7'b1111011;default:sel1=7'b1111110; endcasecase(G_M)4'b0000:sel2=7'b1111110;4'b0001:sel2=7'b0110000;4'b0010:sel2=7'b1101101;4'b0011:sel2=7'b1111001;4'b0100:sel2=7'b0110011;4'b0101:sel2=7'b1011011;4'b0110:sel2=7'b1011111;4'b0111:sel2=7'b1110000;4'b1000:sel2=7'b1111111;4'b1001:sel2=7'b1111011;default:sel2=7'b1111110; endcasecase(S_B)4'b0000:sel3=7'b1111110;4'b0001:sel3=7'b0110000;4'b0010:sel3=7'b1101101;4'b0011:sel3=7'b1111001;4'b0100:sel3=7'b0110011;4'b0101:sel3=7'b1011011;4'b0110:sel3=7'b1011111;4'b0111:sel3=7'b1110000;4'b1000:sel3=7'b1111111;4'b1001:sel3=7'b1111011;default:sel3=7'b1111110; endcasecase(G_B)4'b0000:sel4=7'b1111110;4'b0001:sel4=7'b0110000;4'b0010:sel4=7'b1101101;4'b0011:sel4=7'b1111001;4'b0100:sel4=7'b0110011;4'b0101:sel4=7'b1011011;4'b0110:sel4=7'b1011111;4'b0111:sel4=7'b1110000;4'b1000:sel4=7'b1111111;4'b1001:sel4=7'b1111011;default:sel4=7'b1111110;endcaseendendendmodule顶层模块`timescale 1ns/1nsmodule jiaotong(clk,rst,Leds,S_M,G_M,S_B,G_B,sel1,sel2,sel3,sel4,enable);input clk,rst,enable;output[7:0]Leds;output[3:0] S_M,G_M,S_B,G_B;output[6:0]sel1,sel2,sel3,sel4;wire[3:0] S_M,G_M,S_B,G_B,M_B;M_control control1(.clk(clk),.rst(rst),.Leds(Leds),.S_M(S_M),.G_M(G_M),.S_B(S_B),.G_B(G_B));xianshixianshi1(.clk(clk),.rst(rst),.S_M(S_M),.G_M(G_M),.S_B(S_B),.G_B(G_B),.sel1(sel1),.sel2(sel2),.sel 3(sel3),.sel4(sel4));Endmodule测试代码`timescale 1ns/1nsmodule testJT;reg clk,rst;wire[7:0]Leds;wire[3:0]S_M,G_M,S_B,G_B;wire[6:0]sel1,sel2,sel3,sel4;parameter clock=5;initialbeginclk=0;rst=0;#(2*clock);rst=1;#(4*clock);rst=0;#(800*clock);$stop;endalways #(clock) clk=~clk; jiaotong m1(clk,rst,Leds,S_M,G_M,S_B,G_B,sel1,sel2,sel3,sel4); endmodule仿真图:。
FPGA交通灯控制器设计程序代码
1. 文件头的中文注释程序清单 1 中文文件头/*****************************文件信息************************************ **文件名字:traffic.v**创建日期:2009-11-27**版本号:v1.0**功能描述:连接底层七个模块,形成一个交通灯控制系统************************************************************************/ 2. 模块的注释程序清单 2 模块注释//traffic.v//****************************文件信息************************************ //模块名称:参数定义//功能描述:定义各个参数//*********************************************************************** module traffic(CLK_48M, //48MHZ时钟EN, //使能信号,为1,控制器开始工作emergencya, //A方向紧急情况信号emergencyb, //B方向紧急情况信号controla, //控制A方向四盏灯的亮灭,分别为绿、左拐、黄和红灯 controlb, //控制B方向四盏灯的亮灭,分别为绿、左拐、黄和红灯 buzzera, //控制A方向紧急情况下的响铃,为1,响buzzerb, //控制B方向紧急情况下的响铃,为1,响dispdat1, //用于A方向的时间个位共阴数码管显示dispdat2, //用于A方向的时间十位共阴数码管显示dispdat3, //用于B方向的时间个位共阴数码管显示dispdat4 //用于B方向的时间十位共阴数码管显示);output [3:0] controla,controlb;output buzzera,buzzerb;output [6:0] dispdat1,dispdat2,dispdat3,dispdat4;input CLK_48M,EN;input emergencya,emergencyb;reg CLK1;reg [24:0] count; //计数器,用于分频reg [7:0] numa,numb; //numa,numb分别表示A,B方向的时间变量reg [7:0] ared,ayellow,agreen,aleft,bred,byellow,bgreen,bleft;reg [6:0] dispdat1,dispdat2,dispdat3,dispdat4;reg [3:0] controla,controlb;reg [2:0] counta; //counta表示A方向灯的状态reg [2:0] countb; //countb表示B方向灯的状态reg tempa; //tempa用于控制A方向的倒计时reg tempb; //tempb用于控制B方向的倒计时reg buzzera,buzzerb;//****************************文件信息************************************ //模块名称:分频模块//功能描述:把48MHZ时钟CLK_48M分频成1HZ时钟CLK1//*********************************************************************** always @(posedge CLK_48M)begincount=count+1;if(count==25'd2*******)begincount=25'b0000000000000000000000000;CLK1=~CLK1;endend//****************************文件信息************************************ //模块名称:置数模块//功能描述:设置各种灯的计数器的预置数//*********************************************************************** always @(EN)beginif(!EN)beginared <=8'd50; //A方向红灯50秒ayellow <=8'd5; //A方向黄灯5秒agreen <=8'd30; //A方向绿灯30秒aleft <=8'd10; //A方向左拐灯10秒bred <=8'd50; //B方向红灯50秒byellow <=8'd5; //B方向黄灯5秒bgreen <=8'd30; //B方向绿灯30秒bleft <=8'd10; //B方向左拐灯10秒endend//*****************************文件信息*********************************** //模块名称:A方向控制模块//功能描述:控制A方向紧急情况处理,四盏灯的亮灭及倒计时//*********************************************************************** always @(posedge CLK1)beginif(EN) //使能信号为1,A方向的控制器开始工作 beginif(emergencya==1&&emergencyb==0) //A方向出现紧急情况时,A方向的处理 begincontrola<=1;buzzera<=1;numa<=0;tempa<=0;counta<=0;endif(emergencya==0&&emergencyb==1) //B方向出现紧急情况时,A方向的处理 begincontrola<=8;buzzera<=0;numa<=0;tempa<=0;counta<=0;endif(emergencya==0&&emergencyb==0) //正常情况时,A方向的处理beginbuzzera<=0;if(!tempa) //tempa=0,A方向灯的状态转换开始begintempa<=1;case(counta)0: begin numa<=agreen; controla<=1; counta<=1; end1: begin numa<=ayellow; controla<=4; counta<=2; end2: begin numa<=aleft; controla<=2; counta<=3; end3: begin numa<=ayellow; controla<=4; counta<=4; end4: begin numa<=ared; controla<=8; counta<=0; enddefault: controla<=8;endcaseendelse //tempa=1,A方向的倒计时开始beginif(numa>1)numa<=numa-1;if(numa==2)tempa<=0;endendendelse //使能信号为0,A方向的控制器停止工作 begincontrola<=4'b1000;counta<=0;tempa<=0;endend//****************************文件信息************************************ //模块名称:B方向控制模块//功能描述:控制B方向紧急情况处理,四盏灯的亮灭及倒计时//*********************************************************************** always @(posedge CLK1)beginif(EN) //使能信号为1,B方向的控制器开始工作 beginif(emergencya==1&&emergencyb==0) //A方向出现紧急情况时,B方向的处理begincontrolb<=8;buzzerb<=0;numb<=0;tempb<=0;countb<=0;endif(emergencya==0&&emergencyb==1) //B方向出现紧急情况时,B方向的处理begincontrolb<=1;buzzerb<=1;numb<=0;tempb<=0;countb<=0;endif(emergencya==0&&emergencyb==0) //正常情况时,B方向的处理beginbuzzerb<=0;if(!tempb) //tempa=0,B方向灯的状态转换开始begintempb<=1;case (countb)0: begin numb<=bred; controlb<=8; countb<=1; end1: begin numb<=bgreen; controlb<=1; countb<=2; end2: begin numb<=byellow; controlb<=4; countb<=3; end3: begin numb<=bleft; controlb<=2; countb<=4; end4: begin numb<=byellow; controlb<=4; countb<=0; enddefault: controlb<=8;endcaseendelse //tempb=1,B方向的倒计时开始beginif(numb>1)numb<=numb-1;if(numb==2)tempb<=0;endendendelse //使能信号为0,B方向的控制器停止工作begincontrolb<=4'b1000;tempb<=0;countb<=0;endend//*********************************************************************** //模块名称:A方向灯的时间显示模块//功能描述:控制A方向时间的译码及数码管显示//*********************************************************************** always@(numa[0]or numa[1]or numa[2]or numa[3]or numa[4]or numa[5]or numa[6]) begincase(numa)8'd0:begin dispdat1<=7'b0111111;dispdat2<=7'b0111111;end8'd1:begin dispdat1<=7'b0000110;dispdat2<=7'b0111111;end8'd2:begin dispdat1<=7'b1011011;dispdat2<=7'b0111111;end8'd3:begin dispdat1<=7'b1001111;dispdat2<=7'b0111111;end8'd4:begin dispdat1<=7'b1100110;dispdat2<=7'b0111111;end8'd5:begin dispdat1<=7'b1101101;dispdat2<=7'b0111111;end8'd6:begin dispdat1<=7'b1111101;dispdat2<=7'b0111111;end8'd7:begin dispdat1<=7'b0000111;dispdat2<=7'b0111111;end8'd8:begin dispdat1<=7'b1111111;dispdat2<=7'b0111111;end8'd9:begin dispdat1<=7'b1101111;dispdat2<=7'b0111111;end8'd10:begin dispdat1<=7'b0111111;dispdat2<=7'b0000110;end8'd11:begin dispdat1<=7'b0000110;dispdat2<=7'b0000110;end8'd12:begin dispdat1<=7'b1011011;dispdat2<=7'b0000110;end8'd13:begin dispdat1<=7'b1001111;dispdat2<=7'b0000110;end8'd14:begin dispdat1<=7'b1100110;dispdat2<=7'b0000110;end8'd15:begin dispdat1<=7'b1101101;dispdat2<=7'b0000110;end8'd16:begin dispdat1<=7'b1111101;dispdat2<=7'b0000110;end8'd17:begin dispdat1<=7'b0000111;dispdat2<=7'b0000110;end8'd18:begin dispdat1<=7'b1111111;dispdat2<=7'b0000110;end8'd19:begin dispdat1<=7'b1101111;dispdat2<=7'b0000110;end8'd20:begin dispdat1<=7'b0111111;dispdat2<=7'b1011011;end8'd21:begin dispdat1<=7'b0000110;dispdat2<=7'b1011011;end8'd22:begin dispdat1<=7'b1011011;dispdat2<=7'b1011011;end8'd23:begin dispdat1<=7'b1001111;dispdat2<=7'b1011011;end8'd24:begin dispdat1<=7'b1100110;dispdat2<=7'b1011011;end8'd26:begin dispdat1<=7'b1111101;dispdat2<=7'b1011011;end8'd27:begin dispdat1<=7'b0000111;dispdat2<=7'b1011011;end8'd28:begin dispdat1<=7'b1111111;dispdat2<=7'b1011011;end8'd29:begin dispdat1<=7'b1101111;dispdat2<=7'b1011011;end8'd30:begin dispdat1<=7'b0111111;dispdat2<=7'b1001111;end8'd31:begin dispdat1<=7'b0000110;dispdat2<=7'b1001111;end8'd32:begin dispdat1<=7'b1011011;dispdat2<=7'b1001111;end8'd33:begin dispdat1<=7'b1001111;dispdat2<=7'b1001111;end8'd34:begin dispdat1<=7'b1100110;dispdat2<=7'b1001111;end8'd35:begin dispdat1<=7'b1101101;dispdat2<=7'b1001111;end8'd36:begin dispdat1<=7'b1111101;dispdat2<=7'b1001111;end8'd37:begin dispdat1<=7'b0000111;dispdat2<=7'b1001111;end8'd38:begin dispdat1<=7'b1111111;dispdat2<=7'b1001111;end8'd39:begin dispdat1<=7'b1101111;dispdat2<=7'b1001111;end8'd40:begin dispdat1<=7'b0111111;dispdat2<=7'b1100110;end8'd41:begin dispdat1<=7'b0000110;dispdat2<=7'b1100110;end8'd42:begin dispdat1<=7'b1011011;dispdat2<=7'b1100110;end8'd43:begin dispdat1<=7'b1001111;dispdat2<=7'b1100110;end8'd44:begin dispdat1<=7'b1100110;dispdat2<=7'b1100110;end8'd45:begin dispdat1<=7'b1101101;dispdat2<=7'b1100110;end8'd46:begin dispdat1<=7'b1111101;dispdat2<=7'b1100110;end8'd47:begin dispdat1<=7'b0000111;dispdat2<=7'b1100110;end8'd48:begin dispdat1<=7'b1111111;dispdat2<=7'b1100110;end8'd49:begin dispdat1<=7'b1101111;dispdat2<=7'b1100110;end8'd50:begin dispdat1<=7'b0111111;dispdat2<=7'b1101101;enddefault:begin dispdat1<=7'b0111111;dispdat2<=7'b0111111;endendcaseend//*********************************************************************** //模块名称:B方向灯的时间显示模块//功能描述:控制B方向时间的译码及数码管显示//*********************************************************************** always@(numb[0]or numb[1]or numb[2]or numb[3]or numb[4]or numb[5]or numb[6]) begincase(numb)8'd0:begin dispdat3<=7'b0111111;dispdat4<=7'b0111111;end8'd1:begin dispdat3<=7'b0000110;dispdat4<=7'b0111111;end8'd2:begin dispdat3<=7'b1011011;dispdat4<=7'b0111111;end8'd3:begin dispdat3<=7'b1001111;dispdat4<=7'b0111111;end8'd4:begin dispdat3<=7'b1100110;dispdat4<=7'b0111111;end8'd5:begin dispdat3<=7'b1101101;dispdat4<=7'b0111111;end8'd6:begin dispdat3<=7'b1111101;dispdat4<=7'b0111111;end8'd7:begin dispdat3<=7'b0000111;dispdat4<=7'b0111111;end8'd9:begin dispdat3<=7'b1101111;dispdat4<=7'b0111111;end8'd10:begin dispdat3<=7'b0111111;dispdat4<=7'b0000110;end8'd11:begin dispdat3<=7'b0000110;dispdat4<=7'b0000110;end8'd12:begin dispdat3<=7'b1011011;dispdat4<=7'b0000110;end8'd13:begin dispdat3<=7'b1001111;dispdat4<=7'b0000110;end8'd14:begin dispdat3<=7'b1100110;dispdat4<=7'b0000110;end8'd15:begin dispdat3<=7'b1101101;dispdat4<=7'b0000110;end8'd16:begin dispdat3<=7'b1111101;dispdat4<=7'b0000110;end8'd17:begin dispdat3<=7'b0000111;dispdat4<=7'b0000110;end8'd18:begin dispdat3<=7'b1111111;dispdat4<=7'b0000110;end8'd19:begin dispdat3<=7'b1101111;dispdat4<=7'b0000110;end8'd20:begin dispdat3<=7'b0111111;dispdat4<=7'b1011011;end8'd21:begin dispdat3<=7'b0000110;dispdat4<=7'b1011011;end8'd22:begin dispdat3<=7'b1011011;dispdat4<=7'b1011011;end8'd23:begin dispdat3<=7'b1001111;dispdat4<=7'b1011011;end8'd24:begin dispdat3<=7'b1100110;dispdat4<=7'b1011011;end8'd25:begin dispdat3<=7'b1101101;dispdat4<=7'b1011011;end8'd26:begin dispdat3<=7'b1111101;dispdat4<=7'b1011011;end8'd27:begin dispdat3<=7'b0000111;dispdat4<=7'b1011011;end8'd28:begin dispdat3<=7'b1111111;dispdat4<=7'b1011011;end8'd29:begin dispdat3<=7'b1101111;dispdat4<=7'b1011011;end8'd30:begin dispdat3<=7'b0111111;dispdat4<=7'b1001111;end8'd31:begin dispdat3<=7'b0000110;dispdat4<=7'b1001111;end8'd32:begin dispdat3<=7'b1011011;dispdat4<=7'b1001111;end8'd33:begin dispdat3<=7'b1001111;dispdat4<=7'b1001111;end8'd34:begin dispdat3<=7'b1100110;dispdat4<=7'b1001111;end8'd35:begin dispdat3<=7'b1101101;dispdat4<=7'b1001111;end8'd36:begin dispdat3<=7'b1111101;dispdat4<=7'b1001111;end8'd37:begin dispdat3<=7'b0000111;dispdat4<=7'b1001111;end8'd38:begin dispdat3<=7'b1111111;dispdat4<=7'b1001111;end8'd39:begin dispdat3<=7'b1101111;dispdat4<=7'b1001111;end8'd40:begin dispdat3<=7'b0111111;dispdat4<=7'b1100110;end8'd41:begin dispdat3<=7'b0000110;dispdat4<=7'b1100110;end8'd42:begin dispdat3<=7'b1011011;dispdat4<=7'b1100110;end8'd43:begin dispdat3<=7'b1001111;dispdat4<=7'b1100110;end8'd44:begin dispdat3<=7'b1100110;dispdat4<=7'b1100110;end8'd45:begin dispdat3<=7'b1101101;dispdat4<=7'b1100110;end8'd46:begin dispdat3<=7'b1111101;dispdat4<=7'b1100110;end8'd47:begin dispdat3<=7'b0000111;dispdat4<=7'b1100110;end8'd48:begin dispdat3<=7'b1111111;dispdat4<=7'b1100110;end8'd49:begin dispdat3<=7'b1101111;dispdat4<=7'b1100110;end8'd50:begin dispdat3<=7'b0111111;dispdat4<=7'b1101101;end default:begin dispdat3<=7'b0111111;dispdat4<=7'b0111111;endendcaseendendmodule//************************文件结束****************************************。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
控制模块设计`timescale 1ns/1nsmodule M_control(clk,rst,Leds,S_M,G_M,S_B,G_B);input rst,clk; //Time clock and resetoutput [7:0]Leds; //mainroad lights L R Y G, Branch lights L R Y G.output[3:0] S_M,G_M,S_B,G_B;//S_M main road shiwei G_M is mainrod gewei//S_B main road shiwei G_B is mainrod geweireg [7:0]Leds;reg[3:0] S_M,G_M,S_B,G_B;reg [7:0]state; //S1?S2...S8reg [6:0] count1,count2; //count1 main, road count2 branchparameter S1=8'b0_0_0_0_0_0_0_1,S2=8'b0_0_0_0_0_0_1_0,S3=8'b0_0_0_0_0_1_0_0,S4=8'b0_0_0_0_1_0_0_0,S5=8'b0_0_0_1_0_0_0_0,S6=8'b0_0_1_0_0_0_0_0,S7=8'b0_1_0_0_0_0_0_0,S8=8'b1_0_0_0_0_0_0_1;//------------------------------------------------------------------- always @(posedge clk or posedge rst)beginif(rst)beginS_M<=0;G_M<=0;S_B<=0;G_B<=0;state<=S1;Leds<=8'b00010100;count1<=44;count2<=64;endelse begincase (state)S1: if(count1==0)beginstate<=S2;Leds<=8'b00100100; //main road yellow branch redcount1<=4;count2<=count2-1;endelse begincount2<=count2-1;endS2: if(count1==0)beginstate<=S3;Leds<=8'b10000100; //main road Turn Left branch red count1<=9;count2<=count2-1;endelse begincount1<=count1-1;count2<=count2-1;endS3: if(count1==0)beginstate<=S4;Leds<=8'b00100100; //main road yellow branch redcount1<=4;count2<=count2-1;endelse begincount1<=count1-1;count2<=count2-1;endS4: if (count1==0 && count2==0)beginstate<=S5;Leds<=8'b01000001; //main road red branch greencount1<=59;count2<=19;endelse begincount1<=count1-1;count2<=count2-1;endS5: if (count2==0)beginstate<=S6;Leds<=8'b01000010; //main road red branch yellowcount1<=count1-1;count2<=4;endelse begincount2<=count2-1;endS6: if (count2==0) beginstate<=S7;Leds<=8'b01001000; // main road red branch turn left count1<=count1-1;count2<=9;endelse begincount1<=count1-1;count2<=count2-1;endS7: if (count2==0) beginstate<=S8;Leds<=8'b01000010; //main road red branch yellowcount1<=count1-1;count2<=4;endelse begincount1<=count1-1;count2<=count2-1;endS8: if (count1==0 && count2==0) beginstate<=S1;Leds<=8'b00010100; //main road green branch redcount1<=44;count2<=64;endelse begincount1<=count1-1;count2<=count2-1;enddefault: beginstate<=S1;Leds<=8'b00010100; //main road green branch redcount1<=44;count2<=64;endendcaseendendalways @ (posedge clk)beginS_M<=count1/10;G_M<=count1%10;S_B<=count2/10;G_B<=count2%10;endendmodule显示模块源代码`timescale 1ns/1nsmodule xianshi( clk,rst,S_M,G_M,S_B,G_B,sel1,sel2,sel3,sel4); input clk,rst;input[3:0] S_M,G_M,S_B,G_B;output[6:0]sel1,sel2,sel3,sel4;reg[6:0]sel1,sel2,sel3,sel4;always@(posedge rst or posedge clk)beginif(rst)beginsel1=7'b0000000;sel2=7'b0000000;sel3=7'b0000000;sel4=7'b0000000;endelsebegincase(S_M)4'b0000:sel1=7'b1111110;4'b0001:sel1=7'b0110000;4'b0010:sel1=7'b1101101;4'b0011:sel1=7'b1111001;4'b0100:sel1=7'b0110011;4'b0101:sel1=7'b1011011;4'b0110:sel1=7'b1011111;4'b0111:sel1=7'b1110000;4'b1000:sel1=7'b1111111;4'b1001:sel1=7'b1111011;default:sel1=7'b1111110;endcasecase(G_M)4'b0000:sel2=7'b1111110; 4'b0001:sel2=7'b0110000; 4'b0010:sel2=7'b1101101; 4'b0011:sel2=7'b1111001; 4'b0100:sel2=7'b0110011; 4'b0101:sel2=7'b1011011; 4'b0110:sel2=7'b1011111; 4'b0111:sel2=7'b1110000; 4'b1000:sel2=7'b1111111; 4'b1001:sel2=7'b1111011; default:sel2=7'b1111110;endcasecase(S_B)4'b0000:sel3=7'b1111110; 4'b0001:sel3=7'b0110000; 4'b0010:sel3=7'b1101101; 4'b0011:sel3=7'b1111001; 4'b0100:sel3=7'b0110011; 4'b0101:sel3=7'b1011011; 4'b0110:sel3=7'b1011111; 4'b0111:sel3=7'b1110000; 4'b1000:sel3=7'b1111111; 4'b1001:sel3=7'b1111011; default:sel3=7'b1111110; endcasecase(G_B)4'b0000:sel4=7'b1111110; 4'b0001:sel4=7'b0110000; 4'b0010:sel4=7'b1101101; 4'b0011:sel4=7'b1111001; 4'b0100:sel4=7'b0110011; 4'b0101:sel4=7'b1011011; 4'b0110:sel4=7'b1011111; 4'b0111:sel4=7'b1110000; 4'b1000:sel4=7'b1111111; 4'b1001:sel4=7'b1111011; default:sel4=7'b1111110; endcaseendendendmodule顶层模块`timescale 1ns/1nsmodule jiaotong(clk,rst,Leds,S_M,G_M,S_B,G_B,sel1,sel2,sel3,sel4,enable);input clk,rst,enable;output[7:0]Leds;output[3:0] S_M,G_M,S_B,G_B;output[6:0]sel1,sel2,sel3,sel4;wire[3:0] S_M,G_M,S_B,G_B,M_B;M_control control1(.clk(clk),.rst(rst),.Leds(Leds),.S_M(S_M),.G_M(G_M),.S_B(S_B),.G_B(G_B));xianshixianshi1(.clk(clk),.rst(rst),.S_M(S_M),.G_M(G_M),.S_B(S_B),.G_B(G_B),.sel1(sel 1),.sel2(sel2),.sel3(sel3),.sel4(sel4));Endmodule测试代码`timescale 1ns/1nsmodule testJT;reg clk,rst;wire[7:0]Leds;wire[3:0]S_M,G_M,S_B,G_B;wire[6:0]sel1,sel2,sel3,sel4;parameter clock=5;initialbeginclk=0;rst=0;#(2*clock);rst=1;#(4*clock);rst=0;#(800*clock);$stop;endalways #(clock) clk=~clk;jiaotong m1(clk,rst,Leds,S_M,G_M,S_B, G_B, sel1, sel2, sel3, sel4 ); endmodule仿真图:。