📄 gh_uart_16550.vhd
字号:
iMSR(6) <= (not RIn) when (iLOOP = '0') else
MCR(2);
iMSR(7) <= (not DCDn) when (iLOOP = '0') else
MCR(3);
RD_MSR <= '0' when ((CS = '0') or (WR = '1')) else
'0' when (ADD /= o"6") else
'1';
ITR0 <= '0' when (IER(3) = '0') else
'1' when (MSR(3 downto 0) > x"0") else
'0';
U11 : gh_edge_det
PORT MAP (
clk => clk,
rst => rst,
d => RD_MSR,
sfe => MSR_CLR);
u12 : gh_register_ce
generic map (4)
port map(
clk => clk,
rst => rst,
ce => '1',
D => iMSR,
Q => MSR(7 downto 4)
);
---------------------------------------------------
-------- LSR --------------------------------------
---------------------------------------------------
LSR(0) <= (not RF_empty);
U13 : gh_jkff
PORT MAP (
clk => clk,
rst => rst,
j => OVR_ER,
k => LSR_CLR,
Q => LSR(1));
OVR_ER <= '1' when ((RF_full = '1') and (RF_WR = '1')) else
'0';
U14 : gh_jkff
PORT MAP (
clk => clk,
rst => rst,
j => PARITY_ER,
k => LSR_CLR,
Q => LSR(2));
U15 : gh_jkff
PORT MAP (
clk => clk,
rst => rst,
j => FRAME_ER,
k => LSR_CLR,
Q => LSR(3));
U16 : gh_jkff
PORT MAP (
clk => clk,
rst => rst,
j => Break_ITR,
k => LSR_CLR,
Q => LSR(4));
LSR(5) <= TF_EMPTY;
LSR(6) <= TF_EMPTY and TSR_EMPTY;
U17 : gh_jkff
PORT MAP (
clk => clk,
rst => rst,
j => RF_ER,
k => LSR_CLR,
Q => LSR(7));
RF_ER <= '1' when (RF_DI(10 downto 8) > "000") else
'0';
RD_LSR <= '0' when ((CS = '0') or (WR = '1')) else
'0' when (ADD /= o"5") else
'1';
U18 : gh_edge_det
PORT MAP (
clk => clk,
rst => rst,
d => RD_LSR,
sfe => LSR_CLR);
----------------------------------------------
------ registers -------
----------------------------------------------
CSn <= (not CS);
u19 : gh_DECODE_3to8
port map(
A => ADD,
G1 => WR,
G2n => CSn,
G3n => '0',
Y => WR_B
);
WR_F <= WR_B(0) and (not LCR(7));
WR_IER <= WR_B(1) and (not LCR(7));
WR_D <= LCR(7) and (WR_B(0) or WR_B(1));
WR_DML <= (WR_B(1) and LCR(7)) & (WR_B(0) and LCR(7));
u20 : gh_register_ce
generic map (4)
port map(
clk => clk,
rst => rst,
ce => WR_IER,
D => D(3 downto 0),
Q => IER
);
u21 : gh_register_ce
generic map (8)
port map(
clk => clk,
rst => rst,
ce => WR_B(2),
D => D,
Q => FCR
);
U22 : gh_jkff
PORT MAP (
clk => clk,
rst => rst,
j => RF_CLRS,
k => RF_EMPTY,
Q => RF_CLR);
RF_CLRS <= D(1) AND WR_B(2);
U23 : gh_jkff
PORT MAP (
clk => clk,
rst => rst,
j => TF_CLRS,
k => TF_EMPTY,
Q => TF_CLR);
TF_CLRS <= D(2) AND WR_B(2);
u24 : gh_register_ce
generic map (8)
port map(
clk => clk,
rst => rst,
ce => WR_B(3),
D => D,
Q => LCR
);
num_bits <= 5 when ((LCR(0) = '0') and (LCR(1) = '0')) else
6 when ((LCR(0) = '1') and (LCR(1) = '0')) else -- 07/12/07
7 when ((LCR(0) = '0') and (LCR(1) = '1')) else -- 07/12/07
8;
stopB <= LCR(2);
Parity_EN <= LCR(3);
Parity_OD <= LCR(3) and (not LCR(4)) and (not LCR(5));
Parity_EV <= LCR(3) and LCR(4) and (not LCR(5));
-- Parity_sticky <= LCR(3) and LCR(5);
Break_CB <= LCR(6);
u25 : gh_register_ce
generic map (5)
port map(
clk => clk,
rst => rst,
ce => WR_B(4),
D => D(4 downto 0),
Q => MCR
);
DTRn <= (not MCR(0)) or iLOOP;
RTSn <= (not MCR(1)) or iLOOP;
OUT1n <= (not MCR(2)) or iLOOP;
OUT2n <= (not MCR(3)) or iLOOP;
iLOOP <= MCR(4);
u26 : gh_register_ce
generic map (8)
port map(
clk => clk,
rst => rst,
ce => WR_B(7),
D => D,
Q => SCR
);
----------------------------------------------------------
D16 <= D & D;
u27 : gh_baud_rate_gen
port map(
clk => clk,
BR_clk => BR_clk,
rst => rst,
WR => WR_D,
BE => WR_DML,
D => D16,
RD => RDD,
rCE => BRC16x,
rCLK => B_clk
);
--------------------------------------------------
---- trans FIFO 12/23/06 -----------------------
--------------------------------------------------
U28 : gh_fifo_async16_sr
Generic Map(data_width => 8)
PORT MAP (
clk_WR => clk,
clk_RD => BR_clk,
rst => rst,
srst => TF_CLR,
WR => WR_F,
RD => TF_RD,
D => D,
Q => TF_DO,
empty => TF_empty,
full => TF_full);
----------------------------------------------------------------
----------- added 03/18/06 -------------------------------------
U28a : gh_edge_det
PORT MAP (
clk => clk,
rst => rst,
d => TF_empty,
sre => isITR1);
sITR1 <= isITR1 and IER(1);
RD_IIR <= '0' when (ADD /= o"2") else
'0' when (WR = '1') else
'0' when (CS = '0') else
'0' when (IIR(3 downto 1) /= "001") else -- walter hogan 12/12/2006
'1';
U28b : gh_edge_det
PORT MAP (
clk => clk,
rst => rst,
d => RD_IIR,
sfe => cITR1a);
cITR1 <= cITR1a or (not TF_empty);
U28c : gh_jkff
PORT MAP (
clk => clk,
rst => rst,
j => sITR1,
k => cITR1,
Q => ITR1);
----------- added 03/18/06 ------------------------------------------
---------------------------------------------------------------------
U29 : gh_UART_Tx_8bit
PORT MAP (
clk => BR_clk,
rst => rst,
xBRC => BRC16x,
D_RYn => TF_empty,
D => TF_DO,
num_bits => num_bits,
Break_CB => Break_CB,
StopB => stopB,
Parity_EN => Parity_EN,
Parity_EV => Parity_EV,
sTX => isTX,
BUSYn => TSR_EMPTY,
read => TF_RD);
sTX <= isTX;
--------------------------------------------------
---- Receive FIFO ----------------------------------
--------------------------------------------------
U30 : gh_edge_det
PORT MAP (
clk => BR_clk,
rst => rst,
d => RD_RDY,
re => RF_WR);
RF_RD <= '0' when (LCR(7) = '1') else -- added 04/19/06
'1' when ((ADD = "000") and (CS = '1') and (WR = '0')) else
'0';
U31 : gh_fifo_async16_rcsr_wf -- 01/20/07
Generic Map(data_width => 11)
PORT MAP (
clk_WR => BR_clk,
clk_RD => clk,
rst => rst,
rc_srst => RF_CLR,
WR => RF_WR,
RD => RF_RD,
D => RF_DI,
Q => RF_DO,
empty => RF_empty,
q_full => q_full,
h_full => h_full,
a_full => a_full,
full => RF_full);
Parity_ER <= RF_DO(8);
FRAME_ER <= RF_DO(9);
Break_ITR <= RF_DO(10);
ITR3 <= '0' when (IER(2) = '0') else
'1' when (LSR(1) = '1') else
'1' when (RF_DO(10 downto 8) > "000") else
'0';
isRX <= sRX when (iLOOP = '0') else
isTX;
ITR2 <= '0' when (IER(0) = '0') else -- mod 01/20/07
'1' when ((FCR(7 downto 6) = "11") and (a_full = '1')) else
'1' when ((FCR(7 downto 6) = "10") and (h_full = '1')) else
'1' when ((FCR(7 downto 6) = "01") and (q_full = '1')) else
'1' when ((FCR(7 downto 6) = "00") and(RF_empty = '0')) else
'0';
U33 : gh_UART_Rx_8bit
PORT MAP (
clk => BR_clk,
rst => rst,
BRCx16 => BRC16x,
sRX => isRX,
num_bits => num_bits,
Parity_EN => Parity_EN,
Parity_EV => Parity_EV,
Parity_ER => RF_DI(8),
FRAME_ER => RF_DI(9),
Break_ITR => RF_DI(10),
D_RDY => RD_RDY,
D => RF_DI(7 downto 0)
);
----------------------------------------------------------------
---------- added 04/08/06 time out interrupt -------------------
---------- once there a received data word is recieved, --------
---------- the counter will be running until -------------------
---------- FIFO is empty, counter reset on FIFO read or write --
------- mod 3 aug 2007
TOI_clr <= RF_empty or RF_RD or (not IER(0));
U34 : gh_jkff
PORT MAP (
clk => clk,
rst => rst,
j => TOI_set,
k => TOI_clr,
Q => TOI);
U35 : gh_jkff
PORT MAP (
clk => clk,
rst => rst,
j => LSR(0), -- enable time out counter with received data
k => RF_empty, -- once FIFO is empty, stop counter
Q => iTOI_enc);
U35a : gh_edge_det_XCD
PORT MAP (
iclk => clk,
oclk => BR_clk,
rst => rst,
d => RF_RD,
re => RF_RD_brs,
fe => open);
process(BR_clk,rst)
begin
if (rst = '1') then
TOI_enc <= '0';
elsif (rising_edge(BR_clk)) then
TOI_enc <= iTOI_enc;
end if;
end process;
TOI_c_ld <= '1' when (IER(0) = '0') else -- added 4 aug 2007
'1' when (TOI_enc = '0') else
'1' when (RF_RD_brs = '1') else
'1' when (RF_WR = '1') else
'0';
U36 : gh_counter_down_ce_ld_tc
generic map(10)
port map(
clk => BR_clk,
rst => rst,
LOAD => TOI_c_ld,
CE => BRC16x,
D => TOI_c_d(9 downto 0),
-- Q => ,
TC => iTOI_set
);
U36a : gh_edge_det_XCD
PORT MAP (
iclk => BR_clk,
oclk => clk,
rst => rst,
d => iTOI_set,
re => TOI_set,
fe => open);
TOI_c_d <= x"1C0" when (num_bits = 5) else
x"200" when (num_bits = 6) else
x"240" when (num_bits = 7) else
x"280";-- when (num_bits = 8)
--------------------------------------------------------------
--------------------------------------------------------------
IRQ <= '1' when ((ITR3 or ITR2 or TOI or ITR1 or ITR0) = '1') else
'0';
iIIR(0) <= '0' when ((ITR3 or ITR2 or TOI or ITR1 or ITR0) = '1') else
'1';
iIIR(3 downto 1) <= "011" when (ITR3 = '1') else
"010" when (ITR2 = '1') else
"110" when (TOI = '1') else -- added 04/08/06
"001" when (ITR1 = '1') else
"000";
IIR(7 downto 4) <= x"C"; -- FIFO's always enabled
u37 : gh_register_ce -- 12/23/06
generic map (4)
port map(
clk => clk,
rst => rst,
ce => CSn,
D => iIIR,
Q => IIR(3 downto 0)
);
--------------------------------------------------------------
end a;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -