我是靠谱客的博主 迅速大地,最近开发中收集的这篇文章主要介绍交通灯—VHDL设计,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

FPGA课设——交通信号控制器的VHDL设计

      • 1、设计任务及要求:
      • 2、参考设计方案
      • 3、采用 VHDL 语言输入的方式实现交通信号灯控制器
      • 4、设计方案
      • 5、自定义交通灯主从控制时间

1、设计任务及要求:

设计任务:模拟十字路口交通信号灯的工作过程,利用实验板上的两组红、黄、绿LED 作为交通信号灯,设计一个交通信号灯控制器。要求:
(1)交通灯从绿变红时,有4秒黄灯亮的间隔时间;
(2)交通灯红变绿是直接进行的,没有间隔时间;
(3)主干道上的绿灯时间为40秒,支干道的绿灯时间为20秒;
(4)在任意时间,显示每个状态到该状态结束所需的时间。
在这里插入图片描述
在这里插入图片描述

设计要求:
(1)采用VHDL语言编写程序,并在QUARTUSII工具平台中进行仿真,下载到EDA实验箱进行验证。
(2)编写设计报告,要求包括方案选择、程序清单、调试过程、测试结果及心得体会。

2、参考设计方案

在这里插入图片描述

3、采用 VHDL 语言输入的方式实现交通信号灯控制器

在这里插入图片描述
该程序由 7 个进程组成,进程 P1 和 P2 将 CLK 信号分频后产生 1 秒信号,进程 P3、P4、 P5构成两个带有预置数功能的十进制计数器,其中P4 产生允许十位计数器计数的控制信号。 进程P6实现状态转换和产生状态转换的控制信号,进程P7产生次态信号和信号灯输出信号, 以及每一个状态的时间值。

4、设计方案

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

   ENTITY TRAFFIC_LIGHT IS
      PORT(CLK,RST: IN STD_LOGIC;
			LED: OUT STD_LOGIC_VECTOR(5 DOWNTO  0);	--定义6个LED灯
			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 TRAFFIC_LIGHT;

ARCHITECTURE bhv OF TRAFFIC_LIGHT IS
    TYPE state IS(S0,S1,S2,S3);  --枚举状态类型
    SIGNAL current_s,next_s:state;
    SIGNAL COUNT68:STD_LOGIC_VECTOR(7 DOWNTO  0);
      BEGIN
COUNT: PROCESS(RST,CLK)                --辅助进程
           BEGIN
				IF RST= '1' THEN    --异步清零
					COUNT68<="00000000";
				ELSIF CLK'EVENT AND CLK='1' THEN
					IF COUNT68<"01000011" THEN    --B01000011=67设定68进制计数器
						COUNT68<=COUNT68+1;
					ELSE 
						COUNT68<="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, COUNT68)         --主控组合进程,用于设定状态转换的下一个状态
VARIABLE WESEG,NSSEG:STD_LOGIC_VECTOR(7 DOWNTO  0);
	BEGIN
		CASE current_s IS                     
			WHEN s0 => LED<= "010100";--主干绿灯亮,支干红灯亮
				WESEG:=39-COUNT68; --主干绿灯倒计时,用于数码管显示
				NSSEG:=43-COUNT68; --支干红灯倒计时 
				IF COUNT68 ="00100111" THEN   --B00100111=39  控制状态转变   
					next_s<=s1;                    
				ELSE 
					next_s<=s0;    
				END IF;
			WHEN s1 => LED <= "001100"; --主干黄灯,支干红灯
				WESEG:=43-COUNT68;
				NSSEG:=43-COUNT68; 
				IF COUNT68 = "00101011" THEN  --B00101011=43
					next_s<=s2;    
				ELSE
					next_s<=s1;   
				END IF;
			WHEN s2 => LED <= "100010";  --主干红灯,支干绿灯
				WESEG:=67-COUNT68;
				NSSEG:=63-COUNT68; 
				IF COUNT68 ="00111111" THEN  --B00111111=64
					next_s <= s3;
				ELSE  
					next_s <= s2; 
				END IF;
			WHEN s3 => LED <= "100001";  --主干红灯,支干黄灯
				WESEG:=67-COUNT68;
				NSSEG:=67-COUNT68; 
				IF COUNT68 ="01000011" THEN --B01000011=67 
					next_s<= s0; 
				ELSE  
					next_s <= s3;   
				END IF;
			WHEN OTHERS=> LED <="100100"; --否则都不能通行
    END case;
    
	IF WESEG>39 THEN --译码器的功能:将当前的倒计时转换成十进制,低四位和高四位分别是数码管的个位与十位,
						--38+18=56D=38H=00111000B
						--使数码管按照当前的计数(十进制)按二进制计数进行倒计时
		WESEG:=WESEG+24;
	ELSIF 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>39 THEN
		NSSEG:=NSSEG+24;
	ELSIF 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;

状态图:
在这里插入图片描述顶层文件图:
在这里插入图片描述波形仿真图:
在这里插入图片描述

5、自定义交通灯主从控制时间

在这里插入图片描述

LIBRARY IEEE;  
USE IEEE.STD_LOGIC_1164.ALL; 
USE IEEE.STD_LOGIC_UNSIGNED.ALL; 
  
ENTITY TRAFFIC_LAMP IS   
PORT(CLK,RST: IN STD_LOGIC; 
     LEDCTRL: OUT STD_LOGIC_VECTOR(5 DOWNTO 0); 
     WESEGH: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); 
     WESEGL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); 
     NSSEGH: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); 
     NSSEGL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); 
END ENTITY TRAFFIC_LAMP; 
  
ARCHITECTURE behav OF TRAFFIC_LAMP IS 
  TYPE FSM_ST IS(S0,S1,S2,S3); 
  SIGNAL current_s,next_s:FSM_ST;  
  SIGNAL COUNT68:STD_LOGIC_VECTOR(7 DOWNTO 0); 
BEGIN  
  COUNT: PROCESS(RST,CLK) --辅助进程
  BEGIN  
  IF RST= '1' THEN COUNT68<="00000000";--检测异步复位信号
  ELSIF CLK'EVENT AND CLK='1' THEN 
  IF COUNT68<"(z-1变成二进制后代入)" THEN                                    -- 1 
    COUNT68<=COUNT68+1;  
  ELSE COUNT68<="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, COUNT68) --主控组合进程
  VARIABLE WESEG,NSSEG:STD_LOGIC_VECTOR(7 DOWNTO 0); 
  BEGIN  
    CASE current_s IS  
       WHEN s0 => LEDCTRL<= "010100";  
	WESEG:=(x-1-COUNT68;NSSEG:=(x+4-1-COUNT68;                 --2,3
 	IF COUNT68 ="(x-1换算成二进制代入)" THEN next_s<=s1;               --4
	ELSE next_s<=s0; 
 	END IF;  
      WHEN s1 => LEDCTRL<= "001100";  
 	WESEG:=(x+4-1)-COUNT68;NSSEG:=(x+4-1)-COUNT68;                   --5,6
	IF COUNT68 = "(x+4-1换算成二进制)" THEN next_s<=s2; 		 --7
	ELSE next_s<=s1; 
	END IF;  
      WHEN s2 => LEDCTRL<= "100010"; 
 	WESEG:=(z-1)-COUNT68;NSSEG:=(z-5)-COUNT68;			 --8,9 
	IF COUNT68 ="(z-5换算成二进制)" THEN next_s <= s3; 
	ELSE next_s <= s2; 
	END IF;  
      WHEN s3 => LEDCTRL <= "100001";  
	WESEG:=(z-1)-COUNT68;NSSEG:=(z-1)-COUNT68; 
 	IF COUNT68 ="(z-1换算成二进制)" THEN next_s<= s0; 
	ELSE next_s <= s3; 
	END IF; 
    END case; 

 
--如果x>40的话,要改下面的内容
--例:x=67
--
--IF WESEG>59 THEN WESEG:=WESEG+36;		--后面依次加6
--	ELSIF WESEG>49 THEN WESEG:=WESEG+30;
--	ELSIF WESEG>39 THEN WESEG:=WESEG+24;
--	ELSIF WESEG>29 THEN WESEG:=WESEG+18; 
--	ELSIF WESEG>19 THEN WESEG:=WESEG+12; 
--	ELSIF WESEG>9 THEN WESEG:=WESEG+6; 
--	ELSE NULL;
	
IF WESEG>39 THEN WESEG:=WESEG+24;  
	ELSIF 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>39 THEN NSSEG:=NSSEG+24;  
	ELSIF NSSEG>29 THEN NSSEG:=NSSEG+18; 
	ELSIF NSSEG>19 THEN NSSEG:=NSSEG+12; 
	ELSIF NSSEG>9 THEN NSSEG:=NSSEG+6; 
	ELSE NULL; 
END IF; 
 
WESEGH<=WESEG(7 DOWNTO 4);WESEGL<=WESEG(3 DOWNTO 0); 
NSSEGH<=NSSEG(7 DOWNTO 4);NSSEGL<=NSSEG(3 DOWNTO 0);  
END PROCESS; 
  
END ARCHITECTURE behav; 

其他课设题目:
1、AC-DC数字稳压电源设计与仿真
2、步进式增益调节语音放大器
3、函数发生器课程设计(Multisim仿真+PCB实物)
4、嵌入式+人工智能+物联网开发常用的开发工具
5、数字交通灯设计(Multisim仿真+PCB实物)
6、数字钟—VHDL设计

课设工程代码和报告资料地址:关注公众号:Kevin的学习站,进入后台输入:FPGA交通灯,就OK啦!
创作不易,但你的点赞、关注、收藏就是对我最大的鼓励!

在这里插入图片描述

最后

以上就是迅速大地为你收集整理的交通灯—VHDL设计的全部内容,希望文章能够帮你解决交通灯—VHDL设计所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部