基于FPGA的病房呼叫系统的各模块附带代码

随着生活水平的提高,医疗水平也不断的提高,患者需求的及时传达就显得尤为重要,因而病房呼叫系统是医院的必备设备之一,为方便患者和医护人员之间的及时联系、提高医疗服务质量都起着极其重要的作用。

设计具有以下功能:

  1. 模拟病房呼叫输入;
  2. 显示优先级高的呼叫病房号,模拟呼叫声
  3. 对优先级低的呼叫进行存储,处理完高优先级后处理再处理

其他扩展功能可以自行针对开发板的功能模块具体设计合理的功能。

t注意:在本文中,对设计的蜂鸣器呼叫时间进行了限制,考虑实际应用,这一限制不太合理,可以自行研究修改为持续呼叫。

根据功能要求,设计为7个模块:锁存器模块、数据选择器模块、时间选择器模块、计时器模块、连接器模块、蜂鸣器模块、显示器模块。(每个模块的具体内容请移步上一篇文章《基于FPGA的病房呼叫系统》)。以及最后设计顶层封装,将各个模块连接。

锁存器模块的VHDL语言设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY SUOCUNQI IS

PORT(REST:IN STD_LOGIC_VECTOR(7 DOWNTO 0);//复位信号,高电平表示复位不工作,低电平表示复位

SIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);//8个输入信号

SOUT1:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);//输出信号与LED灯相连,使得有呼叫信号时,与病房相对应的灯亮

SOUT2:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);//输出信号连接数据选择器对信号进行选择

SOUT3:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)//输出信号控制计时模块中的SP信号

);

END SUOCUNQI;

ARCHITECTURE latch OF SUOCUNQI IS

 SIGNAL SOUT:STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN

 PROCESS(REST,SIN)//复位信号和输入信号为敏感信号

BEGIN

IF REST(0)='1'AND SIN(0)='1'THEN SOUT(0)<='1';//进程内为顺序语句

     ELSE SOUT(0)<='0';

    END IF;

    IF REST(1)='1'AND SIN(1)='1'THEN SOUT(1)<='1';

     ELSE SOUT(1)<='0';

    END IF;

    IF REST(2)='1'AND SIN(2)='1'THEN SOUT(2)<='1';

     ELSE SOUT(2)<='0';

END IF;

    IF REST(3)='1'AND SIN(3)='1'THEN SOUT(3)<='1';

     ELSE SOUT(3)<='0';

END IF;

    IF REST(4)='1'AND SIN(4)='1'THEN SOUT(4)<='1';

     ELSE SOUT(4)<='0';

END IF;

    IF REST(5)='1'AND SIN(5)='1'THEN SOUT(5)<='1';

     ELSE SOUT(5)<='0';

END IF;

IF REST(6)='1'AND SIN(6)='1'THEN SOUT(6)<='1';

     ELSE SOUT(6)<='0';

END IF;

IF REST(7)='1'AND SIN(7)='1'THEN SOUT(7)<='1';

     ELSE SOUT(7)<='0';

END IF;

 END PROCESS;

 SOUT1<=SOUT;

 SOUT2<=SOUT;

 SOUT3<=SOUT;

END ARCHITECTURE latch; 

数据选择器模块的VHDL语言设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY DATA_SELECT IS

 PORT(SOUT:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

YOU1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

YOU2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)

);

END DATA_SELECT;

ARCHITECTURE Data_selector OF DATA_SELECT IS

SIGNAL YOU:STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

 PROCESS(SOUT,YOU)//对病房号进行选择

 BEGIN//if多选择语句自顶向下的优先特性,先描述的优先级高,后描述的优先级低,1号优先级最高,8号优先级最低

IF SOUT(0)='1' THEN YOU<="0001";//SOUT(0)为高电平时,输出1号病房

ELSE IF SOUT(1)='1' THEN YOU<="0010";

ELSE IF SOUT(2)='1' THEN YOU<="0011";

ELSE IF SOUT(3)='1' THEN YOU<="0100";

ELSE IF SOUT(4)='1' THEN YOU<="0101";

ELSE IF SOUT(5)='1' THEN YOU<="0110";

ELSE IF SOUT(6)='1' THEN YOU<="0111";

ELSE IF SOUT(7)='1' THEN YOU<="1000";

ELSE YOU<="0000";

END IF;

END IF;

END IF;

END IF;

END IF;

END IF;

END IF;

END IF;

END PROCESS;

YOU1<=YOU;

YOU2<=YOU;

END ARCHITECTURE Data_selector;

时间数据选择的VHDL语言设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY TIME_SELECT IS

 PORT(REST:IN STD_LOGIC_VECTOR(7 DOWNTO 0);//复位信号

SOUT3:IN STD_LOGIC_VECTOR(7 DOWNTO 0);//控制计时模块的SP信号

YOU1:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

ZQ:OUT STD_LOGIC;//对应计时器SP

LJ:OUT STD_LOGIC//对应计时器的复位信号REST

);

END TIME_SELECT;

ARCHITECTURE Time_selector OF TIME_SELECT IS

BEGIN

 PROCESS(YOU1)

 BEGIN//if多选择语句自顶向下的优先特性

IF YOU1="0001" THEN LJ<=REST(0);//如果当前优先级最高的信号为1号病房,则将1号病房的复位信号状态赋给LJ信号

ELSE IF YOU1<="0010" THEN LJ<=REST(1);

ELSE IF YOU1<="0011" THEN LJ<=REST(2);

ELSE IF YOU1<="0100" THEN LJ<=REST(3);

ELSE IF YOU1<="0101" THEN LJ<=REST(4);

ELSE IF YOU1<="0110" THEN LJ<=REST(5);

ELSE IF YOU1<="0111" THEN LJ<=REST(6);

ELSE IF YOU1<="1000" THEN LJ<=REST(7);

END IF;

END IF;

END IF;

END IF;

END IF;

END IF;

END IF;

END IF;

END PROCESS;

PROCESS(SOUT3)

BEGIN

IF YOU1="0001" THEN ZQ<=SOUT3(0);// 如果当前优先级最高的信号为1号病房,则将1号病房信号状态赋给ZQ信号

ELSE IF YOU1<="0010" THEN ZQ<=SOUT3(1);

ELSE IF YOU1<="0011" THEN ZQ<=SOUT3(2);

ELSE IF YOU1<="0100" THEN ZQ<=SOUT3(3);

ELSE IF YOU1<="0101" THEN ZQ<=SOUT3(4);

ELSE IF YOU1<="0110" THEN ZQ<=SOUT3(5);

ELSE IF YOU1<="0111" THEN ZQ<=SOUT3(6);

ELSE IF YOU1<="1000" THEN ZQ<=SOUT3(7);

END IF;

END IF;

END IF;

END IF;

END IF;

END IF;

END IF;

END IF;

END PROCESS;

END ARCHITECTURE Time_selector;

计时器的VHDL语言设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY TIME IS

PORT(REST,SP,CLK:IN STD_LOGIC;

SECOND1,SECOND2,MINUTE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));

END ENTITY TIME;

ARCHITECTURE timer OF TIME IS

SIGNAL TIMECLK:STD_LOGIC;

SIGNAL SEC1,SEC2,MIN:STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

SECOND1(3 DOWNTO 0)<=SEC1(3 DOWNTO 0);

SECOND2(3 DOWNTO 0)<=SEC2(3 DOWNTO 0);

MINUTE(3 DOWNTO 0)<=MIN(3 DOWNTO 0);

PROCESS(CLK,SP)

VARIABLE CNT:INTEGER RANGE 0 TO 120;//相当于一个加法器

BEGIN

IF (CLK'EVENT AND CLK='1') AND SP='1' THEN CNT:=CNT+1;

IF CNT<60 THEN TIMECLK<='1';

ELSIF CNT<120 THEN TIMECLK<='0';

ELSE CNT:=0;TIMECLK<='0';?

END IF;

END IF;

END IF;

IF REST='0' THEN//复位,即响应信号,计时器归0

MIN<="0000";SEC2<="0000";SEC1<="0000";

ELSE //未响应呼叫信号

IF TIMECLK'EVENT AND TIMECLK='1' THEN

IF SEC1<"1001"THEN SEC1<=SEC1+1;//如果秒的个位数字小于9,则+1

  ELSE SEC1<="0000";

IF SEC2<"0101"THEN SEC2<=SEC2+1;//如果秒的十位数字小于9,则+1

  ELSE SEC2<="0000";

IF MIN<"1001"THEN MIN1<=MIN1+1;//如果分钟数字小于9,则+1

  ELSE MIN<="0000";

END IF;

  END IF;

  END IF;

  END IF;

  END IF;

  END IF;

END PROCESS;

END timer;

连接模块的VHDL语言设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY CONNECT IS

PORT(SECOND1:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

SECOND2:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

MINUTE:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

JISHI:OUT STD_LOGIC_VECTOR(11 DOWNTO 0));

END ENTITY CONNECT;

ARCHITECTURE ONE OF CONNECT IS

BEGIN

JISHI(11 DOWNTO 8)<=SECOND1;

JISHI(7 DOWNTO 4)<=SECOND2;

JISHI(3 DOWNTO 0)<=MINUTE;

END ARCHITECTURE ONE;

蜂鸣器模块的VHDL语言设计

(该部分应根据实际应用修改为持续呼叫,以下代码仅作参考)

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY FENGMING IS

PORT(BCD:IN STD_LOGIC_VECTOR(11 DOWNTO 0);

MING:OUT STD_LOGIC);

END ENTITY FENGMING;

ARCHITECTURE buzzer OF FENGMING IS

SIGNAL ING:STD_LOGIC;

BEGIN

PROCESS(BCD)

 BEGIN//11-8位对应秒的个位

  IF BCD="000000000000" THEN ING<='1';

  ELSE IF BCD="000100000000" THEN ING<='0';//1秒,输出低电平,蜂鸣器工作

  ELSE IF BCD="001000000000" THEN ING<='0';//2秒,输出低电平,蜂鸣器工作

  ELSE IF BCD="001100000000" THEN ING<='0';//3秒,输出低电平,蜂鸣器工作

  ELSE IF BCD="010000000000" THEN ING<='0';//4秒,输出低电平,蜂鸣器工作

  ELSE IF BCD="010100000000" THEN ING<='0';//5秒,输出低电平,蜂鸣器工作

  ELSE ING<='1';//其他时间,输出高电平,蜂鸣器不工作

  IF BCD=000000000011" THEN ING<='0';//3-0位对应分钟,灯亮3分钟0秒,输出低电平,蜂鸣器工作

  ELSE IF BCD="000100000011" THEN ING<='0';//3分1秒,输出低电平,蜂鸣器工作

  ELSE IF BCD="001000000011" THEN ING<='0';// 3分2秒,输出低电平,蜂鸣器工作

  ELSE IF BCD="001100000011" THEN ING<='0';// 3分3秒,输出低电平,蜂鸣器工作

  ELSE IF BCD="010000000011" THEN ING<='0';// 3分4秒,输出低电平,蜂鸣器工作

  END IF;

  END IF;

  END IF;

  END IF;

  END IF;

  END IF;

  END IF;

  END IF;

  END IF;

  END IF;

  END IF;

MING<=ING;

END PROCESS;

END ARCHITECTURE buzzer;

显示模块的VHDL语言设计

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY DISPLAY IS

PORT(CLK:IN STD_LOGIC;

SECOND1,SECOND2,MINUTE:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

YOU:IN STD_LOGIC_VECTOR(3 DOWNTO 0);//数据选择优先级最高的病房号和时间选择

DISP:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);//七段数码管,低电平有效

LEDCS:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));//显示等待时间和病房号

END ENTITY DISPLAY;

ARCHITECTURE show OF DISPLAY IS

SIGNAL CLK_1K:STD_LOGIC;

SIGNAL DATA:STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

PROCESS(CLK)

 VARIABLE CNT:INTEGER RANGE 0 TO 20;//1k的扫描信号

  BEGIN

  IF RISING_EDGE(CLK)THEN CNT:=CNT+1;

  IF CNT<10 THEN CLK_1K<='1';

  ELSIF CNT<20 THEN CLK_1K<='0';

  ELSE CNT:=0;CLK_1K<='0';?

  END IF;

  END IF;

  END IF;

END PROCESS;

PROCESS (CLK_1K)

 VARIABLE CNT2:STD_LOGIC_VECTOR(3 DOWNTO 0);

 VARIABLE CON3:INTEGER RANGE 0 TO 2;

 VARIABLE CIN:INTEGER RANGE 0 TO 2500000;?

BEGIN

IF CLK_1K'EVENT AND CLK_1K='1'THEN CNT2:=CNT2+1;

IF CNT2="0001" THEN LEDCS<="00001000";--片选信号

DATA<=MINUTE;

ELSE IF CNT2="0010" THEN LEDCS<="00000010";

DATA<=SECOND2;

ELSE IF CNT2="0011" THEN LEDCS<="00000001";

DATA<=SECOND1;

ELSE IF CNT2="0100" THEN LEDCS<="00100010";

DATA<=YOU;

CNT2:="0000";

END IF;

END IF;

END IF;

END IF;

END IF;

END PROCESS;

PROCESS(DATA)

 BEGIN

 CASE DATA IS

 WHEN "0000"=>DISP<="01000000";//0,七段数码管共阳极低电平有效dp,g,f,e,d,c,b,a

 WHEN "0001"=>DISP<="01111001";//1

 WHEN "0010"=>DISP<="00100100";//2

 WHEN "0011"=>DISP<="00110000";//3

 WHEN "0100"=>DISP<="00011001";//4

 WHEN "0101"=>DISP<="00010010";//5

 WHEN "0110"=>DISP<="00000010";//6

 WHEN "0111"=>DISP<="01111000";//7

 WHEN "1000"=>DISP<="10000100";//8

 WHEN "1001"=>DISP<="10010000";//9

 WHEN "1100"=>DISP<="11111111";//高电平无效

 WHEN OTHERS=>NULL;

 END CASE;

 END PROCESS;

 END show;

顶层封装整体程序

(采用元件例化语句将每个模块集合起来)

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY ward IS

PORT(SIN_ain:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

REST_ain:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

CLK_ain:IN STD_LOGIC;

MING_out,L:OUT STD_LOGIC;

SCOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

LEDCS_out:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

DISP_out:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

);

END ward;

ARCHITECTURE gather OF ward IS

COMPONENT SUOCUNQI

PORT(REST:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

SIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

SOUT1:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

SOUT2:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

SOUT3:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

END COMPONENT;

COMPONENT DATA_SELECT

PORT(SOUT:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

YOU1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

YOU2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));

END COMPONENT;

COMPONENT TIME_SELECT

PORT(REST:IN STD_LOGIC_VECTOR(7 DOWNTO 0);--复位信号

SOUT3:IN STD_LOGIC_VECTOR(7 DOWNTO 0);--控制计时模块的SP信号

YOU1:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

ZQ:OUT STD_LOGIC;--对应计时器SP

LJ:OUT STD_LOGIC);--对应计时器的复位信号REST

END COMPONENT;

COMPONENT TIME

PORT(REST,SP,CLK:IN STD_LOGIC;

SECOND1,SECOND2,MINUTE1,MINUTE2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));

END COMPONENT;

COMPONENT CONNECT

PORT(SECOND1:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

SECOND2:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

MINUTE1:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

MINUTE2:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

JISHI:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));

END COMPONENT;

COMPONENT FENGMING

PORT(BCD:IN STD_LOGIC_VECTOR(15 DOWNTO 0);

MING:OUT STD_LOGIC);

END COMPONENT;

COMPONENT DISPLAY

PORT(CLK:IN STD_LOGIC;

SECOND1,SECOND2,MINUTE1,MINUTE2:IN STD_LOGIC_VECTOR(3 DOWNTO 0);

YOU:IN STD_LOGIC_VECTOR(3 DOWNTO 0);--数据选择优先级最高的病房号和时间选择

DISP:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

LEDCS:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));--病房对应的LED灯

END COMPONENT;

SIGNAL A:STD_LOGIC_VECTOR(7 DOWNTO 0);

SIGNAL B:STD_LOGIC_VECTOR(15 DOWNTO 0);

SIGNAL C:STD_LOGIC;

SIGNAL D:STD_LOGIC;

SIGNAL E:STD_LOGIC_VECTOR(7 DOWNTO 0);

SIGNAL F:STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL G:STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL H:STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL I:STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL J:STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL K:STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

U1:SUOCUNQI PORT MAP(SIN=>SIN_ain,SOUT1=>A,REST=>REST_ain,SOUT3=>E,

SOUT2=>SCOUT);

U2:DATA_SELECT PORT MAP(SOUT=>A,YOU1=>F,YOU2=>G);

U3:TIME_SELECT PORT MAP(LJ=>C,ZQ=>D,REST=>REST_ain,SOUT3=>E,YOU1=>F);

U4:TIME PORT MAP(REST=>C,SP=>D,CLK=>CLK_ain,SECOND1=>H,SECOND2=>I,

                 MINUTE1=>J,MINUTE2=>K);

U5:CONNECT PORT MAP(JISHI=>B,SECOND1=>H,SECOND2=>I,MINUTE1=>J,MINUTE2=>K);

U6:FENGMING PORT MAP(BCD=>B,MING=>MING_out);

U7:DISPLAY PORT MAP(DISP=>DISP_out,LEDCS=>LEDCS_out,YOU=>G,CLK=>CLK_ain,

                    SECOND1=>H,SECOND2=>I,MINUTE1=>J,MINUTE2=>K);

END gather;

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值