基于FPGA的交通信号灯课程设计以VHDL语言实现.docx
- 文档编号:2366404
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:15
- 大小:343.53KB
基于FPGA的交通信号灯课程设计以VHDL语言实现.docx
《基于FPGA的交通信号灯课程设计以VHDL语言实现.docx》由会员分享,可在线阅读,更多相关《基于FPGA的交通信号灯课程设计以VHDL语言实现.docx(15页珍藏版)》请在冰点文库上搜索。
基于FPGA的交通信号灯课程设计以VHDL语言实现
基于FPGA的数字电子技术课程设计(以VHDL语言实现)
课题:
交通信号灯
设计题目:
1.由主干道A和支干道B的汇合点形成十字交叉路口,在交叉路口处设有红绿黄三色信号灯。
红灯亮禁止通行;绿灯亮允许通行;黄灯亮则让行驶到路口的车辆有时间停靠到禁止线外.用两位数码管显示当前主支干道所处的状态。
红黄绿分别用R,Y,G表示。
2。
主干道车辆较多,所以绿灯亮灯时间为50S;支干道亮绿灯时间设为30S。
当主干道允许通行亮绿灯时则支干道亮红灯;支干道亮绿灯时也相反。
每次由绿灯转变为红灯时,期间要亮5S的黄灯。
3.交通灯正常运行时,用四位数码管显示主干道和支干道的倒计时时间。
4.能实现系统总清0,清0后计数器由初始状态开始计数。
5。
具有一定的扩展功能。
一。
设计思路
1.根据设计题目要求可以得出交通信号灯控制器的设计用“状态法”来实现较好,因此先划分出交通灯显示时的几个较大的状态。
设状态用S表示。
S0:
主干道亮黄灯支干道亮红灯亮灯5S
S1:
主干道亮红灯支干道亮绿灯亮灯30S
S2:
主干道亮红灯支干道亮黄灯亮灯5S
S3:
主干道亮绿灯支干道亮红灯亮灯50S
状态之间应该要能实现循环:
S0=>S1=>S2=〉S3=>S0
2。
然后再考虑在每个状态下要能够实现的功能。
根据题目可知在每个状态下要能实现将交通灯的颜色变换以字母的形式显示在两位数码管上,每位各表示一条道路。
在交通灯颜色输出的同时还要能够实现计数的输出,也就是各路灯转换前剩余的时间量。
3。
在实现了各个状态下的功能后就要考虑加上清0功能与紧急功能,清0也就是复位功能。
在复位时实现系统清0,并且清0后计数器从初始状态开始计时,在此将S0状态视为初始状态.也就是清0完毕后系统进入S0状态。
课题中将紧急功能设为两条路都显示红灯,并且计数器全置0。
4.这些实现的功能都加入后就可以对所写的VHDL语言进行测试与仿真了。
在其中实现对所写语言的改进和完善,并得到仿真图结合仿真图再进行修改。
在得到合理的仿真图后就可以进行分频语言的添加和设计电路图的绘制了.
5.根据所用的电路板的输入频率合理地设置分频数,完成分频语言的编写。
然后根据语言生成器件,再按要求连接电路图。
完成后按要求添加约束文件后就可以进行下载演示了。
二.VHDL语言及注释
LIBRARYIEEE;
USEIEEE。
STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE。
STD_LOGIC_ARITH。
ALL;-—取库
ENTITYJTDIS
PORT(CPIN,R,JJ:
INSTD_LOGIC;
SGL,SZL:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);
ST1C,ST2C:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)-—建立输入输出端口
);
ENDENTITY;
ARCHITECTUREJGTOFJTDIS
TYPESTATESIS(S0,S1,S2,S3);
SIGNALS:
STATES;
SIGNALCP:
STD_LOGIC;
SIGNALCPCT:
INTEGERRANGE0TO10000000;
SIGNALC:
STD_LOGIC_VECTOR(7DOWNTO0);--辅助用十六进制计数
SIGNALGL,ZL:
STD_LOGIC_VECTOR(2DOWNTO0);
SIGNALT1C,T2C:
STD_LOGIC_VECTOR(7DOWNTO0);—-建立影子端口
FUNCTIONSAM(BIN:
STD_LOGIC_VECTOR(7DOWNTO0))
—十六进制与BCD码转换函数
RETURNSTD_LOGIC_VECTORIS
VARIABLESBCD,ADDBCD:
STD_LOGIC_VECTOR(7DOWNTO0);
VARIABLEN:
INTEGERRANGE0TO8;
BEGIN
N:
=0;SBCD:
="00000000”;
IFBIN〈”01100100"THEN--当输入BIN大于十进制100时,输出为0
LOOP
IFBIN(N)=’1'THEN—-根据BIN的每一位选择加上对应的压缩型BCD码
CASENIS
WHEN0=>ADDBCD:
=”00000001";
WHEN1=>ADDBCD:
="00000010";
WHEN2=〉ADDBCD:
="00000100";
WHEN3=〉ADDBCD:
=”00001000”;
WHEN4=>ADDBCD:
=”00010110";
WHEN5=>ADDBCD:
=”00110010”;
WHEN6=〉ADDBCD:
="01100100";
WHENOTHERS=>ADDBCD:
="00000000”;
ENDCASE;
SBCD:
=SBCD+ADDBCD;
IFSBCD(3DOWNTO0)〉"1001"THEN--进行BCD码加法调整
SBCD:
=SBCD+"0110";
ENDIF;
ENDIF;
N:
=N+1;
EXITWHENN=8;
ENDLOOP;
RETURNSBCD;
ELSE
RETURN"00000000";
ENDIF;
ENDFUNCTIONSAM;
BEGIN
PROCESS(CP,R)
BEGIN
IFR=’1'THENS<=S0;C<=X"00";GL<=”100";ZL<=”100";T1C<=X”00”;T2C〈=X”00";
-—复位的实现
ELSIFCP=’1'ANDCP’EVENTTHEN
IFJJ='1’THENGL〈=”100";ZL<="100”;T1C<=X”00";T2C<=X"00”;
--紧急状态的实现
ELSE-—状态转换及状态中输出计时的实现
CASESIS
WHENS0=>
IFC〉1THEN
C<=C-1;
ELSE
S<=S1;C<=X”1E”;GL〈="100”;ZL〈=”001";
T1C<=X"23”;T2C〈=X"1E”;
ENDIF;
IFT1C〉1THENT1C〈=T1C-1;
ENDIF;
IFT2C>1THENT2C〈=T2C—1;
ENDIF;
WHENS1=>
IFC>1THEN
C〈=C—1;
ELSE
S<=S2;C〈=X”05”;GL〈=”100";ZL<=”010”;
T1C<=X"05”;T2C〈=X"05";
ENDIF;
IFT1C>1THENT1C〈=T1C—1;
ENDIF;
IFT2C>1THENT2C〈=T2C-1;
ENDIF;
WHENS2=〉
IFC>1THEN
C<=C-1;
ELSE
S<=S3;C〈=X"32";GL〈=”001”;ZL<="100”;
T1C<=X"32";T2C<=X”37";
ENDIF;
IFT1C>1THENT1C<=T1C-1;
ENDIF;
IFT2C〉1THENT2C〈=T2C-1;
ENDIF;
WHENS3=>
IFC>1THEN
C<=C—1;
ELSE
S<=S0;C<=X”05";GL<=”010”;ZL<=”100”;
T1C<=X”05";T2C〈=X”05”;
ENDIF;
IFT1C〉1THENT1C<=T1C-1;
ENDIF;
IFT2C〉1THENT2C〈=T2C-1;
ENDIF;
ENDCASE;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(GL,ZL,T1C,T2C)-—影子端口的赋值
BEGIN
SGL<=GL;SZL〈=ZL;ST1C<=SAM(T1C);ST2C<=SAM(T2C);
ENDPROCESS;
PROCESS(CPIN,R)—分频语言
BEGIN
IFR='1'THEN
CPCT<=10000000;
ELSIFCPIN=’1’ANDCPIN'EVENTTHEN
IFCPCT=0THEN
CPCT<=10000000;CP<=NOTCP;
ELSE
CPCT<=CPCT-1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDJGT;
LIBRARYIEEE;—-所用的LCD模块的VHDL程序
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED。
ALL;
entityJTDLCDis
port(CPIN,R,BUSY:
INSTD_LOGIC;
EW,SN:
INSTD_LOGIC_VECTOR(7DOWNTO0);
EWRYG,SNRYG:
INSTD_LOGIC_VECTOR(2DOWNTO0);
CLK,RST,STROBE,OUTLINE:
OUTSTD_LOGIC;
DATA:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
ADDR:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
endentity;
architectureJGTofJTDLCDis
TYPESTATESIS(S0,S1,S2,S3,S4);
SIGNALS:
STATES;
SIGNALLCDPT:
INTEGERRANGE0TO10;
SIGNALCPCT:
INTEGERRANGE0TO65535;
SIGNALCP:
STD_LOGIC;
SIGNALASCEW,ASCSN:
STD_LOGIC_VECTOR(7DOWNTO0);
begin
PROCESS(CPIN,R)
BEGIN
CLK<=CPIN;
IFR=’1'THEN
CPCT<=65535;
ELSIFCPIN=’1’ANDCPIN'EVENTTHEN
IFCPCT=0THEN
CPCT〈=65535;CP<=NOTCP;
ELSE
CPCT〈=CPCT—1;
ENDIF;
ENDIF;
ENDPROCESS;--分频为500US周期
—-主进程:
拟采用500us时钟,即在500us后完成状态转换,修改LCDPT指针
—-S0:
初始状态,在R=1时,处于S0状态,LCDPT=0
——流程:
输出rst=1,转S1
——S1:
输出RST=0;判断BUSY=0?
:
Y:
LCDPT+1;LCDPT到固定最后?
:
:
N:
->S2
--:
:
Y:
转S3
——;N;NULL
-—S2:
给出STROBE信号。
转S1
—-S1,S2完成初始化固定显示的功能
PROCESS(CP,R)
BEGIN
IFR=’1'THEN
S<=S0;LCDPT〈=0;RST<=’1';
ELSIFCP=’1’ANDCP'EVENTTHEN
CASESIS
WHENS0=>S<=S1;LCDPT<=0;RST<=’1';
WHENS1=>RST<=’0’;STROBE〈='0’;
IFBUSY='0'THEN
LCDPT<=LCDPT+1;
IFLCDPT=5THEN
S<=S3;
ELSE
S〈=S2;
ENDIF;
ENDIF;
WHENS2=>S〈=S1;STROBE〈=’1';
——S3~S4完成扫描显示功能
—-S3:
BUSY=0?
:
Y:
LCDPT循环+1,转S4
-—S4:
给出STROBE信号,转S3
WHENS3=>STROBE<='0’;
IFBUSY='0'THEN
IFLCDPT=10THEN
LCDPT<=5;
ELSE
LCDPT<=LCDPT+1;
ENDIF;
S〈=S4;
ENDIF;
WHENS4=〉STROBE<='1’;S<=S3;
WHENOTHERS=〉NULL;
ENDCASE;
ENDIF;
ENDPROCESS;
—-选择输出进程(LCDPT)
——LCDPT=0,NULL
-—=1~4显示EWSNE45H,5W57H,6S53H,9N4EH,10
PROCESS(LCDPT)
BEGIN
CASELCDPTIS
WHEN0=〉NULL;
WHEN1=>DATA〈=”01000101”;ADDR<=”0101";OUTLINE<='0';
WHEN2=〉DATA〈="01010111”;ADDR〈=”0110”;OUTLINE〈='0’;
WHEN3=>DATA〈="01010011”;ADDR<="1001”;OUTLINE<='0’;
WHEN4=>DATA〈=”01001110";ADDR<="1010”;OUTLINE〈='0’;
—-LCDPT=5,6EWBCD码EH,5EL,6
-—LCDPT=7EW红绿灯R,4
—-LCDPT=89SNBCD码SH,9SL,10
-—LCDPT=10SN红绿灯.G,8R52H;Y59H;G47H
WHEN5=〉DATA<=”0011”&EW(7DOWNTO4);ADDR〈="0101";OUTLINE〈=’1’;
WHEN6=〉DATA<="0011”&EW(3DOWNTO0);ADDR〈=”0110";OUTLINE〈=’1’;
WHEN7=〉DATA<=ASCEW;ADDR<=”0100”;OUTLINE<=’1’;
WHEN8=>DATA<="0011”&SN(7DOWNTO4);ADDR<=”1001";OUTLINE〈='1';
WHEN9=〉DATA<="0011"&SN(3DOWNTO0);ADDR〈="1010”;OUTLINE〈=’1';
WHEN10=>DATA〈=ASCSN;ADDR<=”1000”;OUTLINE<='1';
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
PROCESS(EWRYG)
BEGIN
CASEEWRYGIS
WHEN"100"=>ASCEW<=”01010010”;
WHEN"010”=〉ASCEW〈=”01011001";
WHEN”001"=>ASCEW<="01000111”;
WHENOTHERS=〉NULL;
ENDCASE;
ENDPROCESS;
PROCESS(SNRYG)
BEGIN
CASESNRYGIS
WHEN”100"=〉ASCSN〈="01010010”;
WHEN"010"=>ASCSN<="01011001”;
WHEN”001”=〉ASCSN<=”01000111”;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
endarchitectureJGT;
三.仿真图形
1。
初始时的仿真图
2。
状态转换时的仿真图
四。
设计电路图
所生成模块体及总电路连线
CPIN:
时钟信号输入端
JJ:
紧急状态控制输入端
R:
复位清0输入端
SGL[2。
.0]:
主干道灯信号灯输出端
SZL[2。
。
0]:
支干道灯信号灯输出端
ST1C[7.。
0]:
主干道计数输出端
ST2C[7。
.0]:
支干道计数输出端
在下板实现时是不能加外设和分频语言的,所以要得到仿真图时需要去掉函数和LCD模块语言,分频语言并将中间的状态语言拿出来进行修改和测试,这就需要稍作修改。
因此请下载此文档的人注意:
直接用这些最后整合的语言去仿真和下载是达不到效果的,必须按步骤添加语言!
PS:
WORD文档与记事本间有符号转换问题,复制时请注意。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 交通 信号灯 课程设计 VHDL 语言 实现