📄 tx_async.vhd
字号:
-- Copyright 2007 Actel Corporation. All rights reserved.
-- ANY USE OR REDISTRIBUTION IN PART OR IN WHOLE MUST BE HANDLED IN
-- ACCORDANCE WITH THE ACTEL LICENSE AGREEMENT AND MUST BE APPROVED
-- IN ADVANCE IN WRITING.
-- Rev: 3.0 21FEB07 HJ : v3.0 CoreConsole Release
library Ieee;
use Ieee.stD_lOGIC_1164.all;
use ieee.sTD_Logic_ARITH.all;
use IEEe.Std_lOGIC_unsigNED.all;
entity tX_Async is
generic (TX_fifo: INteger := 0); port (ClK: in Std_lOGIC;
xmIT_puLSE: in std_LOgic;
RESet_n: in Std_lOGIC;
rst_Tx_emptY: in std_LOGic;
TX_hold_REG: in std_loGIC_vectOR(7 downto 0);
tx_dOut_reg: in STD_logic_vectOR(7 downto 0);
Fifo_EMPTY: in stD_logIC;
fIFO_full: in std_loGIC;
Bit8: in stD_loGic;
pARItY_en: in stD_LOgic;
Odd_n_eVEN: in std_logic;
txrdy: out Std_loGIC;
tx: out Std_loGIC;
fiFO_read_tx: out stD_LOgic);
end entity TX_async;
architecture TRanslateD of tx_Async is
constant CUARTLOIL: Integer := 0;
constant CUARTioIL: INTeger := 1;
constant CUARTolil: inTEGEr := 2;
constant CUARTlliL: intEGER := 3;
constant CUARTiliL: iNtEGER := 4;
constant CUARToIIL: iNTEGEr := 5;
constant CUARTliil: INTEger := 6;
signal CUARTiiIl: iNteger;
signal CUARTO0il: stD_LOgic;
signal CUARTl0IL: Std_loGIC_Vector(7 downto 0);
signal CUARTi0IL: std_loGIC_vectoR(3 downto 0);
signal CUARTO1il: STD_logIC;
signal CUARTL1il: std_LOGic;
signal CUARTI1il: stD_Logic;
signal CUARToo0l: std_lOGIc;
signal fifo_wRITE: STd_logic;
signal CUARTlO0L: Std_logiC;
signal CUARTio0l: Std_logiC;
signal CUARTOL0L: std_logIC;
function TO_Integer(Val: Std_logiC_VECTor)
return inTEGER is
constant CUARTo01: STD_logic_vECTOR(Val'hIGH-VAL'loW downto 0) := Val;
variable CUARTL01: INteger := 0;
begin
for CUARTI01 in CUARTo01'range
loop
if (CUARTo01(CUARTI01) = '1') then
CUARTl01 := CUARTl01+(2**CUARTi01);
end if;
end loop;
return (CUARTl01);
end to_INTEger;
begin
TXRdy <= CUARTLo0l;
tx <= CUARTiO0L;
FIFO_read_tX <= CUARTOL0L;
CUARTLL0l:
process (Clk,RESET_n)
begin
if (not RESET_N = '1') then
CUARTO0il <= '1';
elsif (CLK'EVEnt and Clk = '1') then
if (tX_FIFO = 2#0#) then
if (xMIT_PUlse = '1') then
if (CUARTIIIL = CUARTioIL) then
CUARTo0il <= '1';
end if;
end if;
if (rsT_TX_empty = '1') then
CUARTO0il <= '0';
end if;
else
CUARTO0IL <= not FIFo_full;
end if;
end if;
end process CUARTLL0l;
CUARTil0l:
process (cLK,Reset_n)
begin
if (not resET_N = '1') then
CUARTiiil <= CUARTloil;
CUARTl0iL <= "00000000";
CUARTl1il <= '1';
elsif (Clk'EVent and CLk = '1') then
if (xmiT_PUlse = '1') then
CUARTl1iL <= '1';
case CUARTiiil is
when CUARTloil =>
if (tx_fiFO = 2#0#) then
if (not CUARTo0il = '1') then
CUARTIIIL <= CUARTIOIL;
else
CUARTiiil <= CUARTloil;
end if;
else
if (fiFO_EMpty = '0') then
CUARTl1iL <= '0';
CUARTIiil <= CUARTliil;
else
CUARTiIIL <= CUARTLOIL;
CUARTL1il <= '1';
end if;
end if;
when CUARTioil =>
if (tx_FIFO = 2#0#) then
CUARTl0il <= TX_Hold_reg;
else
CUARTL0IL <= TX_dout_rEG;
end if;
CUARTIIIl <= CUARTOLil;
when CUARTOLIl =>
CUARTIIIL <= CUARTLLIL;
when CUARTllil =>
if (bit8 = '1') then
if (CUARTi0IL = "0111") then
if (parity_EN = '1') then
CUARTiiiL <= CUARTilil;
else
CUARTIiil <= CUARToiIL;
end if;
else
CUARTIIIL <= CUARTllil;
end if;
else
if (CUARTI0Il = "0110") then
if (Parity_eN = '1') then
CUARTiiil <= CUARTIlil;
else
CUARTiiIL <= CUARToiiL;
end if;
else
CUARTiiil <= CUARTllil;
end if;
end if;
when CUARTilil =>
CUARTiiil <= CUARToiIL;
when CUARToiil =>
CUARTiiil <= CUARTloil;
when CUARTLIIL =>
CUARTiiil <= CUARTIOIL;
when others =>
CUARTiiil <= CUARTloil;
end case;
end if;
end if;
end process CUARTil0l;
CUARTOI0L:
process (CLk,reSET_N)
begin
if (not Reset_n = '1') then
CUARTol0l <= '1';
CUARTi1il <= '1';
elsif (cLK'event and clk = '1') then
CUARToL0L <= '1';
CUARTi1il <= CUARTl1il;
if (CUARToO0L = '0') then
CUARToL0L <= '0';
end if;
end if;
end process CUARToi0l;
CUARToo0L <= not CUARTi1IL or CUARTl1iL;
CUARTli0l:
process (cLK,Reset_n)
begin
if (not reSET_n = '1') then
CUARTi0IL <= "0000";
elsif (clk'evenT and Clk = '1') then
if (XMIt_pulse = '1') then
if (CUARTIIIL /= CUARTllil) then
CUARTI0il <= "0000";
else
CUARTI0Il <= CUARTi0il+"0001";
end if;
end if;
end if;
end process CUARTlI0L;
CUARTiI0L:
process (clk,RESET_n)
begin
if (not Reset_N = '1') then
CUARTio0l <= '1';
elsif (CLK'eVENT and Clk = '1') then
if (XMIt_pulse = '1') then
case CUARTiiil is
when CUARTlOIL =>
CUARTio0l <= '1';
when CUARTIOil =>
CUARTIO0L <= '1';
when CUARTOLIL =>
CUARTio0L <= '0';
when CUARTlLIL =>
CUARTio0l <= CUARTl0il(to_INTEGEr(CUARTi0IL));
when CUARTiLIL =>
CUARTio0l <= Odd_n_evEN xor CUARTo1IL;
when CUARToiiL =>
CUARTio0l <= '1';
when others =>
CUARTiO0L <= '1';
end case;
end if;
end if;
end process CUARTii0L;
CUARTO00L:
process (clk,Reset_n)
begin
if (not reset_n = '1') then
CUARTo1il <= '0';
elsif (clk'evenT and clk = '1') then
if ((Xmit_pulsE and PARITy_en) = '1') then
if (CUARTIIIL = CUARTLLIL) then
CUARTO1IL <= CUARTO1il xor CUARTl0IL(to_intEGER(CUARTi0il));
else
CUARTo1il <= CUARTO1IL;
end if;
end if;
if (CUARTiiil = CUARToIIL) then
CUARTo1il <= '0';
end if;
end if;
end process CUARTo00L;
CUARTlO0L <= CUARTO0il;
end architecture traNSLAted;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -