病房呼叫系统设计与仿真设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
病房呼叫系统
I)设计名称:病房呼叫系统
Ii)实验目的:
1、8个开关用于模拟8个病房的呼叫输入信号,1号优先级最高;1 ~ 8优先级依次递减;
2、用数码管显示呼叫信号;没有信号时显示0;当有多个信号呼叫时,显示优先级最高的
呼叫号码(其他呼叫用指示灯显示);用四个数码管显示呼叫等待时间。
3、每次通话都给出5秒的提示;呼叫3分钟,不处理输出报警信号。
扮演角色:存储低优先级呼叫,处理高优先级呼叫,然后处理低优先级呼叫。
3)设计思路:
1.总体设计思路:根据设计要求,我们将设计分为几个模块,分别是:锁存模块、选择模块(用于病房选择)、选择模块2(用于复位选择)、计时模块、显示模块和蜂鸣器模块。
2.总体设计流程:
(1)锁存器:为了存储和处理病房中的呼叫信号,需要一个用于存储所有呼叫信号的锁存器。
(2)数据选择器(最优选择):优先选择呼叫所在的病房,选择优先级最高的病房号,病房号从1到8依次递减。
(3)数据选择器2(最优选择2):优先选择时间控制信号,使数码管显示器显示的时间为当前优先级最高的病房呼叫时间。
(4)定时器:在病房呼叫系统中,要求每当有呼叫时,处理呼叫3分钟并输出报警信号,即
要求有模块对呼叫时间进行计时。
因此,设计了一个分钟计时器来计时通话时间。
实验室
的时钟频率是20MHZ,所以计时部分需要分成1s。
(5)显示:如果用1个数码管显示呼叫信号,则用4个数码管显示呼叫等待时间(mm ss),设计7段数字显示。
数字芯片选择低电平有效,扫描信号设置为1KHZ。
二,课程设计流程
I)模块分配
:闩锁模块
:优化模块,复位的优化模块
:正时模块
:显示模块
:连接模块、蜂鸣器模块
II)模块的具体设计
1.锁定模块:因为有8个病房,所以设计了8个输入信号,高电平为信号输入。
此外,考
虑到时间模块显示当前等待时间,时间显示当前等待时间是最好的。
因此,在锁定模块中,重置被添加到锁定模块。
高电平表示复位不起作用,低电平表示复位。
锁存器的输入信号连接到LED灯,以便当有呼叫信号时,对应于病房的灯点亮。
另一个相同的输出信号连接到优化器以优化信号,并且另一个相同的输出信号控制定时模块中的SP信号。
2.优化模块:根据设计要求,数码管要显示优先级最高的病房的呼叫信号,所以需要对病
房的呼叫信号进行优化。
考虑到时间的优先级,设计了两个优先级输出信号。
功能部分按照优先病房号的顺序输出由BCD码表示的1、2、3、4、5、6、7和8。
3.选择2:考虑到复位键一一对应的问题,只使用一个时间模块显示当前最高优先级病房
的等待时间,所以选择2模块接在选择模块后面,与8位宽的复位信号连接,然后输出的复位信号就是通过选择模块对应当前最高优先级病房的复位信号。
此时锁存模块的输出信号也被优化,并且具有最高优先级的所选信号对应于时间模块中的SP信号。
4.计时模块:mmss按设计要求由四个数码管显示,所以时间以秒为单位进位,实验箱中
的时间频率为20MHZ,所以选择0: 20,000,000,即一秒的分频。
另外,有呼叫信号的时候,SP=1,我们要马上计时,所以定义了每一秒钟有一个上升沿,上升沿来了,时间就计1s。
另外,之前的mmss。
5.显示模块:显示模块要显示的是最高优先级呼叫病房的mmss和呼叫等待时间。
所以在
模块的设计中,我们用中间的六个数码管依次显示当前最高优先级呼叫病房的号码,分钟的第十位,分钟的个位数,另一个数码管显示一个条形,与第二位相区别。
依次是秒的第十位和秒的第四位。
6.连接模块:由于每个模块成功后进行顶层设计时,时间模块和蜂鸣器模块的位宽不相等,
所以需要一个连接模块,使两个模块能够平滑连接。
连接模块的输出部分对应于时间
模块的mmss部分。
模块输出部分的15-12位对应秒的3-0位,宽度的11-8位对应秒的3-0位,宽度的7-4位对应分数的3-0位,宽度的3-0位对应分数的3-0位。
7.蜂鸣器模块:考虑到灯亮3分钟后定时器定时后发出5秒的提示声,报警模块与时间模
块连接。
当输入为0000时,表示1秒,0000表示2秒,以此类推。
当指示时间为1-5秒时,蜂鸣器将鸣响,输出将处于低电平。
手表显示蜂鸣器在响。
当时间在6秒到3分钟之间时,程序的另一个输出为高电平,此时蜂鸣器不工作。
当超过三分钟时,蜂鸣器将工作五秒钟发出警报。
此时已经达到了设计要求。
三。
课程设计综合介绍
我们一开始就为这个模块设计了不同的方案,后来发现在顶层设计中实现起来并不容易,连接后模块更加复杂,于是重新思考后有了当前模块的初稿。
但顶层设置完成后,运行实验箱显示的结果并不如预期。
经过多次调试,我选择了排除错误,先从自己做起,我把顶层连接改成了系统框图。
选择它的好处是比较直观,假设正确的话基本不会出错。
所以当问题再次出现的时候,我考虑到了各个模块的逻辑问题,一个一个的查找问题,从修改时间模块的SP电平,到修改蜂鸣器和相应的时间指示,再到修改优选模块的最终执行语句“YOU zero”,最终解决了定时器一直计数,蜂鸣器不工作,病房显示号不归零等问题。
1)病房呼叫系统框图如下:
II)集成引脚配置如下:
3)整体功能模拟
三。
总体设计和实施的描述:
有8个7段数码管,16个用户LED灯(8个大LED灯,8个小LED灯),16个开关输入口,8个dip开关,蜂鸣器等。
在实验箱上。
下载完工程pin锁后,下载到FPGA进行硬件测试。
实现如下:实验箱里有八个7段数码管,我们只用其中的六个,除了前两个,从左到右依次显示:ward,minitue2,minitue1,—— (bar),second2,second1。
我们使用八个小的发光二极管来显示病房号。
当电源打开时,计时器程序已经下载到实验箱中。
蜂鸣器一开始不响,六个数码管显示000-00。
dip开关从SW1到SW7依次指示病房号1-7。
按下dip开关SW1时,表示病房2开始计时。
蜂鸣器响5秒,然后不响。
当时间记录为三分钟时,闹钟再次响起。
当开关SW2和SW3同时按下时,病房号仍然显示为2,因为病房2的优先级高于病房3。
另外,打开病房对应的dip开关后,对应的指示灯开始亮起,小灯从左到右显示优先级最低的八个病房的呼叫情况。
该实验的特点之一是设置了8个复位信号。
我们主要考虑一个实际问题。
每个复位键对应当时优先级最高的病房的灯光控制和时间控制。
当护士去处理优先级最高的病房的呼叫信号时,按下复位键,发出明确的信号:有护士去处理这件事了。
与复位键相比,缺点是当有多个呼叫信号时,按下复位键会清除所有信号。
病房呼叫系统的整体流程
1.门闩
图书馆IEEE
使用IEEE。
STD_LOGIC_1164。
所有;
实体锁存器是
PORT(REST:IN STD _ LOGIC _ VECTOR(7 down to 0);
SIN:IN STD _ LOGIC _ VECTOR(7 down to 0);
sou t1:OUT STD _ LOGIC _ VECTOR(7 down to 0);
sout 2:OUT STD _ LOGIC _ VECTOR(7 down to 0);
sout 3:OUT STD _ LOGIC _ VECTOR(7 down to 0));
终结锁存器;
索存奇的建筑bhv是
信号sout:STD _ LOGIC _ VECTOR(7 down to 0);
开始
过程(休息,罪恶)
开始
如果REST(0)='1 ',SIN(0)='0 ',那么sout(0)< = ' 1 ';ELSE sout(0)< = ' 0 ';
结束IF;
如果REST(1)='1 ',SIN(1)='0 ',那么sout(1)< = ' 1 ';ELSE sout(1)< = ' 0 ';
结束IF;
如果REST(2)='1 ',SIN(2)='0 ',那么sout(2)< = ' 1 ';ELSE sout(2)< = ' 0 ';
结束IF;
如果REST(3)='1 ',SIN(3)='0 ',那么sout(3)< = ' 1 ';ELSE sout(3)< = ' 0 ';
结束IF;
如果REST(4)='1 ',SIN(4)='0 ',那么sout(4)< = ' 1 ';ELSE sout(4)< = ' 0 ';
结束IF;
如果REST(5)='1 ',SIN(5)='0 ',那么sout(5)< = ' 1 ';ELSE sout(5)< = ' 0 ';
结束IF;
如果REST(6)='1 ',SIN(6)='0 ',那么sout(6)< = ' 1 ';ELSE sout(6)< = ' 0 ';
结束IF;
如果REST(7)='1 ',SIN(7)='0 ',那么sout(7)< = ' 1 ';ELSE sout(7)< = ' 0 ';
结束IF;
结束进程;
sout 1 < = sout;
sout 2 < = sout;
sout 3 < = sout;
末端架构bhv
第二,优化模块
图书馆IEEE
使用IEEE。
STD_LOGIC_1164。
所有;
实体游喧是
端口(SOUT:在STD_LOGIC_VECTOR(7 DOWNTO 0)中);
you 1:OUT STD _ LOGIC _ VECTOR(3 down to 0);
YOU2:OUT STD_LOGIC_VECTOR(3降0));
结束游喧;
游喧建筑有限公司是
信号你:STD_LOGIC_VECTOR(3降0);
开始
流程(SOUT,你)
开始
如果SOUT(0)='1 '那么你< = " 0001 ";
ELSE如果SOUT(1)='1 '那么你< = " 0010 ";
ELSE如果SOUT(2)='1 '那么你< = " 0011 ";
ELSE如果SOUT(3)='1 '那么你< = " 0100 ";
ELSE如果SOUT(4)='1 '那么你< = " 0101 ";
ELSE如果SOUT(5)='1 '那么你< = " 0110 ";
ELSE如果SOUT(6)='1 '那么你< = " 0111 ";
ELSE如果SOUT(7)='1 '那么你< = " 1000 ";
否则你< = " 0000 ";
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束进程;
YOU1 < =你;
YOU2 < =你;
末端架构bhv
模拟分析
根据SOUT的不同值给你赋值,把最终结果赋给YOU1和YOU2。
第三,计时和优化模块
图书馆IEEE
使用IEEE。
STD_LOGIC_1164。
所有;
实体玄游2是
PORT(REST:IN STD _ LOGIC _ VECTOR(7 down to 0);
sout 3:IN STD _ LOGIC _ VECTOR(7 down to 0);
you 1:IN STD _ LOGIC _ VECTOR(3 down to 0);
ZQ:OUT STD _ LOGIC;
LJ:OUT STD _ LOGIC);
END玄游2;
宣油2号的建筑bhv是
开始
流程(YOU1)
开始
如果YOU1="0001 "那么LJ < = REST(0);
ELSE如果YOU1="0010 "那么LJ < = REST(1);
ELSE如果YOU1="0011 "那么LJ < = REST(2);
ELSE如果YOU1="0100 "那么LJ < = REST(3);
ELSE如果YOU1="0101 "那么LJ < = REST(4);
ELSE如果YOU1="0110 "那么LJ < = REST(5);
ELSE如果YOU1="0111 "那么LJ < = REST(6);
ELSE如果YOU1="1000 "那么LJ < = REST(7);
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束进程;
流程(SOUT3)
开始
如果YOU1="0001 "那么ZQ < = sout 3(0);
否则如果YOU1="0010 "那么ZQ < = sout 3(1);否则如果YOU1="0011 "那么ZQ < = sout 3(2);否则如果你1="0100 "那么ZQ < = sout 3(3);否则如果YOU1="0101 "那么ZQ < = sout 3(4);否则如果YOU1="0110 "那么ZQ < = sout 3(5);否则如果YOU1="0111 "那么ZQ < = sout 3(6);否则如果YOU1="1000 "那么ZQ < = sout 3(7);结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束进程;
末端架构bhv
模拟分析:
在第一个仿真图中,sout [0]、sout [1]、sout [4]和sout [7]分别被选通。
在选通的过程中,分别设置了0和1两个级别,与其他级别不同,所以我们可以看到选通的情况。
在第二个仿真图中,sout [0]、sout [1]、sout [4]、sout [6]和sout[7]分别被选通。
在选通的过程中,分别设置了0级和1级,与其他级别不同,所以我们可以看到选通的情况。
四。
时间模块
图书馆IEEE
使用IEEE。
STD_LOGIC_1164。
所有;
使用IEEE。
STD_LOGIC_UNSIGNED所有;
实体时间是
PORT(REST,SP,CLK:在STD_LOGIC中;
SECOND1,SECOND2,MINITUE1,minitue 2:OUT STD _ LOGIC _ VECTOR(3 down to 0));
结束实体时间;
建筑艺术的时间是
信号MINI:STD _ LOGIC;
-信号time clk:STD _ LOGIC;
信号SEC1,sec 2:STD _ LOGIC _ VECTOR(3 down to 0);
信号MINI1,mini 2:STD _ LOGIC _ VECTOR(3 down to 0);
开始
MINITUE1(3下降到0)<=MINI1(3下降到0);MINITUE2(3下降到0)<=MINI2(3下降到0);
秒1(3下降到0)< =秒1(3下降到0);秒2(3下降到0)< =秒2(3下降到0);
-过程(CLK,SP)
-变量CNT:整数范围0到100;-将频率除以1S
-开始
-如果CLK事件和CLK='1 '和SP='1 ',则CNT:= CNT+1;
-如果CNT<50,则TIMECLK < = ' 1
- ELSIF CNT<100,则TIMECLK < = ' 0
-ELSE CNT:= 0;TIMECLK < = ' 0
-END IF;
-END IF;
-结束流程;
-
进程(CLK,休息,SP)-程序的计时部分
开始
IF(REST='0 ')然后
MINI2 < = " 0000MINI1 < = " 0000SEC2 < = " 0000SEC1 < = " 0000
elsif(clk ' event and clk = ' 1 ' and sp = ' 1 ')然后检查时钟的上升沿。
如果sec 1 <“1001”,那么sec 1 < = sec 1+1;
其他
SEC1 < = " 0000
如果SEC2<"0101 ",则sec 2 < = sec 2+' 1 ';
其他
SEC2 < = " 0000
如果MINI1<"1001 ",则mini 1 < = mini 1+1;
其他
MINI1 < = " 0000
如果MINI2<"0101 ",则mini 2 < = mini 2+1;
其他
MINI2 < = " 0000
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束进程;
结束艺术;
模拟分析:
从上图可以看出,在恒定动作下,每隔一个恒定脉冲,秒1输入一位,秒1输入十位,秒2输入六位,分钟1输入一位,分钟1输入十位,分钟2输入一位。
在这个实验中,由于布局的原因,无法捕获minitue2的二进制。
连接模块
图书馆IEEE
使用IEEE。
STD_LOGIC_1164。
所有;
实体SQU是
PORT(second 1:IN STD _ LOGIC _ VECTOR(3 down to 0);
秒2:在STD_LOGIC_VECTOR中(3下降到0);
MINITUE1:在STD_LOGIC_VECTOR中(3下降到0);
MINITUE2:在STD_LOGIC_VECTOR中(3下降到0);
JISHI:OUT STD _ LOGIC _ VECTOR(15 down to 0));
结束SQU;
SQU的建筑之一是
开始
吉时(15 down to 12)< = second 1;
吉时(11下到8)< =秒2;
吉时(7下到4)< = minitue 1;
吉时(3 down to 0)< = minitue 2;
端架构一;
模拟分析
进行计时,时钟的分的十位和一位分别赋给计时的前四位和5-8位,时钟的秒的十位和一位分别赋给计时的9-12位和后13-16位。
六、蜂鸣器模块
图书馆IEEE
使用IEEE。
STD_LOGIC_1164。
所有;
实体冯明是
端口(
BCD:在STD_LOGIC_VECTOR中(15下降到0);
明:OUT STD _ LOGIC);
结束冯明;
冯明建筑有限公司是
信号ING:STD _ LOGIC;
开始
工艺(碱性催化分解)
开始
如果BCD="00000 "那么ING < = ' 1
ELSE如果BCD="00000 "那么ING < = ' 0
ELSE如果BCD="00000 "那么ING < = ' 0
ELSE如果BCD="00000 "那么ING < = ' 0
ELSE如果BCD="00000 "那么ING < = ' 0
ELSE如果BCD="00000 "那么ING < = ' 0
ELSE ING < = ' 1
如果BCD="10000 "那么ING < = ' 0
ELSE如果BCD="10000 "那么ING < = ' 0
ELSE如果BCD="10000 "那么ING < = ' 0 ELSE如果BCD="10000 "那么ING < = ' 0 ELSE如果BCD="10000 "那么ING < = ' 0 结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
结束IF;
明< = ING
结束进程;
末端架构bhv
七。
显示组件
使用IEEE。
STD_LOGIC_1164。
所有;
使用IEEE。
STD_LOGIC_UNSIGNED所有;
使用IEEE。
STD_LOGIC_ARITH。
所有;
实体显示是
端口(
CLK:在STD_LOGIC中;
SECOND1,SECOND2,MINITUE1,minitue 2:IN STD _ LOGIC _ VECTOR(3 down to 0);
你:在STD _ LOGIC _ VECTOR(3 down to 0);-展示区
DISP:OUT STD _ LOGIC _ VECTOR(7 down to 0);-显示代码
Led: out STD _ logic _ vector (7下降到0)-数字段选择
);
结束显示;
建筑的表现之一是
信号CLK _ 1K:STD _逻辑;
信号数据:STD _ LOGIC _ VECTOR(3 down to 0);
开始
clk _ 1 khz:process(clk)-产生1k扫描信号。
变量CNT:整数范围0到20000;
开始
如果RISING_EDGE(CLK)那么CNT:= CNT+1;
如果CNT < 10000THEN,则CLK _ 1K < = ' 1 ';
ELSIF CNT < 20000 then CLK _ 1K < = ' 0 ';
ELSE CNT:= 0;CLK _ 1K < = ' 0 ';
结束IF;
结束IF;
结束进程;
进程(clk _ 1k)-显示
变量CNT 2:STD _ LOGIC _ VECTOR(3 down to 0);
变量CNT3:INTEGERRANGE 0到2;
变量CNT:INTEGERRANGE 0到2500000;
开始
如果CLK_1K '事件和CLK_1K='1 ',那么CNT 2:= CNT 2+1;
如果CNT2="0001 "则
LEDCS < = " 00010000
DATA < = MINITUE2
ELSIF CNT2="0010 "然后
LEDCS < = " 00001000
DATA < = MINITUE1
ELSIF CNT2="0011 "然后
LEDCS < = " 00000100
数据< = " 1010 ";
ELSIF CNT2="0100 "然后
LEDCS < = " 00000010
DATA < = SECOND2
ELSIF CNT2="0101 "然后
LEDCS < = " 00000001
DATA < = SECOND1
ELSIF CNT2="0110 "然后
LEDCS < = " 00100000
数据< =你;
CNT 2:= " 0000 ";
结束IF;
结束IF;
结束进程;
流程(数据)
开始
案例数据是
当" 0000 " = > DISP < = " 11000000 ";- 0
当" 0001 " = > DISP < = " 11111001 ";- 1
当" 0010 " = > DISP < = " 10100100 ";- 2
当" 0011 " = > DISP < = " 10110000 ";- 3
当" 0100 " = > DISP < = " 10011001 ";- 4
当" 0101 " = > DISP < = " 10010010 ";- 5
当" 0110 " = > DISP < = " 10000010 ";- 6
当" 0111 " = > DISP < = " 11111000 ";- 7
当" 1000 " = > DISP < = " 10000000 ";- 8
当" 1001 " = > DISP < = " 10010000 ";- 9
当" 1010 " = > DISP < = " 10111111 ";-音程条
当" 1011 " = > DISP < = " 10111111 ";-音程条
当" 1100 " = > DISP < = " 11111111 ";-超出周长,停止将不会显示,直到它是正确的。
WHEN OTHERS = > NULL-小心点!!!!!!不能是1111111,否则会出错,生成空显示。
结束案例;
结束进程;
结束一;。