FPGA开发基础——基于multisim以及Quartus实现的交通灯电路

作者:王子齐
学校:电子科技大学
学号:2018151202014
设计目的:完成对于FGPA开发的基础练习,建立FPGA开发思想。

设计要求

设计并实现一个简单的十字路口交通灯控制电路。具体要求:以4个红色指示灯、4个绿色指示灯和4个黄色指示灯模拟路口东西南北4个方向的红绿黄交通灯。控制这些灯,使它们安下列规律亮灭。

1、东西方向绿灯亮,南北方向红灯亮。东西方向通车,时间30秒;

2、东西方向黄灯闪烁,南北方向红灯亮,时间2秒。

3、东西方向红灯亮,南北方向绿灯亮。南北方向通车,时间30秒;

4、东西方向红灯亮,南北方向黄灯闪烁,时间2秒。

5、返回1,继续运行。

要求在仿真软件中设计并运行,或设计实际电路调试运行,提交设计报告电子档,设计报告要求包括:设计方案、电路原理图、测试表格、分析结果总结,实现结果展示(要求用仿真结果截图或者实测照片截图展示实现效果)。

基于multisim对于交通灯的电路搭建
1.1 交通灯电路的组成部分

对于交通灯电路,其大致有以下几大模块:

模块作用
振荡脉冲模块产生信号源,使电路起振
计数及其显示模块对于时间的一种显示,使得我们可以更好地了解交通灯的亮暗时间
主控模块电路中最核心的部分,通过一定的数字逻辑关系对于最终的交通灯亮暗加以控制
信号灯译码模块译码主控模块的控制信号,将其可视化

下面我们逐一进行讨论并给出相应multisim电路图

1.2 振荡脉冲模块

振荡脉冲模块事实上就是信号源产生模块,其主要功能就是为整个电路提高时钟脉冲,可以有多种方法去实现,直接使用时钟脉冲信号源或使用555定时器搭建多谐振荡器都可以实现相应目的,下面给出两种实现方法的电路图。

a)直接调用时钟脉冲(在multisim中搜索clock即可)
在这里插入图片描述
b)使用555搭建的多谐振荡器(在multisim中搜索555即可)
在这里插入图片描述
如上图,此时的OUT等效于某个频率的时钟脉冲信号,通过调节R1,R2,C的值可以改变输出的频率,下面给出相应公式以便读者自行调节脉冲频率:

t W 1 = ( R 1 + R 2 ) C t_{W1}=(R_{1}+R_{2})C tW1=(R1+R2)C

t W 2 = R 1 C t_{W2}=R_{1}C tW2=R1C

T = t W 1 + t W 2 T=t_{W1}+t_{W2} T=tW1+tW2

1.3 计数模块及显示模块

计数电路是主控电路的输入源,通过计数电路的适当连接,可以得到我们希望的任意计数序列,而计数序列一方面可以当作时间在显示模块上得以可视化,另一方面又可以通过主控电路从而产生相应的控制信号。

对于显示电路,事实上,如果不考虑实际应用能力而只关心电路本身的性能,那么我们完全可以摒弃显示电路。但考虑在实际应用中,我们等待红绿灯时希望知道它的时间,所以在此加入显示电路。

译码电路采用计数器便可以实现,此处给出一种连接方法:

a) 基于74LS160构造的计数器(模64,因为一个交通灯周期为64个时间单位)

在这里插入图片描述
级联方式非常简单,采用清零法级联即可。

1.4 主控模块

主控模块是对电路控制的核心力量,是由一些门电路组成的组合逻辑块。由于主控模块往往是电路设计中较为艰难的部分,所以下面给出详细的推导过程。


我们令计数器U1的输出为 Q A 1 Q_{A1} QA1 Q B 1 Q_{B1} QB1 Q C 1 Q_{C1} QC1 Q D 1 Q_{D1} QD1 ,令计数器U2的输出为 Q A 2 Q_{A2} QA2 Q B 2 Q_{B2} QB2 Q C 2 Q_{C2} QC2 Q D 2 Q_{D2} QD2。令东西方向的黄灯,绿灯和红灯输出分别为 Y 1 Y_{1} Y1 G 1 G_{1} G1 R 1 R_{1} R1,南北方向的黄灯,绿灯和红灯输出分别为 Y 2 Y_{2} Y2 G 2 G_{2} G2 R 2 R_{2} R2

计数器U1和U2级联形成模64计数器(0——63)。

根据上述设计要求,东西方向的黄灯只有在每次计数周期中低30—31个计数单位时亮起(前30S为东西方向绿灯亮起),故可列出如下真值表。(由于计数最大只计到63,故我们不关心U1的QD位)

输出项 Q C 1 Q_{C1} QC1 Q B 1 Q_{B1} QB1 Q A 1 Q_{A1} QA1 Q D 2 Q_{D2} QD2 Q C 2 Q_{C2} QC2 Q B 2 Q_{B2} QB2 Q A 2 Q_{A2} QA2 Y 1 Y_{1} Y1 G 1 G_{1} G1 R 1 R_{1} R1 Y 2 Y_{2} Y2 G 2 G_{2} G2 R 2 R_{2} R2
00000000010001
10000001010001
20000010010001
30000011010001
40000100010001
50000101010001
60000110010001
70000111010001
80001000010001
90001001010001
100010000010001
110010001010001
120010010010001
130010011010001
140001100010001
150010101010001
160010110010001
170010111010001
180011000010001
190011001010001
200100000010001
210100001010001
220100010010001
230100011010001
240100100010001
250100101010001
260100110010001
270100111010001
280101000010001
290101001010001
300110000100000
310110001100001
320110010001010
330110011001010
340110100001010
350110101001010
360110110001010
370110111001010
380111000001010
390111001001010
401000000001010
411000001001010
421000010001010
431000011001010
441000100001010
451000101001010
461000110001010
471000111001010
481001000001010
491001001001010
501010000001010
511010001001010
521010010001010
531010011001010
541010100001010
551010101001010
561010110001010
571010111001010
581011000001010
591011001001010
601100000001010
611100001001010
621100010001100
631100011001100

根据上述真值表,可以采用卡诺图化简,下面给出详细推导过程。

(a)对于黄灯信号的卡诺图逻辑化简
对于东西方向的黄灯:

Q C 1 Q B 1 Q A 1 = 000 Q_{C1} Q_{B1} Q{A1} = 000 QC1QB1QA1=000 时: Y 1 = 0 , Y 2 = 0 Y_{1}=0 , Y_{2}=0 Y1=0,Y2=0
Q C 1 Q B 1 Q A 1 = 001 Q_{C1} Q_{B1} Q{A1} = 001 QC1QB1QA1=001 时: Y 1 = 0 , Y 2 = 0 Y_{1}=0 , Y_{2}=0 Y1=0,Y2=0
Q C 1 Q B 1 Q A 1 = 010 Q_{C1} Q_{B1} Q{A1} = 010 QC1QB1QA1=010 时: Y 1 = 0 , Y 2 = 0 Y_{1}=0 , Y_{2}=0 Y1=0,Y2=0
Q C 1 Q B 1 Q A 1 = 011 Q_{C1} Q_{B1} Q{A1} = 011 QC1QB1QA1=011 时: Y 1 如 下 , Y 2 = 0 Y_{1}如下 , Y_{2}=0 Y1,Y2=0

Y 1 / Q D 2 Y_{1}/Q_{D2} Y1/QD2 Q C 2 Q_{C2} QC200011110
Q B 2 Q_{B2} QB2 Q A 2 Q_{A2} QA2////
001000
011000
110000
100000

根据卡诺图化简可得到:

Y 1 = Q C 1 ′ Q B 1 Q A 1 Q D 2 ′ Q B 2 ′ Q C 2 ′ Y_{1}=Q_{C1}^{'}Q_{B1}Q_{A1}Q_{D2}^ {'}Q_{B2}^{'}Q_{C2}^{'} Y1=QC1QB1QA1QD2QB2QC2

同理,对于南北方向的黄灯:

Q C 1 Q B 1 Q A 1 = 100 Q_{C1} Q_{B1} Q{A1} = 100 QC1QB1QA1=100 时: Y 1 = 0 , Y 2 = 0 Y_{1}=0 , Y_{2}=0 Y1=0,Y2=0
Q C 1 Q B 1 Q A 1 = 101 Q_{C1} Q_{B1} Q{A1} = 101 QC1QB1QA1=101 时: Y 1 = 0 , Y 2 = 0 Y_{1}=0 , Y_{2}=0 Y1=0,Y2=0
Q C 1 Q B 1 Q A 1 = 110 Q_{C1} Q_{B1} Q{A1} = 110 QC1QB1QA1=110 时: Y 1 = 0 , Y 2 如 下 : Y_{1}=0 , Y_{2}如下: Y1=0,Y2

Y 1 / Q D 2 Y_{1}/Q_{D2} Y1/QD2 Q C 2 Q_{C2} QC200011110
Q B 2 Q_{B2} QB2 Q A 2 Q_{A2} QA2////
000000
010000
111000
101000

根据卡诺图化简可得到:

Y 2 = Q C 1 Q B 1 Q A 1 ′ Q D 2 ′ Q B 2 Q C 2 ′ Y_{2}=Q_{C1}Q_{B1}Q_{A1}^{'}Q_{D2}^ {'}Q_{B2}Q_{C2}^{'} Y2=QC1QB1QA1QD2QB2QC2

(b)对于绿灯信号的逻辑推导
对于东西方向绿灯的处理:

Q C 1 Q B 1 Q A 1 = 000 Q_{C1} Q_{B1} Q{A1} = 000 QC1QB1QA1=000 时: G 1 = 1 , G 2 = 0 G_{1}=1 , G_{2}=0 G1=1,G2=0
Q C 1 Q B 1 Q A 1 = 001 Q_{C1} Q_{B1} Q{A1} = 001 QC1QB1QA1=001 时: G 1 = 1 , G 2 = 0 G_{1}=1 , G_{2}=0 G1=1,G2=0
Q C 1 Q B 1 Q A 1 = 010 Q_{C1} Q_{B1} Q{A1} = 010 QC1QB1QA1=010 时: G 1 如 下 , G 2 = 0 G_{1}如下 , G_{2}=0 G1,G2=0

G 1 / Q D 2 G_{1}/Q_{D2} G1/QD2 Q C 2 Q_{C2} QC200011110
Q B 2 Q_{B2} QB2 Q A 2 Q_{A2} QA2////
001101
011101
111100
101100

根据卡诺图化简可有:

G 1 = Q C 1 ′ Q B 1 ′ + Q C 1 ′ Q B 1 + Q C 1 ′ Q B 1 Q A 1 ′ Q D 2 Q B 2 ′ Q C 2 ′ G_{1}=Q_{C1} ^ {'}Q_{B1} ^ {'}+Q_{C1} ^ {'}Q_{B1} +Q_{C1}^{'}Q_{B1}Q_{A1}^ {'}Q_{D2}Q_{B2} ^ {'}Q_{C2}^{'} G1=QC1QB1+QC1QB1+QC1QB1QA1QD2QB2QC2

对于南北方向绿灯的处理:

南北方向上的绿灯可以通过卡诺图化简,但更加便捷的方法是:当东西方向红灯亮且南北方向黄灯不亮时,则南北方向绿灯亮,基于此思想可以得到:

G 2 = ( R 1 + Y 2 ′ ) ′ G_{2}=(R_{1}+Y_{2}^{'})^{'} G2=R1+Y2)

©对于红灯信号的巧妙处理
对于东西方向红灯的处理:

当南北方向绿灯或黄灯亮时,东西方向红灯亮,故有:

R 1 = G 2 + Y 2 R_{1}=G_{2}+Y_{2} R1=G2+Y2

对于南北方向红灯的处理:

当东西方向灯或黄灯亮时,南北方向红灯亮,故有:

R 1 = G 2 + Y 2 R_{1}=G_{2}+Y_{2} R1=G2+Y2

1.5 信号灯译码模块

当主控电路构建完成后,根据逻辑表达式连接到相应信号灯上即可。如下图:
在这里插入图片描述

1.6 总电路及其仿真效果

电路整体搭建效果如下图:

在这里插入图片描述
相应仿真结果如下:

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

基于Quartus(verilog)对于交通灯的电路设计

在介绍了multisim搭建电路实现交通灯的方法后,接下来介绍如何利用FPGA的思想去实现。

1.1 step by step
1.1.1 首先给出状态转换表(此处状态编码为S1:000;S2:001:S3:010;S4:011;S5:100,即采用最简的状态编码形式)

在这里插入图片描述
在这里插入图片描述
(注:此处设计采用最小成本法)
根据卡诺图化简可得:S2*=S1S0

在这里插入图片描述
(注:此处仍然采用最小成本法)
由卡诺图化简可得:S1*=S1S0’+S1’S0

在这里插入图片描述
(注:此处仍然采用最小成本法)
由卡诺图化简可得:S0*=S0’

1.1.2 在1中已经得到了状态转换方程,下面给出状态输出表以便求出输出方程

在这里插入图片描述
(注:LA为东西方向的灯,LB为南北方向的灯)

在这里插入图片描述
(注:此处仍然采用最小成本法) 可有:LA1=S1’S0’

在这里插入图片描述
(注:此处仍然采用最小成本法)
可有:LA0=S1S0’

在这里插入图片描述
(注:此处仍然采用最小成本法)
可有:LB1=S2’S0’+S2’S1’

在这里插入图片描述
(注:此处仍然采用最小成本法)
可有:LB0=S2

在这里插入图片描述
(注:此处仍然采用最小成本法)
可有:Movout1=S1’S0

在这里插入图片描述
(注:此处仍然采用最小成本法)
可有:Movout0=S1S0

1.1.3 门级电路图。

在这里插入图片描述

1.2 verilog 代码实现

下面给出相应代码(verilog):

timescale 1 ps/ 1 ps       // 规定时间规模与时间精度
module trafficlight (        //建立模块
input clk,
input rst_n,            //端口说明
input x,
output  reg [1:0] LA,   // 指明LA为两位reg型输出
output  reg [1:0]LB,    // 指明LB为两位reg型输出
output  reg [1:0]movout  // 指明movout为两位reg型输出

);


reg [2 : 0] state;     //创立三位数组



parameter 
			S0=0,
			S1=1,
			S2=2,            //规定参数
			S3=3,
			S4=4,
         S5=5;

always@(posedge clk or negedge rst_n)   //always块语句,括号中为敏感条件
Begin                         //begin-end语句
	if(!rst_n)            //当rst_n为0时,执行下列语句
	begin
	LA=2'b00;         //   将2位二进制数00赋值给LA
	LB=2'b00;
	movout=2'b00;      //其余类似
	state<=S0;        //进入S0状态
	end
	Else             //当rst_n为1时,执行下列语句
	case(state)       //对于不同的状态有不同的情况
	S0:             //若此时S0状态
	  begin 
   LA=2'b10;      // 将2位二进制数10赋值给LA
	LB=2'b10;
	movout=2'b00;    
	 #3;    //延时3s
		 if(x==1)    //当x为1时
		   state<=S0;  //状态跳转到S0
		 Else     //当x为0时
		   state<=S1; //状态跳转到S1
	  end
	S1:           //以下均类似
	  begin 
	LA=2'b00;
	LB=2'b10;
	movout=2'b10;
	 #30;
		 if(x==1)
		   state<=S1;
		 else
		   state<=S2; 
	  end
	S2:
	  begin
	LA=2'b01;
	LB=2'b10;
	movout=2'b00;
 #3;	
		 if(x==1)
		   state<=S2;
		 else
		   state<=S3; 
	  end  
	S3:
	  begin 
	LA=2'b10;
	LB=2'b00;
	movout=2'b01;
	 #30;
		 if(x==1)
		   state<=S3;
		 else
		   state<=S4; 
	  end
	S4:
	  begin
	LA=2'b10;
	LB=2'b01;
	movout=2'b00;
	 #3;
		 if(x==1)
		   state<=S4;
		 else
		   state<=S5; 
	  end
	S5:
	  begin 
	LA=2'b00;
	LB=2'b10;
	movout=2'b10;
	 #30;
		 if(x==1)
		   state<=S5;
		 else
		   state<=S1; 
	  end
	
	default:      //出于严谨性的考虑,其余情况均执行下列操作
	begin
	LA=2'b00;
	LB=2'b10;
	movout=2'b10;
	state<=S1; 
	end
	endcase
end


endmodule

以及测试代码:

initial                                                
begin                                                  
x=0;
clk=1;
rst_n=0;
#10 rst_n=1;
#200 $stop;                      
end                                                    
always                                                
begin                                             
#1 clk=~clk;                                          
end  

1.3 仿真效果

在这里插入图片描述
在10个时间单位之后清零端被拉高系统开始有效运行,在起初三个时间单位内,可以看出LA是10,LB是10,movout是00,即初始状态为4个方向的红灯全亮,时间3个时间单位。

在这里插入图片描述
在上述状态之后,进入下一状态,如上图,此时LA为00,LB为10,movout为10,即东、西方向绿灯亮,南、北方向红灯亮。东、西方向通车,持续30个时间单位,符合设计要求。

其余分析类似。

总结

在进行电路设计时,应该有化繁为简的思想。对于复杂电路,我们可以将其分解为相应功能模块,逐一实现,最终级联即可。

未经允许请勿转载

欢迎交流

  • 38
    点赞
  • 165
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值