⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 代码讲解.txt

📁 本文件是针对了解闹钟控制系统而写的一个VHDL源代码。
💻 TXT
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
PACKAGE P_ALARM IS   --定义一个程序包
   SUBTYPE T_DIGITAL IS INTEGER RANGE 0 TO 9;     --定义一个子类
   SUBTYPE T_SHORT IS INTEGER RANGE 0 TO 65535;   
   TYPE T_CLOCK_TIME IS ARRAY(3 DOWNTO 0) OF T_DIGITAL;  --计时器的时间类型为数组类型
   TYPE T_DISPLAY IS ARRAY(3 DOWNTO 0) OF STD_LOGIC_VECTOR(6 DOWNTO 0);  --
   TYPE SEG7 IS ARRAY(0 TO 9) OF STD_LOGIC_VECTOR(6 DOWNTO 0);   --七段译码器
   CONSTANT SEVEN_SEG:SEG7:=(
                             "0111111",
                             "0000110",
                             "1011011",
                             "1001111",
                             "1100110",
                             "1101101",
                             "1111101",
                             "0000111",
                             "1111111",
                             "1110011"
                            );  --七个信号为常量
   TYPE KEYPAD9 IS ARRAY (0 TO 9) OF STD_LOGIC_VECTOR(9 DOWNTO 0); --数字键
   CONSTANT KEYNUMBER:KEYPAD9:=(
                             "0000000001",
                             "0000000010",
                             "0000000100",
                             "0000001000",
                             "0000010000",
                             "0000100000",
                             "0001000000",
                             "0010000000",
                             "0100000000",
                             "1000000000"
                            );  --常量赋值
  END PACKAGE P_ALARM;


------------------闹钟控制器的设计--------------
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.P_ALARM.ALL;
ENTITY ALARM_CONTROLLER IS   --控制器实体的定义
   PORT(KEY: IN STD_LOGIC;   --(端口的定义) --数字键
        ALARM_BUTTON: IN STD_LOGIC;  --闹铃键
        TIME_BUTTON: IN STD_LOGIC;    --计时器时间
        CLK: IN STD_LOGIC;            
        RESET: IN STD_LOGIC;          
        LOAD_NEW_A: OUT STD_LOGIC;    -- 
        LOAD_NEW_C:OUT STD_LOGIC;     --
        SHOW_NEW_TIME: OUT STD_LOGIC; --
        SHOW_A: OUT STD_LOGIC);       --
END ENTITY ALARM_CONTROLLER;
ARCHITECTURE ART OF ALARM_CONTROLLER IS
  TYPE T_STATE IS(S0,S1,S2,S3,S4);   --
  CONSTANT KEY_TIMEOUT:T_SHORT:=500; --
  CONSTANT SHOW_ALARM_TIMEOUT:T_SHORT:=500;  --
  SIGNAL CURR_STATE: T_STATE;     --
  SIGNAL NEXT_STATE:T_STATE;      --
  SIGNAL COUNTER_K:T_SHORT;       --
  SIGNAL ENABLE_COUNT_K: STD_LOGIC; --
  SIGNAL COUNT_K_END: STD_LOGIC;   --
  SIGNAL COUNTER_A:T_SHORT;        --
  SIGNAL ENABLE_COUNT_A:STD_LOGIC; --
  SIGNAL COUNT_A_END: STD_LOGIC;   --
  BEGIN
  PROCESS(CLK,RESET) IS           --
    BEGIN
    IF RESET ='1' THEN
        CURR_STATE<=S0;
    ELSIF RISING_EDGE(CLK) THEN
       CURR_STATE<=NEXT_STATE;
    END IF;
 END PROCESS;
PROCESS(KEY,ALARM_BUTTON,TIME_BUTTON,CURR_STATE,
        COUNT_A_END,COUNT_K_END) IS
    BEGIN
      NEXT_STATE<=CURR_STATE;
      LOAD_NEW_A<='0';
      LOAD_NEW_C<='0';
      SHOW_A<='0';
      SHOW_NEW_TIME<='0';
      ENABLE_COUNT_K<='0';
      ENABLE_COUNT_A<='0';
 
     CASE CURR_STATE IS
     WHEN S0=>
       IF(KEY='1') THEN
          NEXT_STATE<=S1;
          SHOW_NEW_TIME<='1';
       ELSIF(ALARM_BUTTON='1') THEN
         NEXT_STATE<=S4;
         SHOW_A<='1';
       ELSE
         NEXT_STATE<=S0;
       END IF;
    WHEN S1=>
       IF(KEY='1') THEN
          NEXT_STATE<=S1;
          SHOW_NEW_TIME<='1';
       ELSIF(ALARM_BUTTON='1') THEN
         NEXT_STATE<=S2;
         LOAD_NEW_A<='1';
       ELSIF(TIME_BUTTON='1') THEN 
          NEXT_STATE<=S3;
          LOAD_NEW_C<='1';
       ELSE
         IF(COUNT_K_END='1') THEN
          NEXT_STATE<=S0;
       ELSE
         NEXT_STATE<=S1;
       END IF;
       ENABLE_COUNT_K<='1';
       END IF;
         SHOW_NEW_TIME<='1';
   WHEN S2=>
       IF(ALARM_BUTTON='1') THEN
          NEXT_STATE<=S2;
          LOAD_NEW_A<='1';
       ELSE
         NEXT_STATE<=S0;
       END IF;
   WHEN S3=>
       IF(TIME_BUTTON='1') THEN
          NEXT_STATE<=S3;
          LOAD_NEW_C<='1';
       ELSE
         NEXT_STATE<=S0;
       END IF;

   WHEN S4=>
       IF(KEY='1') THEN
          NEXT_STATE<=S1;
          ELSE
            NEXT_STATE<=S4;
            IF(COUNT_A_END='1') THEN
               NEXT_STATE<=S0;
         NEXT_STATE<=S4;
         SHOW_A<='1';
         END IF;
         ENABLE_COUNT_A<='1';
         END IF;
       WHEN OTHERS=>
           NULL;
       END CASE;
 END PROCESS;

COUNT_KEY :PROCESS(ENABLE_COUNT_K,CLK) IS
BEGIN
  IF(ENABLE_COUNT_K='0') THEN
     COUNTER_K<=0;
     COUNT_K_END<='0';
 ELSIF(RISING_EDGE(CLK)) THEN
    IF(COUNTER_K>=KEY_TIMEOUT) THEN
       COUNT_K_END<='1';
    ELSE
       COUNTER_K<=COUNTER_K+1;
    END IF;
 END IF;
END PROCESS COUNT_KEY;

 COUNT_ALARM: PROCESS(ENABLE_COUNT_A,CLK) IS
 BEGIN
   IF(ENABLE_COUNT_A='0')THEN
     COUNTER_A<=0;
     COUNT_A_END<='0';
  ELSIF RISING_EDGE(CLK) THEN
    IF(COUNTER_A>=SHOW_ALARM_TIMEOUT) THEN
      COUNT_A_END<='1';
  ELSE
    COUNTER_A<=COUNTER_A+1;
  END IF;
 END IF;
END PROCESS COUNT_ALARM;
END ARCHITECTURE ART;


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -