软件:Quartus
语言:VHDL
代码功能:
交通定时控制电路设计
1)基本要求:
首先设定100以内的交通信号灯十进制计时秒数,而后每来一次秒脉冲降沿,秒数减1,减到0,电路回复设定值重新计时。
2)端口定义:
输入32KHz时钟端口clk,输入端口个位FQ3 downto0),十位sQ(3 downto0),置数端S;输出端口个位FLED(7 downto0),十位SLED(7 downto0)。
3)实现思路
(1)电路原理:
秒计数可分为个位与十位分别计算,个位减到0回9,十位减一;减至0,计时结束(2)1Hz秒脉冲电路参考基础电路程序设计。
(3)秒计时电路
定义信号FD(3 downto0),SD(3 downto0)暂存秒数的个位值与秒数的十位值:定义变量iFD(3 downto0),iSD(3 downto0)暂存秒数的个位值FD与秒数的十位值SDLGTP: Process(ck1s, SQ, FQ) -100S timer
VARIABLE IFD, ISD: STD LOGIC_ VECTOR(3 downto 0): =X"O
Begin
IF S='1' then ISD<=SQ; IFD<=FQ
ELSIF ck1s'event AND cks='0' then
IF IFD="0000" then -When FD is decreased to O(in Decimal
F ISD="0000" then -when SD is decreased to 0 (in Decimal
ISD<=SQ; IFD<=FQ;
ELSE
iSD<=iSD-1;iFD<="1001”;
END IF
ELSE
FD<=IFD-1
END IF
END IF
SD<=ISD: FD<=IFD
End Process LGTP:
(4)时间值FD、SD采用8段LED显示,显示电路程序参考基础电路的数码管译码电路。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
Quartus9.0版本
2. 程序文件
3. 程序编译
4. 管脚图
5. RTL图
6. 仿真图
上图中,可以看到数码管十位显示6F,个位显示6F->7F->07->7D->6D->66->4F ......根据数码管译码表可知,数码管倒计时显示的是99->98->97->96->95->94->93.......显示正确。
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --交通定时控制 ENTITY traffic_time IS PORT ( clk :IN STD_LOGIC;--时钟端口 S :IN STD_LOGIC;--置数端 FQ :IN STD_LOGIC_VECTOR(3 DOWNTO 0);--输入端口个位 SQ :IN STD_LOGIC_VECTOR(3 DOWNTO 0);--输入端口十位 SLED : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--输出十位显示端口 FLED : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)--端口个位 ); END traffic_time; ARCHITECTURE behave OF traffic_time IS --定义信号 SIGNAL SD:STD_LOGIC_VECTOR(3 downto 0); SIGNAL FD:STD_LOGIC_VECTOR(3 downto 0); SIGNAL ck1s: STD_LOGIC:='0';--1Hz SIGNAL iFD: STD_LOGIC_VECTOR(3 downto 0); SIGNAL iSD: STD_LOGIC_VECTOR(3 downto 0); BEGIN --分频到1Hz ck1sP:Process(clk) --Process to generate 1Hz clock Variable tmp: INTEGER RANGE 0 to 15999:=0; Begin If clk'EVENT AND clk='0' then If tmp=159 then --为便于仿真将15999改小为159 tmp:=0; ck1s<=NOT(ck1s); Else tmp:= tmp+1; END IF; END IF; End Process ck1sP; LGTP: Process(ck1s,S) --100S timer Begin IF S='1' then iSD<=SQ;--十位 iFD<=FQ;--个位 ELSIF ck1s'EVENT AND ck1s='0' then IF iFD="0000" then --when FD is decreased to 0(in Decimal) IF iSD="0000" then --when SD is decreased to 0 (in Decimal) iSD<="1001"; iFD<="1001"; ELSE iSD<=iSD-"0001"; iFD<="1001"; END IF; ELSE iFD<=iFD-"0001"; END IF; END IF; SD<=iSD; FD<=iFD; End Process LGTP; --数码管译码电路显示十位 SLED<= X"3F" WHEN SD="0000" ELSE--"0" X"06" WHEN SD="0001" ELSE--"1" X"5B" WHEN SD="0010" ELSE--"2" X"4F" WHEN SD="0011" ELSE--"3" X"66" WHEN SD="0100" ELSE--"4" X"6D" WHEN SD="0101" ELSE--"5" X"7D" WHEN SD="0110" ELSE--"6" X"07" WHEN SD="0111" ELSE--"7" X"7F" WHEN SD="1000" ELSE--"8" X"6F" WHEN SD="1001" ELSE--"9" X"00";--light off
105