📄 operation.vhd
字号:
---------------------------------------------------------------------------------------------------
--*************************************************************************************************
-- CreateDate : 2007-08-20
-- ModifData : 2007-08-20
-- Description : Operation
-- Author : Explorer01
-- Version : V1.0
--*************************************************************************************************
---------------------------------------------------------------------------------------------------
-- VHDL library Declarations
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- The Entity Declarations
ENTITY Operation IS
PORT
(
RESET : IN STD_LOGIC;
GCLK : IN STD_LOGIC;
CLK1 : IN STD_LOGIC;
CLK2 : IN STD_LOGIC;
CLK3 : IN STD_LOGIC;
-------------------------------------
-- Switch
SW : IN STD_LOGIC_VECTOR(5 DOWNTO 0);
-------------------------------------
-- Keyboard 4*4
KeyValid: IN STD_LOGIC;
KeyCode : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
-------------------------------------
-- PS2
PS2Valid: IN STD_LOGIC;
PS2Code : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
-------------------------------------
-- Temperation ( DS18B20 )
TempValid: IN STD_LOGIC;
TempCode : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
-------------------------------------
-- RS232 ( UART )
UARTValid: IN STD_LOGIC;
UARTCode : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
-------------------------------------
-- irDA
irDAValid: IN STD_LOGIC;
irDACodeL: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
irDACodeM: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
irDACodeU: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
--===================================
-------------------------------------
-- LED8 & Light
LEDValue : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
DigitValue : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
-- LightValue : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
-------------------------------------
-- LCD1602
LCDFresh: OUT STD_LOGIC;
CharAdd : IN STD_LOGIC_VECTOR(5 DOWNTO 0);
LCDValue: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
-------------------------------------
-- Music
MusicEnable : OUT STD_LOGIC;
Speak : OUT STD_LOGIC;
-------------------------------------
-- SPI
SPI_CS : OUT STD_LOGIC;
SPI_RW : OUT STD_LOGIC;
SPI_STRB : OUT STD_LOGIC;
SPI_Address : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
SPI_Data : INOUT STD_LOGIC_VECTOR(15 DOWNTO 0);
-------------------------------------
-- I2C
I2C_CS : OUT STD_LOGIC;
I2C_RW : OUT STD_LOGIC;
I2C_STRB : OUT STD_LOGIC;
I2C_Address : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
I2C_Data : INOUT STD_LOGIC_VECTOR(7 DOWNTO 0)
-------------------------------------
--
);
END Operation;
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
-- The Architecture of Entity Declarations
ARCHITECTURE Behavioral OF Operation IS
------------------------------------------------
-- SPI Memory : 93LC46B
SIGNAL SPIDataR, SPIDataW : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL DataIN, DataOUT : STD_LOGIC_VECTOR(15 DOWNTO 0);
SIGNAL KeyFlag, KeyFlagValid1, KeyFlagValid2, KeyFlagRefresh : STD_LOGIC;
SIGNAL CS, RW, STRB : STD_LOGIC;
SIGNAL CountFilter : STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL CountSTEP : INTEGER RANGE 0 TO 7;
------------------------------------------------
-- I2C
SIGNAL I2CDataR, I2CDataW : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL DataINI, DataOUTI : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL KeyFlagValidIIC1 : STD_LOGIC;
SIGNAL CSI, RWI, STRBI : STD_LOGIC;
------------------------------------------------
-- LED
TYPE LEDRAM IS ARRAY( 0 TO 7 ) OF STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL LED_ARRAY : LEDRAM;
SIGNAL Refresh: STD_LOGIC_VECTOR(2 DOWNTO 0);
------------------------------------------------
-- LCD1602
TYPE LCDRAM IS ARRAY( 0 TO 31 ) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL LCD_ARRAY : LCDRAM;
SIGNAL Fresh, CLK2P : STD_LOGIC;
------------------------------------------------
-- irDA
---------------------------------------------------------------------------------------------------
FUNCTION Char_To_Integer ( indata :character) return integer is
VARIABLE result : INTEGER RANGE 0 TO 16#7F#;
BEGIN
CASE indata IS
WHEN ' ' => result := 32;
WHEN '!' => result := 33;
WHEN '"' => result := 34;
WHEN '#' => result := 35;
WHEN '$' => result := 36;
WHEN '%' => result := 37;
WHEN '&' => result := 38;
WHEN ''' => result := 39;
WHEN '(' => result := 40;
WHEN ')' => result := 41;
WHEN '*' => result := 42;
WHEN '+' => result := 43;
WHEN ',' => result := 44;
WHEN '-' => result := 45;
WHEN '.' => result := 46;
WHEN '/' => result := 47;
WHEN '0' => result := 48;
WHEN '1' => result := 49;
WHEN '2' => result := 50;
WHEN '3' => result := 51;
WHEN '4' => result := 52;
WHEN '5' => result := 53;
WHEN '6' => result := 54;
WHEN '7' => result := 55;
WHEN '8' => result := 56;
WHEN '9' => result := 57;
WHEN ':' => result := 58;
WHEN ';' => result := 59;
WHEN '<' => result := 60;
WHEN '=' => result := 61;
WHEN '>' => result := 62;
WHEN '?' => result := 63;
WHEN '@' => result := 64;
WHEN 'A' => result := 65;
WHEN 'B' => result := 66;
WHEN 'C' => result := 67;
WHEN 'D' => result := 68;
WHEN 'E' => result := 69;
WHEN 'F' => result := 70;
WHEN 'G' => result := 71;
WHEN 'H' => result := 72;
WHEN 'I' => result := 73;
WHEN 'J' => result := 74;
WHEN 'K' => result := 75;
WHEN 'L' => result := 76;
WHEN 'M' => result := 77;
WHEN 'N' => result := 78;
WHEN 'O' => result := 79;
WHEN 'P' => result := 80;
WHEN 'Q' => result := 81;
WHEN 'R' => result := 82;
WHEN 'S' => result := 83;
WHEN 'T' => result := 84;
WHEN 'U' => result := 85;
WHEN 'V' => result := 86;
WHEN 'W' => result := 87;
WHEN 'X' => result := 88;
WHEN 'Y' => result := 89;
WHEN 'Z' => result := 90;
WHEN '[' => result := 91;
WHEN '\' => result := 92;
WHEN ']' => result := 93;
WHEN '^' => result := 94;
WHEN '_' => result := 95;
WHEN '`' => result := 96;
WHEN 'a' => result := 97;
WHEN 'b' => result := 98;
WHEN 'c' => result := 99;
WHEN 'd' => result := 100;
WHEN 'e' => result := 101;
WHEN 'f' => result := 102;
WHEN 'g' => result := 103;
WHEN 'h' => result := 104;
WHEN 'i' => result := 105;
WHEN 'j' => result := 106;
WHEN 'k' => result := 107;
WHEN 'l' => result := 108;
WHEN 'm' => result := 109;
WHEN 'n' => result := 110;
WHEN 'o' => result := 111;
WHEN 'p' => result := 112;
WHEN 'q' => result := 113;
WHEN 'r' => result := 114;
WHEN 's' => result := 115;
WHEN 't' => result := 116;
WHEN 'u' => result := 117;
WHEN 'v' => result := 118;
WHEN 'w' => result := 119;
WHEN 'x' => result := 120;
WHEN 'y' => result := 121;
WHEN 'z' => result := 122;
WHEN '{' => result := 123;
WHEN '|' => result := 124;
WHEN '}' => result := 125;
WHEN '~' => result := 126;
WHEN OTHERS => result :=32;
END CASE;
RETURN result;
END FUNCTION;
BEGIN
--==============================================
------------------------------------------------
-- KeyFlag Filter
PROCESS( RESET, GCLK, CLK1, KeyValid, KeyCode, CountFilter, SW, KeyFlag, KeyFlagRefresh )
VARIABLE Count : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
-------------------------------------
-- Filter
IF( RESET='0' OR KeyValid='0' ) THEN
KeyFlag <= '0';
CountFilter <= (OTHERS=>'0');
ELSIF( KeyValid='1' ) THEN
IF( GCLK'EVENT AND GCLK='1' ) THEN
IF( CountFilter<"1100100" ) THEN CountFilter <= CountFilter + 1;
ELSE KeyFlag <= '1';
END IF;
END IF;
END IF;
-------------------------------------
-- Delay
IF( RESET='0' OR KeyFlag='1' ) THEN Count := (OTHERS=>'0');
ELSIF( GCLK'EVENT AND GCLK='1' ) THEN
IF( Count<"1111" ) THEN Count := Count + 1;
END IF;
IF( Count="1110" AND SW(4 DOWNTO 3)="00" ) THEN KeyFlagRefresh <= '1';
ELSE KeyFlagRefresh <= '0';
END IF;
END IF;
IF( SW(4 DOWNTO 3)="00" ) THEN KeyFlagValid2 <= KeyFlag;
ELSE KeyFlagValid2 <= '0';
END IF;
-- SPI
IF( SW(4)='1' ) THEN KeyFlagValid1 <= KeyFlag;
ELSE KeyFlagValid1 <= '0';
END IF;
-- I2C
IF( SW(3)='1' ) THEN KeyFlagValidIIC1 <= KeyFlag;
ELSE KeyFlagValidIIC1 <= '0';
END IF;
END PROCESS;
------------------------------------------------
-- The Direct Interface of SPI Controller
PROCESS( CS, RW, STRB, DataOUT, SPI_Data )
BEGIN
SPI_CS <= CS;
SPI_RW <= RW;
SPI_STRB <= STRB;
IF( CS='0' ) THEN
IF( RW='0' ) THEN
SPI_Data <= DataOUT;
ELSE
DataIN <= SPI_Data;
END IF;
ELSE
SPI_Data <= (OTHERS=>'Z');
END IF;
END PROCESS;
------------------------------------------------
-- Enter the datum : SPIDataW
PROCESS( RESET, KeyFlagValid2, CountSTEP )
BEGIN
IF( RESET='0' ) THEN
CountSTEP <= 0;
ELSIF( KeyFlagValid2'EVENT AND KeyFlagValid2='1' ) THEN
IF( CountSTEP<5 ) THEN CountSTEP <= CountSTEP + 1;
END IF;
END IF;
END PROCESS;
------------------------------------------------
-- Enter the datum : SPIDataW
PROCESS( RESET, KeyCode, KeyFlagRefresh, CountSTEP )
BEGIN
IF( RESET='0' ) THEN
SPIDataW <= B"1010_0000_1010_0011"; -- A0A3
ELSIF( KeyFlagRefresh'EVENT AND KeyFlagRefresh='1' ) THEN
IF ( CountSTEP=1 ) THEN SPIDataW(15 DOWNTO 12) <= KeyCode;
ELSIF( CountSTEP=2 ) THEN SPIDataW(11 DOWNTO 8 ) <= KeyCode;
ELSIF( CountSTEP=3 ) THEN SPIDataW(7 DOWNTO 4 ) <= KeyCode;
ELSIF( CountSTEP=4 ) THEN SPIDataW(3 DOWNTO 0 ) <= KeyCode;
END IF;
END IF;
END PROCESS;
------------------------------------------------
-- SPI Memory Interface
PROCESS( RESET, GCLK, KeyFlagValid1, KeyCode, STRB, DataIN, SPIDataW )
VARIABLE Count : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
IF( RESET='0' ) THEN
DataOUT <= (OTHERS=>'0');
CS <= '1'; RW <= '1';
Count := (OTHERS=>'1');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -