一、实验内容
1)熟悉quartusll开发环境
2)一位全加器的设计和交通灯控制器。
FPGA为核心,设计一个交通灯控制器,每个路口都有红、黄、绿三盏灯。该交通信号灯控制器由一条车道A和一条车道B汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。用红、绿、黄发光二极管作信号灯
基本要求:
- 东西、南北两个方向的信号灯必须交替工作且两个方向通行时间不同;
- 显示采用LED光柱或数码管倒计时的方式;
- 每个路口用两个数码管倒计时显示
设定一个周期内,红灯发光30s,绿灯发光27s,黄灯发光3s。
以东西方向信号灯状态为例,红灯发光的时间等于黄灯和绿灯发光的时间和。所以一个完整的状态转换周期是红灯发光的时间的两倍,也就是60s。在东西方向红色信号灯发光的30s内,南北方向由绿灯切换到了黄灯;在南北方向红色信号灯发光的30s内,东西方向也由绿灯切换到了黄灯。因此我们将东西和南北方向信号灯同时保持在固定状态的时间段,划为一个状态。
二、实验目的
本次实验需要储备了解Quartus II仿真实现的过程,了解如何用其进行模拟仿真。设计出交替转换的交通信号灯。
- 软件流程(硬件连接)
①新建工程
②创建半加器原理图
③将设计项目设置成可调用的元件
④尝试运行代码
⑤新建文件输出代码的波形
- 代码
1.一位全加器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY full_adder IS
PORT(a:IN STD_LOGIC;
b:IN STD_LOGIC;
cin:IN STD_LOGIC;
s:OUT STD_LOGIC;
co:OUT STD_LOGIC);
END full_adder;
ARCHITECTURE rtl OF full_adder IS
SIGNAL tmp1,tmp2:STD_LOGIC;
BEGIN
tmp1<=a OR b;
tmp2<=tmp1 AND cin;
s<=tmp1 XOR cin;
co<=tmp2 OR (a AND b);
END rtl;
-
2.交通信号灯
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY abc IS PORT(CLK,RST: IN STD_LOGIC; LED: OUT STD_LOGIC_VECTOR(5 DOWNTO 0); WideSEGH: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); WideSEGL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); NSEGH: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); NSEGL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END ENTITY abc ; ARCHITECTURE bhv OF abc IS TYPE state IS(S0,S1,S2,S3); SIGNAL current_s,next_s:state; SIGNAL COUNT60:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN COUNT: PROCESS(RST,CLK) BEGIN IF RST= '1' THEN COUNT60<="00000000"; ELSIF CLK'EVENT AND CLK='1' THEN IF COUNT60<"00111100" THEN COUNT60<=COUNT60+1; ELSE COUNT60<="00000000"; END IF; END IF; END PROCESS; REG: PROCESS (RST,CLK) BEGIN IF RST= '1' THEN current_s <= s0; ELSIF clk='1' AND clk'EVENT THEN current_s <= next_s; END IF; END PROCESS; COM:PROCESS(current_s, COUNT60) VARIABLE WESEG,NSSEG:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN CASE current_s IS WHEN s0 => LED<= "100010"; WESEG:=29-COUNT60; NSSEG:=26-COUNT60; IF COUNT60 ="00011010" THEN next_s<=s1; ELSE next_s<=s0; END IF; WHEN s1 => LED <= "100001"; WESEG:=29-COUNT60; NSSEG:=29-COUNT60; IF COUNT60 = "00011101" THEN next_s<=s2; ELSE next_s<=s1; END IF; WHEN s2 => LED <= "010100"; WESEG:=56-COUNT60; NSSEG:=59-COUNT60; IF COUNT60="00111000" THEN next_s <= s3; ELSE next_s <= s2; END IF; WHEN s3 => LED <= "001100"; WESEG:=59-COUNT60; NSSEG:=59-COUNT60; IF COUNT60 ="00111011" THEN next_s<= s0; ELSE next_s <= s3; END IF; WHEN OTHERS=> LED <="100100"; END case; IF WESEG>29 THEN WESEG:=WESEG+18; ELSIF WESEG>19 THEN WESEG:=WESEG+12; ELSIF WESEG>9 THEN WESEG:=WESEG+6; ELSE NULL; END IF; IF NSSEG>29 THEN NSSEG:=NSSEG+18; ELSIF NSSEG>19 THEN NSSEG:=NSSEG+12; ELSIF NSSEG>9 THEN NSSEG:=NSSEG+6; ELSE NULL; END IF; WideSEGH<=WESEG(7 DOWNTO 4); WideSEGL<=WESEG(3 DOWNTO 0); NSEGH<=NSSEG(7 DOWNTO 4); NSEGL<=NSSEG(3 DOWNTO 0); END PROCESS; END ARCHITECTURE bhv;
- 实验结果及分析
一位全加器
全加器英语名称为full-adder,是用门电路实现两个二进制数相加并求出和的组合线路,称为一位全加器。一位全加器可以处理低位进位,并输出本位加法进位。多个一位全加器进行级联可以得到多位全加器。
2.交通信号灯
每个路口都有红、黄、绿三盏灯。该交通信号灯控制器由一条车道A和一条车道B汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。用红、绿、黄发光二极管作信号灯。
基本要求:
- 东西、南北两个方向的信号灯必须交替工作且两个方向通行时间不同;
- 显示采用LED光柱或数码管倒计时的方式;
(3)每个路口用两个数码管倒计时显示
设定一个周期内,红灯发光30s,绿灯发光27s,黄灯发光3s。
以东西方向信号灯状态为例,红灯发光的时间等于黄灯和绿灯发光的时间和。所以一个完整的状态转换周期是红灯发光的时间的两倍,也就是60s。在东西方向红色信号灯发光的30s内,南北方向由绿灯切换到了黄灯;在南北方向红色信号灯发光的30s内,东西方向也由绿灯切换到了黄灯。因此我们将东西和南北方向信号灯同时保持在固定状态的时间段,划为一个状态
六、实验条件
1、个人计算机一台