📄 operation.vhd
字号:
ELSIF( KeyFlagValid1='1' ) THEN
Count := (OTHERS=>'0');
ELSE
IF( GCLK'EVENT AND GCLK='1' ) THEN
IF( Count<"11" ) THEN
CS <= '0';
Count := Count + 1;
IF( KeyCode<"0111" AND KeyCode/="0000" ) THEN
RW <= '0';
END IF;
--------------------------
-- Send Command To SPI Controller
IF ( KeyCode="0001" ) THEN -- KeyCode = 1 : ERASE
SPI_Address <= B"11_000000";
DataOUT <= (OTHERS=>'0');
ELSIF( KeyCode="0010" ) THEN -- KeyCode = 2 : ERAL
SPI_Address <= B"0010_0000";
DataOUT <= (OTHERS=>'0');
ELSIF( KeyCode="0011" ) THEN -- KeyCode = 3 : EWDS
SPI_Address <= B"0000_0000";
DataOUT <= (OTHERS=>'0');
ELSIF( KeyCode="0100" ) THEN -- KeyCode = 4 : EWEN
SPI_Address <= B"0011_0000";
DataOUT <= (OTHERS=>'0');
ELSIF( KeyCode="0101" ) THEN -- KeyCode = 5 : READ
SPI_Address <= B"10_000000";
DataOUT <= (OTHERS=>'0');
ELSIF( KeyCode="0110" ) THEN -- KeyCode = 6 : WRITE
SPI_Address <= B"01_000000";
DataOUT <= SPIDataW;
-------------------------
-- Receive the Data from I2C Controller
ELSE -- KeyCode = 0/7/8/9/A/B/C/D/E/F : Read
IF( STRB='1' ) THEN SPIDataR <= DataIN;
END IF;
END IF;
ELSE
CS <= '1'; RW <= '1';
DataOUT <= (OTHERS=>'0');
END IF;
END IF;
END IF;
IF( Count="10" ) THEN STRB <= '1';
ELSE STRB <= '0';
END IF;
END PROCESS;
--==============================================
------------------------------------------------
-- The Direct Interface of I2C Controller
PROCESS( CSI, RWI, STRBI, DataOUTI, I2C_Data )
BEGIN
I2C_CS <= CSI;
I2C_RW <= RWI;
I2C_STRB <= STRBI;
IF( CSI='0' ) THEN
IF( RWI='0' ) THEN
I2C_Data <= DataOUTI;
ELSE
DataINI <= I2C_Data;
END IF;
ELSE
I2C_Data <= (OTHERS=>'Z');
END IF;
END PROCESS;
------------------------------------------------
-- I2C
PROCESS( RESET, GCLK, KeyFlagValidIIC1, KeyCode, DataINI, I2CDataW, SPIDataW, RWI )
VARIABLE Count : STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
I2CDataW <= SPIDataW(7 DOWNTO 0);
IF( RESET='0' ) THEN
DataOUTI <= (OTHERS=>'0');
CSI <= '1'; RWI <= '1';
Count := (OTHERS=>'1');
ELSIF( KeyFlagValidIIC1='1' ) THEN
Count := (OTHERS=>'0');
ELSE
IF( GCLK'EVENT AND GCLK='1' ) THEN
IF( Count<"111" ) THEN
CSI <= '0';
Count := Count + 1;
IF( KeyCode="0001" OR KeyCode="0101" OR KeyCode="0110" ) THEN
RWI <= '0';
END IF;
--------------------------
-- Send Command To I2C Controller
IF ( KeyCode="0001" ) THEN -- KeyCode = 1 : ERASE
IF ( Count="010" ) THEN I2C_Address <= "00"; DataOUTI <= B"1010_0000";
ELSIF( Count="100" ) THEN I2C_Address <= "01"; DataOUTI <= B"0000_0001";
ELSIF( Count="110" ) THEN I2C_Address <= "10"; DataOUTI <= B"1111_1111"; --
END IF;
ELSIF( KeyCode="0101" ) THEN -- KeyCode = 5 : READ
IF ( Count="010" ) THEN I2C_Address <= "00"; DataOUTI <= B"1010_0001";
ELSIF( Count="100" ) THEN I2C_Address <= "01"; DataOUTI <= B"0000_0001";
ELSIF( Count="110" ) THEN I2C_Address <= "10"; DataOUTI <= B"1111_1111"; -- FF
END IF;
ELSIF( KeyCode="0110" ) THEN -- KeyCode = 6 : WRITE
IF ( Count="010" ) THEN I2C_Address <= "00"; DataOUTI <= B"1010_0000";
ELSIF( Count="100" ) THEN I2C_Address <= "01"; DataOUTI <= B"0000_0001";
ELSIF( Count="110" ) THEN I2C_Address <= "10"; DataOUTI <= I2CDataW; --
END IF;
-------------------------
-- Receive the Data from I2C Controller
ELSE -- KeyCode = 0/7/8/9/A/B/C/D/E/F : Read
IF( STRBI='1' ) THEN I2CDataR <= DataINI;
END IF;
END IF;
ELSE
CSI <= '1'; RWI <= '1';
DataOUTI <= (OTHERS=>'0');
END IF;
END IF;
END IF;
IF( RWI='0' ) THEN
IF( Count="010" OR Count="100" OR Count="110" ) THEN STRBI <= '1';
ELSE STRBI <= '0';
END IF;
ELSE
IF( Count="010" ) THEN STRBI <= '1';
ELSE STRBI <= '0';
END IF;
END IF;
END PROCESS;
------------------------------------------------
-- irDA
PROCESS( RESET )
BEGIN
END PROCESS;
-------------------------------------------------
-------------------------------------------------
--===============================================
-------------------------------------------------
-- LCD Display
PROCESS( RESET, CharAdd, LCD_ARRAY )
BEGIN
IF( CONV_INTEGER(CharAdd)<32 ) THEN LCDValue <= LCD_ARRAY( CONV_INTEGER(CharAdd) );
ELSE LCDValue <= "00000000";
END IF;
END PROCESS;
-------------------------------------------------
-- LCD Refresh
PROCESS( RESET, CLK1, CLK2P, Fresh, irDAValid, PS2Valid, UARTValid, KeyFlag, KeyFlagRefresh, CountSTEP, SW )
VARIABLE Count : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
IF( RESET='0' ) THEN CLK2P <= '0';
ELSIF( CLK1'EVENT AND CLK1='0' ) THEN CLK2P <= NOT CLK2P;
END IF;
-----------------------------------------------
Fresh <= irDAValid OR PS2Valid OR UARTValid OR KeyFlag OR KeyFlagRefresh;
IF( RESET='0' OR Fresh='1' ) THEN Count := "00";
ELSE
IF( CLK2P'EVENT AND CLK2P='1' ) THEN
IF( Count<"11" ) THEN Count := Count + 1;
END IF;
END IF;
END IF;
IF( Count="10" ) THEN LCDFresh <= '1';
ELSE LCDFresh <= '0';
END IF;
IF( SW(0)='1' ) THEN Speak <= Fresh;
ELSE Speak <= '0';
END IF;
END PROCESS;
-------------------------------------------------
-- The content of LCD1602
PROCESS( RESET, Fresh, irDACodeL, irDACodeM, irDACodeU, PS2Code, UARTCode, TempCode, KeyCode, CountSTEP, SPIDataW )
BEGIN
IF( RESET='0' ) THEN
-- LCD_ARRAY( 0 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('w') ,8 );
-- LCD_ARRAY( 1 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('w') ,8 );
-- LCD_ARRAY( 2 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('w') ,8 );
-- LCD_ARRAY( 3 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('.') ,8 );
-- LCD_ARRAY( 4 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('I') ,8 );
-- LCD_ARRAY( 5 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('C') ,8 );
-- LCD_ARRAY( 6 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('D') ,8 );
-- LCD_ARRAY( 7 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('E') ,8 );
-- LCD_ARRAY( 8 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('V') ,8 );
-- LCD_ARRAY( 9 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('.') ,8 );
-- LCD_ARRAY( 10 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('c') ,8 );
-- LCD_ARRAY( 11 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('o') ,8 );
-- LCD_ARRAY( 12 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('m') ,8 );
-- LCD_ARRAY( 13 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('.') ,8 );
-- LCD_ARRAY( 14 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('c') ,8 );
-- LCD_ARRAY( 15 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('n') ,8 );
LCD_ARRAY( 6 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 7 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 8 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 9 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 10 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 11 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 12 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 13 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 14 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 15 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 16 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('D') ,8 );
LCD_ARRAY( 17 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('a') ,8 );
LCD_ARRAY( 18 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('t') ,8 );
LCD_ARRAY( 19 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('u') ,8 );
LCD_ARRAY( 20 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('m') ,8 );
LCD_ARRAY( 21 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(':') ,8 );
LCD_ARRAY( 22 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('0') ,8 );
LCD_ARRAY( 23 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('0') ,8 );
LCD_ARRAY( 24 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('0') ,8 );
LCD_ARRAY( 25 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('0') ,8 );
LCD_ARRAY( 26 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 27 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 28 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('F') ,8 );
LCD_ARRAY( 29 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('P') ,8 );
LCD_ARRAY( 30 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('G') ,8 );
LCD_ARRAY( 31 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer('A') ,8 );
ELSIF( Fresh='1' ) THEN
-- To ACSII Code
----------------------------------------------
-- irDA
IF( irDACodeU(7 DOWNTO 4)<"1010" ) THEN LCD_ARRAY( 0 ) <= ("0000" & irDACodeU(7 DOWNTO 4)) + "00110000";
ELSE LCD_ARRAY( 0 ) <= ("0000" & irDACodeU(7 DOWNTO 4)) + "00110111";
END IF;
IF( irDACodeU(3 DOWNTO 0)<"1010" ) THEN LCD_ARRAY( 1 ) <= ("0000" & irDACodeU(3 DOWNTO 0)) + "00110000";
ELSE LCD_ARRAY( 1 ) <= ("0000" & irDACodeU(3 DOWNTO 0)) + "00110111";
END IF;
IF( irDACodeM(7 DOWNTO 4)<"1010" ) THEN LCD_ARRAY( 2 ) <= ("0000" & irDACodeM(7 DOWNTO 4)) + "00110000";
ELSE LCD_ARRAY( 2 ) <= ("0000" & irDACodeM(7 DOWNTO 4)) + "00110111";
END IF;
IF( irDACodeM(3 DOWNTO 0)<"1010" ) THEN LCD_ARRAY( 3 ) <= ("0000" & irDACodeM(3 DOWNTO 0)) + "00110000";
ELSE LCD_ARRAY( 3 ) <= ("0000" & irDACodeM(3 DOWNTO 0)) + "00110111";
END IF;
IF( irDACodeL(7 DOWNTO 4)<"1010" ) THEN LCD_ARRAY( 4 ) <= ("0000" & irDACodeL(7 DOWNTO 4)) + "00110000";
ELSE LCD_ARRAY( 4 ) <= ("0000" & irDACodeL(7 DOWNTO 4)) + "00110111";
END IF;
IF( irDACodeL(3 DOWNTO 0)<"1010" ) THEN LCD_ARRAY( 5 ) <= ("0000" & irDACodeL(3 DOWNTO 0)) + "00110000";
ELSE LCD_ARRAY( 5 ) <= ("0000" & irDACodeL(3 DOWNTO 0)) + "00110111";
END IF;
----------------------------------------------
-- PS2
IF( PS2Code(7 DOWNTO 4)<"1010" ) THEN LCD_ARRAY( 7 ) <= ("0000" & PS2Code(7 DOWNTO 4)) + "00110000";
ELSE LCD_ARRAY( 7 ) <= ("0000" & PS2Code(7 DOWNTO 4)) + "00110111";
END IF;
IF( PS2Code(3 DOWNTO 0)<"1010" ) THEN LCD_ARRAY( 8 ) <= ("0000" & PS2Code(3 DOWNTO 0)) + "00110000";
ELSE LCD_ARRAY( 8 ) <= ("0000" & PS2Code(3 DOWNTO 0)) + "00110111";
END IF;
----------------------------------------------
-- UART
IF( UARTCode(7 DOWNTO 4)<"1010" ) THEN LCD_ARRAY( 10) <= ("0000" & UARTCode(7 DOWNTO 4)) + "00110000";
ELSE LCD_ARRAY( 10) <= ("0000" & UARTCode(7 DOWNTO 4)) + "00110111";
END IF;
IF( UARTCode(3 DOWNTO 0)<"1010" ) THEN LCD_ARRAY( 11) <= ("0000" & UARTCode(3 DOWNTO 0)) + "00110000";
ELSE LCD_ARRAY( 11) <= ("0000" & UARTCode(3 DOWNTO 0)) + "00110111";
END IF;
----------------------------------------------
-- KEY
IF( KeyCode<"1010" ) THEN LCD_ARRAY( 13) <= ("0000" & KeyCode) + "00110000";
ELSE LCD_ARRAY( 13) <= ("0000" & KeyCode) + "00110111";
END IF;
----------------------------------------------
-- SPIDataW
IF( CountSTEP/=0 ) THEN
---------------
IF( SPIDataW(15 DOWNTO 12)<"1010" ) THEN LCD_ARRAY( 22 ) <= ("0000" & SPIDataW(15 DOWNTO 12)) + "00110000";
ELSE LCD_ARRAY( 22 ) <= ("0000" & SPIDataW(15 DOWNTO 12)) + "00110111";
END IF;
---------------
IF( CountSTEP>1 ) THEN
IF( SPIDataW(11 DOWNTO 8 )<"1010" ) THEN LCD_ARRAY( 23 ) <= ("0000" & SPIDataW(11 DOWNTO 8 )) + "00110000";
ELSE LCD_ARRAY( 23 ) <= ("0000" & SPIDataW(11 DOWNTO 8 )) + "00110111";
END IF;
ELSE
LCD_ARRAY( 23 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
END IF;
---------------
IF( CountSTEP>2 ) THEN
IF( SPIDataW(7 DOWNTO 4 )<"1010" ) THEN LCD_ARRAY( 24 ) <= ("0000" & SPIDataW(7 DOWNTO 4 )) + "00110000";
ELSE LCD_ARRAY( 24 ) <= ("0000" & SPIDataW(7 DOWNTO 4 )) + "00110111";
END IF;
ELSE
LCD_ARRAY( 24 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
END IF;
---------------
IF( CountSTEP>3 ) THEN
IF( SPIDataW(3 DOWNTO 0 )<"1010" ) THEN LCD_ARRAY( 25 ) <= ("0000" & SPIDataW(3 DOWNTO 0 )) + "00110000";
ELSE LCD_ARRAY( 25 ) <= ("0000" & SPIDataW(3 DOWNTO 0 )) + "00110111";
END IF;
ELSE
LCD_ARRAY( 25 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
END IF;
ELSE
LCD_ARRAY( 22 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 23 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 24 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
LCD_ARRAY( 25 ) <= CONV_STD_LOGIC_VECTOR( Char_To_Integer(' ') ,8 );
END IF;
END IF;
END PROCESS;
--===============================================
-------------------------------------------------
-- LED MUX
PROCESS( CLK1, Refresh, LED_ARRAY )
BEGIN
IF( CLK1'EVENT AND CLK1 = '0' )THEN
Refresh <= Refresh + 1;
END IF;
LEDValue <= LED_ARRAY( CONV_INTEGER(Refresh) );
DigitValue <= Refresh;
END PROCESS;
-------------------------------------------------
LED_ARRAY( 0 ) <= TempCode( 7 DOWNTO 4 );
LED_ARRAY( 1 ) <= TempCode( 3 DOWNTO 0 );
LED_ARRAY( 2 ) <= I2CDataR( 7 DOWNTO 4 );
LED_ARRAY( 3 ) <= I2CDataR( 3 DOWNTO 0 );
LED_ARRAY( 4 ) <= SPIDataR( 15 DOWNTO 12 );
LED_ARRAY( 5 ) <= SPIDataR( 11 DOWNTO 8 );
LED_ARRAY( 6 ) <= SPIDataR( 7 DOWNTO 4 );
LED_ARRAY( 7 ) <= SPIDataR( 3 DOWNTO 0 );
-------------------------------------------------
-------------------------------------------------
MusicEnable <= SW(5);
END Behavioral;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -