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

📄 p_a1_tst.vhd

📁 Workshop vhdl code from Esperan
💻 VHD
字号:
-----------------------------------------------------------------------
-- 
-- Original Code Copyright (c) 1999 by Esperan. All rights reserved.
-- www.esperan.com
-- 
-- This source file may be used and distributed without restriction
-- provided that this copyright statement is not removed from the file
-- and that any derivative work contains this copyright notice. 
--
-- Esperan VHDL Alarm Clock Lab Exercise Design V5.0
-- *Advanced Lab Exercises*
--
-- P_altst.vhd
-- Package defining procedures for the Alarm Clock Controller
-- testbench in the Advanced Lab Exercise A.1
--
----------------------------------------------------

Library IEEE;
use IEEE.Std_Logic_1164.all; 
use std.textio.all;

------------------------------------------------------------------------
-- Package Declaration
------------------------------------------------------------------------

package P_ALARM_TEST is

-- type for telephone keypad keys - 
--'-' is the "no key" value, put first in declaration so sim initialises to it!
   type T_KEYPAD is ('-', '0',  '1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '#');


-- Constant for the clock period we will use
   constant PERIOD : time := 3.9 ms;

-- Constants to determine time for a keypress 
-- and time between keypresses
   constant KEYPRESS : time := 100 ms;
   constant KEYOFF : time := 300 ms;

-- This function converts std_logic to character so the standard 
-- write routine for character can be used

   function STDU2CHAR (LOGIC: std_logic) return character;

------------------------------------------------------------------------
-- The following procedures perform the actions required of the commands
-- SHALM, SETAL, SETTI, CLOCK and KTOUT
------------------------------------------------------------------------

   procedure DO_SHALM(signal ALARM_BUTTON: out std_logic);

   procedure DO_SETAL(SETTING: in string(1 to 4);
                      signal KEY : out std_logic_vector(3 downto 0);
                      signal ALARM_BUTTON: out std_logic);
  
   procedure DO_SETTI(SETTING: in string(1 to 4);
                      signal KEY : out std_logic_vector(3 downto 0);
                      signal TIME_BUTTON: out std_logic);
              
   procedure DO_COUNT(CYCLES: in character);

   procedure DO_KTOUT(signal KEY : out std_logic_vector(3 downto 0));

end P_ALARM_TEST;


------------------------------------------------------------------------
-- Package Body Declaration
------------------------------------------------------------------------
package body P_ALARM_TEST is

------------------------------------------------------------------------
-- STDU2CHAR type conversion function
------------------------------------------------------------------------
   function STDU2CHAR (LOGIC: std_logic) return character is
      variable CHAR : character;
   begin 
      case LOGIC is
         when '1' => CHAR := '1';
         when '0' => CHAR := '0';
         when others => CHAR := '-';
      end case;
      return CHAR;
   end STDU2CHAR;

------------------------------------------------------------------------
-- CHAR2INT type conversion function
--
-- This function is defined in package body but not in package - only visible 
-- to definitions within package body
------------------------------------------------------------------------
   function CHAR2INT (CHAR : character) return integer is
      variable INT : integer range 0 to 10;
   begin
      case CHAR is
         when '0' => INT := 0;
         when '1' => INT := 1;
         when '2' => INT := 2;
         when '3' => INT := 3;
         when '4' => INT := 4;
         when '5' => INT := 5;
         when '6' => INT := 6;
         when '7' => INT := 7;
         when '8' => INT := 8;
         when '9' => INT := 9;
         when others => 
      end case;
      return INT;
   end CHAR2INT;

------------------------------------------------------------------------
-- CHAR2VEC type conversion function
--
-- This function is defined in package body but not in package - only visible 
-- to definitions within package body
------------------------------------------------------------------------
 function CHAR2VEC (CHAR : character) return std_logic_vector is
      variable VEC : std_logic_vector(3 downto 0);
   begin
      case CHAR is
         when '0' => VEC := "0000";
         when '1' => VEC := "0001";
         when '2' => VEC := "0010";
         when '3' => VEC := "0011";
         when '4' => VEC := "0100";
         when '5' => VEC := "0101";
         when '6' => VEC := "0110";
         when '7' => VEC := "0111";
         when '8' => VEC := "1000";
         when '9' => VEC := "1001";
         when others => 
      end case;
      return VEC;
   end CHAR2VEC;

------------------------------------------------------------------------
-- SHALM command
------------------------------------------------------------------------
   procedure DO_SHALM(signal ALARM_BUTTON: out std_logic) is
   begin
      ALARM_BUTTON <= '1';
      wait for KEYPRESS;
      ALARM_BUTTON <= '0';
      wait for KEYOFF;
   end DO_SHALM;
       
------------------------------------------------------------------------
-- SETAL command
------------------------------------------------------------------------
   procedure DO_SETAL(SETTING: in string(1 to 4);
                      signal KEY : out std_logic_vector(3 downto 0);
                      signal ALARM_BUTTON: out std_logic) is
   begin
      for I in 1 to 4 loop
         KEY <= CHAR2VEC(SETTING(I));
         wait for KEYPRESS;
         KEY <= "1010";
         wait for KEYOFF;
      end loop;

      ALARM_BUTTON <= '1';
      wait for KEYPRESS;
      ALARM_BUTTON <= '0';
      wait for KEYOFF;

   end DO_SETAL;

------------------------------------------------------------------------
-- SETTI command
------------------------------------------------------------------------
   procedure DO_SETTI(SETTING: in string(1 to 4);
                      signal KEY : out std_logic_vector(3 downto 0);
                      signal TIME_BUTTON: out std_logic) is
   begin
      for I in 1 to 4 loop
         KEY <= CHAR2VEC(SETTING(I));
         wait for KEYPRESS;
         KEY <= "1010";
         wait for KEYOFF;
      end loop;

      TIME_BUTTON <= '1';
      wait for KEYPRESS;
      TIME_BUTTON <= '0';
      wait for KEYOFF;

   end DO_SETTI;

------------------------------------------------------------------------
-- COUNT command
------------------------------------------------------------------------
   procedure DO_COUNT(CYCLES: in character) is
   begin
      wait for (CHAR2INT(CYCLES))*PERIOD;
   end DO_COUNT;

------------------------------------------------------------------------
-- KTOUT command
------------------------------------------------------------------------
   procedure DO_KTOUT(signal KEY : out std_logic_vector(3 downto 0)) is
   begin
      KEY <= "0111";
      wait for KEYPRESS;
      KEY <= "1010";
      wait for 40*KEYOFF;
   end DO_KTOUT;

end P_ALARM_TEST;

⌨️ 快捷键说明

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