📄 p_a1_tst.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 + -