?? transmit.vhd
字號:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TRANSMIT IS
PORT(XBUF: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
BCLK: IN STD_LOGIC;
RESETL:IN STD_LOGIC;
XMIT_BEGIN: IN STD_LOGIC;
TXD: OUT STD_LOGIC;
XMIT_DONE: OUT STD_LOGIC
);
END TRANSMIT;
ARCHITECTURE BEHAV OF TRANSMIT IS
TYPE X_STATE IS (X_IDLE,X_START,X_WAIT,X_SHIFT,X_STOP,X,X_0,X_1,X_2,X_3,X_4,X_5,X_6,X_7,X_8,X_9);
SIGNAL PRESENT_STATE : X_STATE:=X_IDLE;
BEGIN
PROCESS(BCLK,RESETL)
VARIABLE TEMP: STD_LOGIC_VECTOR(3 DOWNTO 0) :="0000";
VARIABLE LEN : INTEGER RANGE 0 TO 8:=0;
BEGIN
IF RESETL='1' THEN PRESENT_STATE <=X_IDLE;
ELSIF BCLK'EVENT AND BCLK='1'
THEN
CASE PRESENT_STATE IS
WHEN X_IDLE => IF XMIT_BEGIN='1' THEN PRESENT_STATE <=X_START; TEMP:="0000";LEN:=0;XMIT_DONE<='0';
ELSE PRESENT_STATE <= X_IDLE;
END IF;
WHEN X_START =>
IF TEMP="1111" THEN PRESENT_STATE <=X_WAIT;TEMP:="0000"; --起始位發送
ELSE TEMP:=TEMP+1;TXD<='0';PRESENT_STATE <=X_START;
END IF;
WHEN X_WAIT =>
IF TEMP="1111" AND LEN = 7 THEN PRESENT_STATE <=X_0; TEMP:="0000";TXD<='1';
ELSIF TEMP="1111" AND LEN/=7 THEN LEN:=LEN+1; TEMP:="0000";
PRESENT_STATE <=X_WAIT;
ELSE TEMP:=TEMP+1; TXD<=XBUF(LEN);PRESENT_STATE <=X_WAIT;
END IF;
WHEN X_0 =>
IF TEMP="1111" THEN PRESENT_STATE<=X_1;TEMP:="0000"; --停止位發送
ELSE TEMP:=TEMP+1; TXD<='1';PRESENT_STATE <=X_0;
END IF;
WHEN X_1 =>
IF TEMP="1111" THEN PRESENT_STATE<=X_2;TEMP:="0000"; --停止位發送
ELSE TEMP:=TEMP+1; TXD<='1';PRESENT_STATE <=X_1;
END IF;
WHEN X_2 =>
IF TEMP="1111" THEN PRESENT_STATE<=X_3;TEMP:="0000"; --停止位發送
ELSE TEMP:=TEMP+1; TXD<='1';PRESENT_STATE <=X_2;
END IF;
WHEN X_3 =>
IF TEMP="1111" THEN PRESENT_STATE<=X_4;TEMP:="0000"; --停止位發送
ELSE TEMP:=TEMP+1; TXD<='1';PRESENT_STATE <=X_3;
END IF;
WHEN X_4 =>
IF TEMP="1111" THEN PRESENT_STATE<=X_IDLE;TEMP:="0000";XMIT_DONE<='1'; --停止位發送
ELSE TEMP:=TEMP+1; TXD<='1';PRESENT_STATE <=X_4;
END IF;
-- WHEN X_5 =>
-- IF TEMP="1111" THEN PRESENT_STATE<=X_6;TEMP:="0000"; --停止位發送
-- ELSE TEMP:=TEMP+1; TXD<='1';PRESENT_STATE <=X_5;
-- END IF;
-- WHEN X_6 =>
-- IF TEMP="1111" THEN PRESENT_STATE<=X_7;TEMP:="0000"; --停止位發送
-- ELSE TEMP:=TEMP+1; TXD<='1';PRESENT_STATE <=X_6;
-- END IF;
-- WHEN X_7 =>
-- IF TEMP="1111" THEN PRESENT_STATE<=X_8;TEMP:="0000"; --停止位發送
-- ELSE TEMP:=TEMP+1; TXD<='1';PRESENT_STATE <=X_7;
-- END IF;
-- WHEN X_8 =>
-- IF TEMP="1111" THEN PRESENT_STATE<=X_9;TEMP:="0000"; --停止位發送
-- ELSE TEMP:=TEMP+1; TXD<='1';PRESENT_STATE <=X_8;
-- END IF;
-- WHEN X_9 =>
-- IF TEMP="1111" THEN PRESENT_STATE<=X_IDLE;XMIT_DONE<='1';TEMP:="0000"; --停止位發送
-- ELSE TEMP:=TEMP+1; TXD<='1';PRESENT_STATE <=X_9;
-- END IF;
WHEN OTHERS =>NULL;
END CASE;
END IF;
END PROCESS;
END BEHAV;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -