病房呼叫系统的设计1 设计要求1.用5个开关模拟5个病房的呼叫输入信号,1号优先级最高;1到5优先级依次降低;2.用一个数码管显示呼叫信号的;没信号呼叫时显示0;又多个信号呼叫时,显示优先级最高的呼叫号(其它呼叫号用指示灯显示);3.凡有呼叫发出5秒的呼叫声;4.对低优先级的呼叫进行存储,处理完高优先级的呼叫,再进行低优先级呼叫的处理(附加)。
2 设计思路及方案用74148优先编码器来实现病房呼叫的优先显示,用7447七段字形译码器接半导体数码管来用数字显示最高优先级的病房号,用计数器74193来实现模五的计数器,调节clock输入脉冲的频率来实现五秒的控制来实现闪烁五秒。
再用D触发器来实现锁存和复位清零功能。
3 设计过程3.1 优先编码和数据清零模块优先编码和数据清零模块的电路图如图1所示。
图1 优先编码和数据清零模块该病房呼叫系统一共有6个输入,分别是1~5号病房的呼叫开关num1~num5和1个复位清零健action(初始工作时至“1”),这六个开关配合D触发器来实现清零复位。
由于74148低电平有效,所以输入74148前先用非门取反,此电路用到的74148管脚输入对应输出真值表如表1所示。
表1 74148输入输出真值表输入输出X X X X 0 0 0 1 X X X 0 1 0 1 0 X X 0 1 1 0 1 1 X 0 1 1 1 1 0 00 1 1 1 1 1 0 1模五计数器电路图如图2所示。
图2 模五计数器电路图如图先将74193接成模五计数器,当有病房呼叫时CLR为0,计数器计数,当没有病房呼叫时计数器清零,通过调节clock输入脉冲的频率来实现闪烁五秒的控制。
3.3 显示病房号功能显示病房号功能的电路图如图3所示。
图3 显示病房号的电路图说明:该模块的输入为74148的输入,通过7447七段字形译码器进译码,将结果输出到半导体数码管进行显示。
3.4 设计总图设计总图如图4所示。
图4 设计总图说明:护士将action调节为1,表示工作。
当有病人呼叫时,数码管显示优先级高的病房号,所有的指示灯均亮。
74193和脉冲输入clock来控制灯闪烁5秒。
该设计基本上实现了病房呼叫系统的基本要求。
4 仿真结果图5 3号床位呼叫仿真图3号床位呼叫仿真图如图5所示。
开始时,7447输出编码为0000001,相应的半导体数码管显示为0.当3号病房呼叫,闪烁灯开始闪烁5秒,out3指示灯亮,7447输出编码为:0000110,对应的显示数字符号为3.护士按下action 使其为0,实现复位。
图6 2、3、4号床位同时呼叫仿真图2,3,4病房同时呼叫的仿真图如图6所示。
2、3、4同时呼叫时闪烁灯开始闪烁5秒,out2,out3,out4指示灯亮,7447输出编码为:0010010,对应的数码显示为2.图7 复位后新一轮的呼叫仿真图复位后新一轮的呼叫仿真图如图7所示。
护士复位后,开始新一轮的病房呼叫。
图8 优先级高的呼叫仿真图优先级高的呼叫仿真图如图8所示。
优先级高的呼叫时,在还没处理低的优先级时,有高优先级呼叫,数码显示会变成高优先级病房号的显示。
设计总结本设计是为在病人紧急需要时能很快进行救治的呼叫系统,增强医护人员更好的监护病人。
此系统的优点特色在于可以设立呼叫优先等级而不是单纯的病人呼叫,这样避免在有多个病人同时呼叫时,医护人员不知道应该先救治哪个。
在设计初期我不知道当有多个病人同时发出信号呼叫时,优先信号被优先编码器编码后,再经过译码显示后,医护人员处理完高级别信号,按下清零键;怎么样认其他病人的信号按照优先级别先后显示?当多信号同时呼叫时,对较低等级的呼叫信号不知道怎么处理,才能保证当高级别的信号被清零后,低级别的信号能及时的由系统自动呼出,而不再需要人为的控制输出的问题始终没有能找到合适有效的方法。
还有就是如何实现在医护人员已处理完毕当前呼叫的病人后,系统对当前呼叫信号的清零以保证其他呼叫信号能够及时的呼出以便医护人员能及时的对其他病人进行救治,从而避免因系统对病人呼叫信号的延迟导致病人不能及时接受护理而产生的严重后果。
特别是控制清零这个问题苦恼了我很长的时间,后来才在我翻阅相关书籍和浏览相关时找到了解决问题的办法,才知道这些问题可以通过对锁存器的合理使用来一一解决。
这也使我对学习的认识有了更深入的了解,对理论联系实际有了更加深刻的体会。
参考文献[1] Mark Zwolinski.Digital System Design with VHDL.电子工业,2002[2] 汪国强.SOPC技术与应用.机械工业,2006[3] 忠.实用数字电子技术.电子工业,1998[4] 延飞.数字电子技术实验与仿真.西北工业大学,2010[5] 侯建军,郭勇.SOPC技术基础教程.清华大学,2008附录设计程序1:非门library ieee;use ieee.std_logic_1164.all; entity as_not isport(a:in std_logic;f:out std_logic);end as_not;architecture behave of as_not is beginf<=not a;end behave;2:2输入与非门library ieee;use ieee.std_logic_1164.all; entity as_nand2 isport(a:in std_logic;b:in std_logic;f:out std_logic);end as_nand2;architecture behave of as_nand2 is beginf<=a nand b;end behave;3:2输入与门library ieee;use ieee.std_logic_1164.all;entity as_and2 isport(a:in std_logic;b:in std_logic;f:out std_logic);end as_and2;architecture behave of as_and2 isbeginf<=a AND b;end behave;4:优先编码器74148library ieee;use ieee.std_logic_1164.all;entity as_74148 isport(D:in std_logic_vector(7 downto 0);E1:in std_logic;Q:out std_logic_vector(2 downto 0);GS:out std_logic;E0:out std_logic);end as_74148;architecture rtl of as_74148 isbeginprocess(E1,D)beginif(e1='1') thenQ<="111";GS<='1';E0<='1';elsif(D="11111111" and E1='0') thenQ<="111";GS<='1';E0<='0';elsif(D(7)='0' and E1='0')thenQ<="000";GS<='0';E0<='1';elsif(D(6)='0' and E1='0')thenQ<="001";GS<='0';E0<='1';elsif(D(5)='0' and E1='0')thenQ<="";GS<='0';E0<='1';elsif(D(4)='0' and E1='0')thenQ<="011";GS<='0';E0<='1';elsif(D(3)='0' and E1='0')then Q<="100";GS<='0';E0<='1';elsif(D(2)='0' and E1='0')then Q<="101";GS<='0';E0<='1';elsif(D(1)='0' and E1='0')then Q<="110";GS<='0';E0<='1';elsif(D(0)='0' and E1='0')then Q<="111";GS<='0';E0<='1';elseQ<="111";GS<='1';E0<='0';end if;end process;end rtl;5:7447数码显示:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all; entity as_7447 isport(num:in std_logic_vector(3 downto 0); dout:out std_logic_vector(6 downto 0) );end as_7447;architecture a1 of as_7447 isbeginwith num selectdout<="1111110" when "0000","0110000" when "0001","1101101" when "0010","1111001" when "0011","0110011" when "0100","1011011" when "0101","1011111" when "0110","1110000" when "0111","1111111" when "1000","1111011" when "1001","0000000" when others;end a1;6:D触发器library ieee;use ieee.std_logic_1164.all;entity as_d isport(D:in std_logic;CP:in std_logic;R:in std_logic;Q:out std_logic;QB:out std_logic);end as_d;architecture rtl of as_d isbeginprocess(CP,R)beginif(CP' event and cp='1')thenif(R='0')thenQ<='0';QB<='1';ELSEQ<=D;QB<=not D;end if;end if;end process;end rtl;。