《基于simulink的逻辑电路仿真-交通灯设计》由会员分享,可在线阅读,更多相关《基于simulink的逻辑电路仿真-交通灯设计(19页珍藏版)》请在金锄头文库上搜索。
1、Simulink逻辑电路仿真交通灯设计2014春季 Matlab系统仿真分析作业 完成日期 2014.04.29目录设计说明1设计思路1具体设计步骤2计数器的设计2计数器的仿真10交通灯电路设计。15交通灯仿真17设计说明本文设计了一个简易的交通灯时序逻辑电路,该电路通过对输入时钟信号的分频,控制红黄绿三种交通灯的按顺序亮灭并循环,其中绿灯持续25s,黄灯持续5s,红灯持续35s。主要用到的器件为jk触发器,与门,与非门,或门,或非门。为了实现交通灯控制电路,首先设计并封装了4位计数器,在此基础上进一步搭建逻辑电路,实现交通灯的控制,并分别对这些模块进行了仿真。设计思路主要的设计思路是利用jk
2、触发器串联的方式对输入的时钟进行分频,然后在相应的时刻产生控制脉冲信号,通过这个信号对信号灯的状态进行翻转。Jk触发器是一种边沿敏感器件,有对上升沿和下降沿敏感的两类,他们的符号如下:其真值表如下:在这个设计中,将jk触发器的j和k端都置1,从而Q端在每个时钟沿到来时进行翻转,然后将上一级的Q作为下一级的clk,这样达到对clk进行分频的目的。波形如下:具体设计步骤计数器的设计打开matlab,这里使用的版本为R2014A.启动画面如下:启动之后点击这里启动simulink打开之后界面如下:点击FileNewModel打开界面如下:下面的步骤为寻找仿真模型或原件,并摆放在上面的untiled文
3、档中。首先将窗口切换到Simulink Library Browser窗口,展开Simulink ExtrasFlip Flops,左侧就会出现常用的触发器模型,其中就有jk触发器,用鼠标左键选中J-K Flip-Flop并拖到untiled文档中一个jk触发器可以对时钟2分频,2个串联可以4分频,这里6个才能满足需求,但是为了便于扩展应用,这里将4个jk触发器作为一组串联起来。untiled文档中已经有一个,鼠标右键拖动这个jk触发器即可复制。调整四个jk触发器的位置,如图:该窗口左上角标题右侧的*表示该文档有改动并且未保存。该窗口中按下鼠标滚轮键鼠标会变成手状,这时可以拖动整个视图,滚动鼠
4、标滚轮可以放大缩小视图,左键选中模型按del键可以删除模型。模型中端口上的箭头表示信号流动方向,连线的时候必须按照箭头的方向进行,不能使信号流动方向和箭头方向相反,否则仿真时可能会报错。连线时为了在一条线上引出分支,可以用鼠标右键点击分支处即可引出。两个线相交的地方有黑点表示电气相连,没有黑点表示相交但不相连。在前面的分析中提到这里要将jk出发器的jk端置1,这需要常量和数据类型转换模块,因为在matlab中大部分模型的输出是数值型的,比如为float或者double型的,这样如果输出了1,它可能是double或者int类型的,而逻辑电路中的1是一种逻辑电平,这两者的含义是不同的,因此如果要给
5、触发器输入1,需要将一个常量1转换为逻辑1,这就是Data Type Conversion的作用,常量1的输出通过Constant实现,他们在Commonly Used Blocks中,如图,分别拖放两个模型到untiled文档中。现在untitled文档中的模型如下:双击Data Type Conversion1可以打开它的属性对话框,我们需要关心的是转换的类型,这个可以通过Output data type后面的下拉框来设置,其中就有boolean这种类型。默认为Inherit: Inherit via back propagation方式输出,意思为从输出端反向继承数据类型,也就是说输出端
6、连接的端口需要什么类型就转化为相应的类型。这里需要改为boolean就可以实现给触发器输入高电平。调整他们的位置并按下面的样子完成连线:然后按ctrl+s保存文档,如下:下面对这个模块进行封装,按下ctrl+A选中所有模型,再通过下面的方式进行封装(快捷键Ctrl+G)封装之后变成这个样子:双击进入该模块内部,可以看见自动为输入和输出添加了连接点并编号,如下:上面这幅图片中出现了很多double,这是由于Data Type Conversion输出没有改成boolean而又进行了仿真造成的,如果不改也能仿真,但是数据类型不是逻辑电平,如果修改了就不会出现上面的那些字符。这里面部分端口不使用,摆
7、放位置也比较乱,可以选中之后进行修改,修改之后如下:然后按下ctrl+s进行保存,点击下面的位置返回到顶层视图此时封装的模块变成了下面的样子:我们可以双击模块下面的名称来改变它,因为这个模块可以进行015的循环计数,这里将名称改成counter_16。如下:计数器的仿真现在一个4位计数器已经实现了,下面做一个简单的仿真来检测这个计数器是否能工作。切换到Simulink Library Browser窗口,在SimulinkSinks中获取示波器Scope,在Simulink ExtrasFlipFlops中获取时钟模块Clock,并将它们拖放到my_counter文档中,如图然后双击Scope
8、打开示波器,然后点击菜单栏的齿轮图标打开示波器属性对话框,设置示波器的输入通道为5,勾选Legends,这样就能同时观测5个信号,并显示信号名称。点击Apply,OK.此时示波器有了5个通道,示波器的符号也发生了变化,如图: 但是此时示波器的符号有点小,以至于输入端口出现交叠,这样不便于连线,鼠标放在该图标上是图标四周会出现四个小方块,鼠标移到某一个方块上时可以调整图标大小,重新调整大小使其方便连线,如下: 然后双击Clock打开时钟属性对话框,将时钟的周期设置为1然后按照下面的方式完成连线。在下面的工具栏中设置仿真时间长度,前面设置了时钟周期为1,下面设置仿真时间长度为10,那么就会有10个
9、完整的时钟。点击下图左边第一个带齿轮的后退图标可以设置仿真时前进和后退的相关参数,点击之后我们可以看见有是否允许后退,前进按钮按下时前进幅度,暂停时刻等设置。绿色的运行按钮按下时会进行指定时长的仿真。前进按钮按下时会执行指定步长的仿真,此时前进按钮右边的停止按钮会被激活,只有按下该停止按钮才能推出单步仿真模式。现在将仿真时长设置为40,然后按下绿色的运行按钮。仿真40个时间长度后会自动停止,然后双击示波器,如下图:打开时波形可能不是这样的,需要一些调整,首先鼠标放在任何一个通道上右键,选择Autoscale,这样波形将充满整个屏幕,并根据屏幕大小调整。我们可以发现各个通道纵轴坐标范围都是-5到
10、5,而我们这里是对逻辑电路进行仿真,电平值只有0和1两个,这里可以右键,选择Axes properties,设置纵轴的范围为0到2 然后可以拖拽右侧的信号名称到合适位置,调整好如下图:由图我们可以看到四个输出端分别对时钟进行了2,4,8,16分频,增加输出端的状态就能够实现计数功能。交通灯电路设计交通灯设计的关键思路就是根据不同时刻对不同的灯进行开关操作。这里为了简单没有为计数器设计清零端,由于一个计数器只能计时16个时间单位,这里我们将两个计数器串联起来,从而实现256个时间单位的计数,但是红绿灯的一次完整切换并不需要这么多时间,我们选择低6位作为计数端,6位能实现64个时间单位的计数,我们
11、将时间进行一个划分,绿灯持续25s,黄灯持续5s,红灯持续35s,这样就需要在25,30,63这三个时刻输入控制信号。这里我们输出一个脉冲信号,然后利用这个脉冲信号对红绿灯状态进行翻转。25超过了一位计数器的计数范围,它可以拆分为16+9,也就是低位计数器计数为9,高位计数器计数为1,这样用二进制表示就为0001_1001,而我们一共采用了低6位,所以对应的计数器输出状态为01_1001,这样我们将其中的3个1输入到三输入与门,3个0输入到三输入或非门,然后将它们的结果通过二输入与门输出。对于30,63时刻做同样处理。在simulink中直接能得到与门模型,上面我们用到了或非门,以及3输入与门
12、等模型,这个需要对与门进行设置,双击一个与门模型,弹出属性对话框,在operator中可以选择改门的类型,比如与门,与非门,反相器,或门等,下面的Number of input ports可以设置这个门的输入数目。上面我们通过对计数器的输出进行逻辑组合得到3个脉冲信号,然后我们需要使用这3个脉冲信号对交通灯状态进行翻转,设计思路是使用jk触发器的取反功能,将脉冲信号作为时钟信号,并设置jk触发器的初始值,jk触发器的输出作为交通灯的状态控制信号。其中为了实现交通灯的轮流亮灭,需要将相关的信号加入jk触发器的时钟信号中,使用或门进行复合,比如黄灯状态的翻转不仅仅由5s定时脉冲的到来控制,还要在红灯脉冲到来时翻转为0状态,也就是黄灯是在绿灯延时结束时打开,在黄灯延时结束时关闭,所以黄灯的控制信号有两个,其他两个灯的控制信号也是如此。按照上述思路完成元件的设置,摆放,并按下图完成连线。交通灯仿真设置仿真时间为100s,点击仿真按钮控制脉冲:交通灯状态:180s内的仿真结果: