URL
https://opencores.org/ocsvn/hdlc/hdlc/trunk
Subversion Repositories hdlc
Compare Revisions
- This comparison shows the changes necessary to convert path
/hdlc/trunk/CODE/TOP/core
- from Rev 10 to Rev 17
- ↔ Reverse comparison
Rev 10 → Rev 17
/RxFCS.vhd
0,0 → 1,202
------------------------------------------------------------------------------- |
-- Title : Rx FCS |
-- Project : HDLC controller |
------------------------------------------------------------------------------- |
-- File : RxFCS.vhd |
-- Author : Jamil Khatib (khatib@ieee.org) |
-- Organization: OpenIPCore Project |
-- Created :2001/04/05 |
-- Last update: 2001/04/20 |
-- Platform : |
-- Simulators : Modelsim 5.3XE/Windows98,NC-SIM/Linux |
-- Synthesizers: |
-- Target : |
-- Dependency : ieee.std_logic_1164, ieee.std_logic_unsigned |
-- hdlc.PCK_CRC16_D8 |
------------------------------------------------------------------------------- |
-- Description: HDLC RX FCS-16 checking |
------------------------------------------------------------------------------- |
-- Copyright (c) 2000 Jamil Khatib |
-- |
-- This VHDL design file is an open design; you can redistribute it and/or |
-- modify it and/or implement it after contacting the author |
-- You can check the draft license at |
-- http://www.opencores.org/OIPC/license.shtml |
|
------------------------------------------------------------------------------- |
-- Revisions : |
-- Revision Number : 1 |
-- Version : 0.1 |
-- Date : 5 April 2001 |
-- Modifier : Jamil Khatib (khatib@ieee.org) |
-- Desccription : Created |
-- ToOptimize : |
-- Bugs : |
------------------------------------------------------------------------------- |
-- $Log: not supported by cvs2svn $ |
-- Revision 1.2 2001/04/20 18:29:01 jamil |
-- Sencetivity list bug fixed |
-- |
-- Revision 1.1 2001/04/14 15:02:25 jamil |
-- Initial Release |
-- |
------------------------------------------------------------------------------- |
|
LIBRARY ieee; |
USE ieee.std_logic_1164.ALL; |
USE ieee.std_logic_unsigned.ALL; |
|
LIBRARY hdlc; |
USE hdlc.PCK_CRC16_D8.ALL; |
|
|
ENTITY RxFCS_ent IS |
GENERIC ( |
FCS_TYPE : INTEGER := 2); -- 2= FCS 16 |
-- 4= FCS 32 |
-- 0= disable FCS |
PORT ( |
clk : IN STD_LOGIC; -- system clock |
rst_n : IN STD_LOGIC; -- system reset |
RxD : IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- Rx Data bus |
ValidFrame : IN STD_LOGIC; -- Frame Strobe |
rdy : IN STD_LOGIC; -- rdy to send byte |
Readbyte : OUT STD_LOGIC; -- Read byte |
DataBuff : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- Rx output data |
WrBuff : OUT STD_LOGIC; -- Write to buffer |
EOF : OUT STD_LOGIC; -- End of Frame pulse |
FCSen : IN STD_LOGIC; -- FCs enable |
FCSerr : OUT STD_LOGIC); -- FCS error |
|
END RxFCS_ent; |
|
ARCHITECTURE RxFCS_rtl OF RxFCS_ent IS |
|
TYPE STATES_typ IS (IDLE_st, RUN_st, READ_st, EOF_st); -- Internal states |
SIGNAL p_state : STATES_typ; -- Present state |
SIGNAL n_state : STATES_typ; -- Next state |
|
SIGNAL FCS_reg : STD_LOGIC_VECTOR(15 DOWNTO 0); -- FCS register |
SIGNAL FCS_value : STD_LOGIC_VECTOR(15 DOWNTO 0); -- FCS value |
|
SIGNAL WrBuff_i : STD_LOGIC; -- Internal WrBuff |
SIGNAL EOF_i : STD_LOGIC; -- Internal EOF |
|
BEGIN -- RxFCS_rtl |
-- purpose: FSM |
-- type : sequential |
-- inputs : clk, rst_n |
-- outputs: |
fsm : PROCESS (clk, rst_n) |
|
BEGIN -- PROCESS fsm |
|
IF rst_n = '0' THEN -- asynchronous reset (active low) |
p_state <= IDLE_st; |
FCS_reg <= (OTHERS => '1'); |
WrBuff <= '0'; |
DataBuff <= (OTHERS => '1'); |
EOF <= '0'; |
ELSIF clk'event AND clk = '1' THEN -- rising clock edge |
p_state <= n_state; |
FCS_reg <= FCS_value; |
DataBuff <= RxD; |
WrBuff <= WrBuff_i; |
EOF <= EOF_i; |
END IF; |
|
END PROCESS fsm; |
|
|
-- purpose: fsm combination input/output logic |
-- type : combinational |
-- inputs : p_state,ValidFrame,rdy |
-- outputs: |
fsm_logic : PROCESS (p_state, ValidFrame, rdy, FCS_reg, FCSen,RxD) |
|
BEGIN -- PROCESS fsm_logic |
|
CASE p_state IS |
|
WHEN IDLE_st => |
|
FCSerr <= '0'; |
WrBuff_i <= '0'; |
FCS_value <= (OTHERS => '1'); |
Readbyte <= '0'; |
EOF_i <= '0'; |
IF (ValidFrame = '1') THEN |
n_state <= RUN_st; |
ELSE |
n_state <= IDLE_st; |
END IF; |
|
WHEN RUN_st => |
FCSerr <= '0'; |
WrBuff_i <= '0'; |
IF (ValidFrame = '1') THEN |
|
FCS_value <= FCS_reg; |
EOF_i <= '0'; |
|
IF (rdy = '1') THEN |
n_state <= READ_st; |
Readbyte <= '0'; |
ELSE |
n_state <= RUN_st; |
Readbyte <= '0'; |
END IF; |
|
ELSE |
n_state <= EOF_st; |
Readbyte <= '0'; |
FCS_value <= FCS_reg; |
EOF_i <= '1'; |
|
END IF; |
|
WHEN EOF_st => |
|
n_state <= IDLE_st; |
Readbyte <= '0'; |
WrBuff_i <= '0'; |
FCSerr <= FCSen AND |
NOT (NOT FCS_reg(15) AND NOT FCS_reg(14)AND NOT FCS_reg(13) AND FCS_reg(12) |
AND FCS_reg(11) AND FCS_reg(10) AND NOT FCS_reg(9) AND FCS_reg(8) |
AND NOT FCS_reg(7) AND NOT FCS_reg(6) AND NOT FCS_reg(5) AND NOT FCS_reg(4) |
AND FCS_reg(3) AND FCS_reg(2) AND FCS_reg(1) AND FCS_reg(0) |
); |
-- 0001 1101 0000 1111 |
|
FCS_value <= (OTHERS => '1'); |
EOF_i <= '0'; |
|
WHEN READ_st => |
|
FCSerr <= '0'; |
EOF_i <= '0'; |
|
IF (rdy = '1') THEN |
|
n_state <= READ_st; |
FCS_value <= FCS_reg; |
WrBuff_i <= '0'; |
Readbyte <= '1'; |
|
ELSE -- Data valid |
|
n_state <= RUN_st; |
FCS_value <= nextCRC16_D8 ( RxD, FCS_reg ); --FCS_reg; |
WrBuff_i <= '1'; |
Readbyte <= '0'; |
|
END IF; |
|
WHEN OTHERS => NULL; |
END CASE; |
|
END PROCESS fsm_logic; |
|
|
|
END RxFCS_rtl; |
/RxSync.vhd
0,0 → 1,158
------------------------------------------------------------------------------- |
-- Title : Rx Synchronizer |
-- Project : HDLC controller |
------------------------------------------------------------------------------- |
-- File : RxSync.vhd |
-- Author : Jamil Khatib <khatib@ieee.org> |
-- Organization: OpenCores Project |
-- Created : 2001/04/04 |
-- Last update: 2001/04/04 |
-- Platform : |
-- Simulators : Modelsim/Win98 , NC-sim/Linux |
-- Synthesizers: |
-- Target : |
-- Dependency : ieee.std_logic |
------------------------------------------------------------------------------- |
-- Description: Rx Synchronizer |
------------------------------------------------------------------------------- |
-- Copyright (c) 2001 Jamil Khatib |
-- |
-- This VHDL design file is an open design; you can redistribute it and/or |
-- modify it and/or implement it after contacting the author |
-- You can check the draft license at |
-- http://www.opencores.org/OIPC/license.shtml |
------------------------------------------------------------------------------- |
-- Revisions : |
-- Revision Number : 1 |
-- Version : 0.1 |
-- Date : 2001/04/04 |
-- Modifier : Jamil Khatib <khatib@ieee.org> |
-- Desccription : Created |
-- ToOptimize : |
-- Known Bugs : |
------------------------------------------------------------------------------- |
-- $Log: not supported by cvs2svn $ |
-- Revision 1.1 2001/04/14 15:02:25 jamil |
-- Initial Release |
-- |
------------------------------------------------------------------------------- |
|
LIBRARY ieee; |
USE ieee.std_logic_1164.ALL; |
|
ENTITY RxSynch_ent IS |
-- D1 Domain 1 = Serial line |
-- D2 Domain 2 = System interface |
PORT ( |
rst_n : IN STD_LOGIC; -- System reset |
clk_D1 : IN STD_LOGIC; -- Domain 1 clock |
clk_D2 : IN STD_LOGIC; -- Domain 2 clock |
rdy_D1 : IN STD_LOGIC; -- Domain 1 ready |
rdy_D2 : OUT STD_LOGIC; -- Domain 2 ready |
RXD_D1 : IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- Domain 1 Rx Data bus |
RXD_D2 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- Domain 2 Rx Data Bus |
ValidFrame_D1 : IN STD_LOGIC; -- Domain 1 Valid Frame |
ValidFrame_D2 : OUT STD_LOGIC; -- Domain 2 Valid Frame |
AbortSignal_D1 : IN STD_LOGIC; -- Domain 1 Abort signal |
AbortSignal_D2 : OUT STD_LOGIC; -- Domain 2 Abort signal |
FrameError_D1 : IN STD_LOGIC; -- Domain 1 Frame Error |
FrameError_D2 : OUT STD_LOGIC; -- Domain 2 Frame Error |
ReadByte_D1 : OUT STD_LOGIC; -- Domain 1 Read Byte |
ReadByte_D2 : IN STD_LOGIC -- Domain 2 Read Byte |
|
); |
|
END RxSynch_ent; |
------------------------------------------------------------------------------- |
|
ARCHITECTURE RxSynch_rtl OF RxSynch_ent IS |
|
BEGIN -- ARCHITECTURE RxSynch_rtl |
|
-- Data bus does not need synchronization |
RXD_D2 <= RXD_D1; |
|
-- purpose: rdy signal |
-- type : sequential |
-- inputs : clk_D2, rst_n |
-- outputs: |
Rdy_signal : PROCESS (clk_D2, rst_n) |
VARIABLE FF1 : STD_LOGIC; |
BEGIN -- PROCESS Rdy_signal |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
FF1 := '0'; |
rdy_D2 <= '0'; |
ELSIF clk_D2'event AND clk_D2 = '1' THEN -- rising clock edge |
rdy_D2 <= FF1; |
FF1 := rdy_D1; |
END IF; |
|
END PROCESS Rdy_signal; |
|
-- purpose: Read bytes signal |
-- type : sequential |
-- inputs : clk_D1, rst_n |
-- outputs: |
Read_signal : PROCESS (clk_D1, rst_n) |
VARIABLE FF1 : STD_LOGIC; |
BEGIN -- PROCESS Read_signal |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
FF1 := '0'; |
ReadByte_D1 <= '0'; |
ELSIF clk_D1'event AND clk_D1 = '1' THEN -- rising clock edge |
ReadByte_D1 <= FF1; |
FF1 := ReadByte_D2; |
END IF; |
END PROCESS Read_signal; |
|
|
-- purpose: Valid Frame signal |
-- type : sequential |
-- inputs : clk_D2, rst_n |
-- outputs: |
ValidFrame_signal : PROCESS (clk_D2, rst_n) |
VARIABLE FF1 : STD_LOGIC; |
BEGIN -- PROCESS ValidFrame_signal |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
FF1 := '0'; |
ValidFrame_D2 <= '0'; |
ELSIF clk_D2'event AND clk_D2 = '1' THEN -- rising clock edge |
ValidFrame_D2 <= FF1; |
FF1 := ValidFrame_D1; |
END IF; |
END PROCESS ValidFrame_signal; |
|
-- purpose: Abort signal |
-- type : sequential |
-- inputs : clk_D2, rst_n |
-- outputs: |
Abort_signal : PROCESS (clk_D2, rst_n) |
VARIABLE FF1 : STD_LOGIC; |
BEGIN -- PROCESS AbortedTrans_signal |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
FF1 := '0'; |
AbortSignal_D2 <= '0'; |
ELSIF clk_D2'event AND clk_D2 = '1' THEN -- rising clock edge |
AbortSignal_D2 <= FF1; |
FF1 := AbortSignal_D1; |
END IF; |
END PROCESS Abort_signal; |
|
|
-- purpose: Error signal |
-- type : sequential |
-- inputs : clk_D2, rst_n |
-- outputs: |
Error_signal : PROCESS (clk_D2, rst_n) |
VARIABLE FF1 : STD_LOGIC; |
BEGIN -- PROCESS FrameError_signal |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
FF1 := '0'; |
FrameError_D2 <= '0'; |
ELSIF clk_D2'event AND clk_D2 = '1' THEN -- rising clock edge |
FrameError_D2 <= FF1; |
FF1 := FrameError_D1; |
END IF; |
END PROCESS Error_signal; |
|
END RxSynch_rtl; |
/WB_IF.vhd
0,0 → 1,502
------------------------------------------------------------------------------- |
-- Title : WISHBONE bus interface |
-- Project : HDLC controller |
------------------------------------------------------------------------------- |
-- File : WB_IF.vhd |
-- Author : Jamil Khatib (khatib@ieee.org) |
-- Organization: OpenIPCore Project |
-- Created :2001/04/11 |
-- Last update:2001/04/18 |
-- Platform : |
-- Simulators : Modelsim 5.3XE/Windows98,NC-SIM/Linux |
-- Synthesizers: |
-- Target : |
-- Dependency : ieee.std_logic_1164 |
------------------------------------------------------------------------------- |
-- Description: Wishbone bus interface |
------------------------------------------------------------------------------- |
-- Copyright (c) 2001 Jamil Khatib |
-- |
-- This VHDL design file is an open design; you can redistribute it and/or |
-- modify it and/or implement it after contacting the author |
-- You can check the draft license at |
-- http://www.opencores.org/OIPC/license.shtml |
|
------------------------------------------------------------------------------- |
-- Revisions : |
-- Revision Number : 1 |
-- Version : 0.1 |
-- Date : 11 April 2001 |
-- Modifier : Jamil Khatib (khatib@ieee.org) |
-- Desccription : Created |
-- ToOptimize : |
-- Bugs : |
------------------------------------------------------------------------------- |
-- $Log: not supported by cvs2svn $ |
-- Revision 1.3 2001/04/27 18:21:59 jamil |
-- After Prelimenray simulation |
-- |
-- Revision 1.2 2001/04/22 20:08:16 jamil |
-- Top level simulation |
-- |
------------------------------------------------------------------------------- |
LIBRARY ieee; |
USE ieee.std_logic_1164.ALL; |
|
ENTITY WB_IF_ent IS |
GENERIC ( |
ADD_WIDTH : integer := 7); -- Address width |
|
PORT ( |
-- WB Bus ports |
CLK_I : IN std_logic; -- System Clock |
RST_I : IN std_logic; -- System Reset |
ACK_O : OUT std_logic; -- acknowledge |
ADR_I : IN std_logic_vector(2 DOWNTO 0); -- address |
CYC_I : IN std_logic; -- Bus cycle |
DAT_I : IN std_logic_vector(31 DOWNTO 0); -- Input data |
DAT_O : OUT std_logic_vector(31 DOWNTO 0); -- Output data |
RTY_O : OUT std_logic; -- retry |
STB_I : IN std_logic; -- strobe |
WE_I : IN std_logic; -- Write |
TAG0_O : OUT std_logic; -- TAG0 (TxDone) |
TAG1_O : OUT std_logic; -- TAG1_O (RxRdy) |
|
-- Internal ports |
-- Tx |
TxEnable : OUT std_logic; -- TxEnable (Write Frame completed) |
TxDone : IN std_logic; -- Transmission Done (Read Frame completed) |
TxDataInBuff : OUT std_logic_vector(7 DOWNTO 0); -- Input Data |
Txwr : OUT std_logic; -- Tx Write Buffer |
TxAborted : IN std_logic; -- Aborted Frame |
TxAbort : OUT std_logic; -- Abort Transmission |
TxOverflow : IN std_logic; -- Tx Buffer Overflow |
TxFCSen : OUT std_logic; -- FCS enable; |
|
-- Rx |
RxFrameSize : IN std_logic_vector(ADD_WIDTH-1 DOWNTO 0); -- Frame Length |
RxRdy : IN std_logic; -- Rx Ready |
RxDataBuffOut : IN std_logic_vector(7 DOWNTO 0); -- Output Rx Buffer |
RxOverflow : IN std_logic; -- Rx Buffer Overflow |
RxFrameError : IN std_logic; -- Frame Error |
RxFCSErr : IN std_logic; -- Rx FCS Error |
RxRd : OUT std_logic; -- Rx Read data |
RxAbort : IN std_logic -- Received Abort signal |
|
); |
|
END WB_IF_ent; |
|
ARCHITECTURE WB_IF_rtl OF WB_IF_ent IS |
SIGNAL ack_0 : std_logic; -- ack Reg 0 |
SIGNAL ack_1 : std_logic; -- ack Reg 1 |
SIGNAL ack_2 : std_logic; -- ack Reg 2 |
SIGNAL ack_3 : std_logic; -- ack Reg 3 |
SIGNAL ack_4 : std_logic; -- ack Reg 4 |
|
SIGNAL DATO_0 : std_logic_vector(31 DOWNTO 0); -- data out 0 |
SIGNAL DATO_1 : std_logic_vector(31 DOWNTO 0); -- data out 1 |
SIGNAL DATO_2 : std_logic_vector(31 DOWNTO 0); -- data out 2 |
SIGNAL DATO_3 : std_logic_vector(31 DOWNTO 0); -- data out 3 |
SIGNAL DATO_4 : std_logic_vector(31 DOWNTO 0); -- data out 4 |
|
SIGNAL en_0 : std_logic; -- Enable reg 0 |
SIGNAL en_1 : std_logic; -- Enable reg 1 |
SIGNAL en_2 : std_logic; -- Enable reg 2 |
SIGNAL en_3 : std_logic; -- Enable reg 3 |
SIGNAL en_4 : std_logic; -- Enable reg 4 |
|
SIGNAL counter : integer RANGE 0 TO 7; -- System counter |
SIGNAL rst_count : std_logic; -- Reset counter |
|
BEGIN -- WB_IF_rtl |
|
-- purpose: WB fsm |
-- type : sequential |
-- inputs : CLK_I, RST_I |
-- outputs: |
WB_fsm : PROCESS (CLK_I, RST_I) |
|
BEGIN -- PROCESS WB_fsm |
IF (CLK_I'event AND CLK_I = '1') THEN |
RTY_O <= '0'; |
|
IF (RST_I = '1') THEN -- synchronous reset |
|
ACK_O <= '0'; |
DAT_O <= (OTHERS => '0'); |
RTY_O <= '0'; |
TAG0_O <= '0'; |
TAG1_O <= '0'; |
|
en_0 <= '0'; |
en_1 <= '0'; |
en_2 <= '0'; |
en_3 <= '0'; |
en_4 <= '0'; |
rst_count <= '1'; |
|
ELSE |
TAG0_O <= TxDone; |
TAG1_O <= RxRdy; |
|
IF (CYC_I = '1' AND STB_I = '1') THEN |
|
CASE ADR_I IS |
WHEN "000" => -- Tx_SC |
ACK_O <= ack_0; |
DAT_O <= DATO_0; |
|
en_0 <= '1'; |
en_1 <= '0'; |
en_2 <= '0'; |
en_3 <= '0'; |
en_4 <= '0'; |
rst_count <= '1'; |
|
WHEN "001" => -- Tx_Buff |
ACK_O <= ack_1; |
DAT_O <= DATO_1; |
|
en_0 <= '0'; |
en_1 <= '1' and not ack_1; |
en_2 <= '0'; |
en_3 <= '0'; |
en_4 <= '0'; |
|
IF counter = 4 THEN |
rst_count <= '1'; |
else |
rst_count <= '0'; |
END IF; |
|
WHEN "010" => -- Rx_SC |
ACK_O <= ack_2; |
DAT_O <= DATO_2; |
|
en_0 <= '0'; |
en_1 <= '0'; |
en_2 <= '1'; |
en_3 <= '0'; |
en_4 <= '0'; |
|
WHEN "011" => -- Rx_Buff |
ACK_O <= ack_3; |
DAT_O <= DATO_3; |
|
en_0 <= '0'; |
en_1 <= '0'; |
en_2 <= '0'; |
en_3 <= '1' and not ack_3; |
en_4 <= '0'; |
|
IF counter = 7 THEN |
rst_count <= '1'; |
else |
rst_count <= '0'; |
END IF; |
|
WHEN "100" => -- Rx_len |
ACK_O <= ack_4; |
DAT_O <= DATO_4; |
|
en_0 <= '0'; |
en_1 <= '0'; |
en_2 <= '0'; |
en_3 <= '0'; |
en_4 <= '1'; |
|
WHEN OTHERS => |
DAT_O <= (OTHERS => '0'); |
ACK_O <= '1'; |
|
en_0 <= '0'; |
en_1 <= '0'; |
en_2 <= '0'; |
en_3 <= '0'; |
en_4 <= '0'; |
|
END CASE; |
|
ELSE |
|
DAT_O <= (OTHERS => '0'); |
ACK_O <= '0'; |
|
en_0 <= '0'; |
en_1 <= '0'; |
en_2 <= '0'; |
en_3 <= '0'; |
en_4 <= '0'; |
|
END IF; -- cycle |
|
END IF; --clock |
|
END IF; -- reset |
|
END PROCESS WB_fsm; |
|
------------------------------------------------------------------------------- |
-- purpose: Register0 |
-- type : sequential |
-- inputs : CLK_I, RST_I |
-- outputs: |
reg0 : PROCESS (CLK_I, RST_I) |
|
BEGIN -- PROCESS reg0 |
IF (CLK_I'event AND CLK_I = '1') THEN |
|
IF (RST_I = '1') THEN |
ack_0 <= '0'; |
DATO_0 <= (OTHERS => '0'); |
TxEnable <= '0'; |
TxAbort <= '0'; |
TxFCSen <= '1'; |
|
ELSE |
DATO_0 <= "000000000000000000000000"& |
"00" & '0'& TxOverflow & TxAborted & "00" & TxDone; |
ack_0 <= en_0; |
|
IF (en_0 = '1' AND WE_I = '1') THEN |
|
TxEnable <= DAT_I(1); |
TxAbort <= DAT_I(2); |
TxFCSen <= DAT_I(5); |
|
END IF; -- Write and en_0 |
|
|
END IF; -- rst |
END IF; -- clk |
|
END PROCESS reg0; |
------------------------------------------------------------------------------- |
-- purpose: Register1 |
-- type : sequential |
-- inputs : CLK_I, RST_I |
-- outputs: |
reg1 : PROCESS (CLK_I, RST_I) |
|
-- VARIABLE counter : integer RANGE 0 TO 3; -- Internal counter |
|
BEGIN -- PROCESS reg1 |
IF (CLK_I'event AND CLK_I = '1') THEN |
|
IF (RST_I = '1') THEN |
ack_1 <= '0'; |
DATO_1 <= (OTHERS => '0'); |
-- counter := 0; |
|
ELSE -- reset |
DATO_1 <= (OTHERS => '0'); |
|
IF (WE_I = '1' AND en_1 = '1') THEN |
|
-- Txwr <= '1'; |
CASE counter IS |
WHEN 0 => |
Txwr <= '1'; |
TxDataInBuff <= DAT_I(7 DOWNTO 0); |
ack_1 <= '0'; |
-- counter := counter + 1; |
WHEN 1 => |
Txwr <= '1'; |
TxDataInBuff <= DAT_I(15 DOWNTO 8); |
ack_1 <= '0'; |
-- counter := counter + 1; |
WHEN 2 => |
Txwr <= '1'; |
TxDataInBuff <= DAT_I(23 DOWNTO 16); |
ack_1 <= '0'; |
-- counter := counter + 1; |
WHEN 3 => |
Txwr <= '1'; |
TxDataInBuff <= DAT_I(31 DOWNTO 24); |
ack_1 <= '1'; |
-- counter := 0; |
WHEN OTHERS => |
Txwr <= '0'; |
TxDataInBuff <= (others=> '0'); |
ack_1 <= '0'; |
END CASE; |
|
ELSE -- WE_I |
|
TxDataInBuff <= (OTHERS => '0'); |
-- counter := 0; |
Txwr <= '0'; |
ack_1 <= '0'; |
END IF; -- WE_I and en_1 |
|
|
END IF; -- rst |
END IF; -- clk |
|
END PROCESS reg1; |
|
------------------------------------------------------------------------------- |
-- purpose: Register2 |
-- type : sequential |
-- inputs : CLK_I, RST_I |
-- outputs: |
reg2 : PROCESS (CLK_I, RST_I) |
|
BEGIN -- PROCESS reg3 |
IF (CLK_I'event AND CLK_I = '1') THEN |
|
IF (RST_I = '1') THEN |
ack_2 <= '0'; |
DATO_2 <= (OTHERS => '0'); |
|
ELSE |
DATO_2 <= "000000000000000000000000"& |
"000"& RxOverflow & RxAbort & RxFrameError & RxFCSErr & RxRdy; |
ack_2 <= en_2; |
|
END IF; -- rst |
END IF; -- clk |
|
END PROCESS reg2; |
------------------------------------------------------------------------------- |
-- purpose: Register3 |
-- type : sequential |
-- inputs : CLK_I, RST_I |
-- outputs: |
reg3 : PROCESS (CLK_I, RST_I) |
|
-- VARIABLE count : integer RANGE 0 TO 5; -- Internal counter |
|
BEGIN -- PROCESS reg1 |
IF (CLK_I'event AND CLK_I = '1') THEN |
|
IF (RST_I = '1') THEN |
ack_3 <= '0'; |
DATO_3 <= (OTHERS => '0'); |
-- count := 0; |
|
ELSE |
|
IF (en_3 = '1' AND WE_I = '0') THEN |
|
-- if (WE_I = '0') then |
|
CASE counter IS |
WHEN 0 => |
RxRd <= '1'; |
DATO_3 <= (OTHERS => '0'); |
ack_3 <= '0'; |
-- count := count + 1; |
|
WHEN 1 => |
RxRd <= '1'; |
-- DATO_3 <= "000000000000000000000000" & RxDataBuffOut; |
DATO_3 <= RxDataBuffOut & DATO_3(31 downto 8); |
-- DATO_3 <= (OTHERS => '0'); |
ack_3 <= '0'; |
-- count := count + 1; |
|
WHEN 2 => |
RxRd <= '1'; |
DATO_3 <= RxDataBuffOut & DATO_3(31 DOWNTO 8); |
ack_3 <= '0'; |
-- count := count + 1; |
|
WHEN 3 => |
RxRd <= '0'; |
|
DATO_3 <= RxDataBuffOut & DATO_3(31 DOWNTO 8); |
ack_3 <= '0'; |
-- count := count + 1; |
WHEN 4 => |
RxRd <= '0'; |
|
DATO_3 <= RxDataBuffOut & DATO_3(31 DOWNTO 8); |
ack_3 <= '0'; |
-- count := count +1; |
WHEN 5 => |
RxRd <= '0'; |
|
DATO_3 <= RxDataBuffOut & DATO_3(31 DOWNTO 8); |
ack_3 <= '1'; |
---- count := 0; |
|
WHEN OTHERS => |
RxRd <= '0'; |
|
DATO_3 <= (others=>'0'); |
ack_3 <= '0'; |
END CASE; |
|
-- else |
-- DATO_3 <= (others => '0'); |
-- counter := 0; |
-- RxRd <= '0'; |
-- ack_3 <= '0'; |
|
-- end if; -- Write |
|
ELSE |
DATO_3 <= (OTHERS => '0'); |
-- count := 0; |
RxRd <= '0'; |
ack_3 <= '0'; |
|
END IF; -- en |
|
END IF; -- rst |
END IF; -- clk |
|
END PROCESS reg3; |
|
----------------------------------------------------------------------------- |
-- purpose: Register4 |
-- type : sequential |
-- inputs : CLK_I, RST_I |
-- outputs: |
reg4 : PROCESS (CLK_I, RST_I) |
|
BEGIN -- PROCESS reg4 |
IF (CLK_I'event AND CLK_I = '1') THEN |
|
IF (RST_I = '1') THEN |
ack_4 <= '0'; |
DATO_4 <= (OTHERS => '0'); |
|
ELSE |
DATO_4 <= "000000000000000000000000"& |
'0' & RxFrameSize; |
ack_4 <= en_4; |
|
END IF; -- rst |
END IF; -- clk |
|
END PROCESS reg4; |
----------------------------------------------------------------------------- |
|
-- purpose: system counter |
-- type : sequential |
-- inputs : CLK_I |
-- outputs: |
sys_counter : PROCESS (CLK_I) |
BEGIN -- process sys_counter |
|
IF CLK_I'event AND CLK_I = '1' THEN -- rising clock edge |
|
IF rst_count = '1' THEN |
|
counter <= 0; |
|
ELSIF en_1 = '1' OR en_3 = '1' THEN |
|
counter <= counter +1; |
|
ELSE |
counter <= 0; |
END IF; |
END IF; |
END PROCESS sys_counter; |
----------------------------------------------------------------------------- |
|
END WB_IF_rtl; |
/TxFCS.vhd
0,0 → 1,327
------------------------------------------------------------------------------- |
-- Title : Tx FCS |
-- Project : HDLC controller |
------------------------------------------------------------------------------- |
-- File : TxFCS.vhd |
-- Author : Jamil Khatib (khatib@ieee.org) |
-- Organization: OpenIPCore Project |
-- Created :2001/03/09 |
-- Last update: 2001/04/24 |
-- Platform : |
-- Simulators : Modelsim 5.3XE/Windows98,NC-SIM/Linux |
-- Synthesizers: |
-- Target : |
-- Dependency : ieee.std_logic_1164 |
-- hdlc.PCK_CRC16_D8 |
------------------------------------------------------------------------------- |
-- Description: HDLC TX FCS-16 generation |
------------------------------------------------------------------------------- |
-- Copyright (c) 2001 Jamil Khatib |
-- |
-- This VHDL design file is an open design; you can redistribute it and/or |
-- modify it and/or implement it after contacting the author |
-- You can check the draft license at |
-- http://www.opencores.org/OIPC/license.shtml |
|
------------------------------------------------------------------------------- |
-- Revisions : |
-- Revision Number : 1 |
-- Version : 0.1 |
-- Date : 9 March 2001 |
-- Modifier : Jamil Khatib (khatib@ieee.org) |
-- Desccription : Created |
-- ToOptimize : |
-- Bugs : |
------------------------------------------------------------------------------- |
-- Revisions : |
-- Revision Number : 2 |
-- Version : 0.11 |
-- Date : 21 March 2001 |
-- Modifier : Jamil Khatib (khatib@ieee.org) |
-- Desccription : Ack signal added to fix any possible handshake error on |
-- slow devices |
-- slow hdlc controller can cause rdy signal to be asserted |
-- for long time so ack signal indicates that the |
-- controller has accepted the new data |
-- ToOptimize : Reduce number of states |
-- Bugs : |
------------------------------------------------------------------------------- |
-- Revision Number : 3 |
-- Version : 0.2 |
-- Date : 9 April 2001 |
-- Modifier : Jamil Khatib (khatib@ieee.org) |
-- Desccription : Added FCS enable (to tranmist FCS or not) |
-- FCS bit inversion fixed |
-- ToOptimize : Reduce number of states, Check the FCSen operation |
-- Bugs : |
------------------------------------------------------------------------------- |
-- $Log: not supported by cvs2svn $ |
-- Revision 1.5 2001/04/27 18:21:59 jamil |
-- After Prelimenray simulation |
-- |
-- Revision 1.4 2001/04/14 15:18:05 jamil |
-- Generic FCS added |
-- |
-- Revision 1.3 2001/04/08 21:03:31 jamil |
-- Added FCS enable (to tranmist FCS or not) |
-- FCS bit inversion fixed |
-- |
-- Revision 1.2 2001/03/21 22:47:05 jamil |
-- ACK slow devices bug fixed |
-- |
-- Revision 1.1 2001/03/21 20:19:43 jamil |
-- Initial Release |
-- |
------------------------------------------------------------------------------- |
|
LIBRARY ieee; |
USE ieee.std_logic_1164.ALL; |
|
LIBRARY hdlc; |
USE hdlc.PCK_CRC16_D8.ALL; |
|
ENTITY Txfcs_ent IS |
GENERIC ( |
FCS_TYPE : INTEGER := 2); -- 2= FCS 16 |
-- 4= FCS 32 |
-- 0= Disable FCS |
PORT ( |
TxClk : IN STD_LOGIC; -- Tx Clock |
rst_n : IN STD_LOGIC; -- System Reset |
FCSen : IN STD_LOGIC; -- FCS enable |
ValidFrame : OUT STD_LOGIC; -- Valid Frame |
WriteByte : OUT STD_LOGIC; -- Write Byte |
rdy : IN STD_LOGIC; -- Ready to send data |
ack : IN STD_LOGIC; -- Acknowlege |
TxData : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- Tx Data |
|
TxDataAvail : IN STD_LOGIC; -- Tx Data is available in the buffer |
-- (reflected from TxEnable bit in Tx register) |
RdBuff : OUT STD_LOGIC; -- Read Tx data buffer |
TxDataBuff : IN STD_LOGIC_VECTOR(7 DOWNTO 0)); -- Tx Data buffer |
|
|
END Txfcs_ent; |
|
|
ARCHITECTURE Txfcs_beh OF Txfcs_ent IS |
|
BEGIN -- Txfcs_sync_beh |
------------------------------------------------------------------------------- |
-- purpose: Main State machine |
-- type : sequential |
-- inputs : TxClk, rst_n |
-- outputs: |
FSM_proc : PROCESS (TxClk, rst_n) |
VARIABLE FCS_reg : STD_LOGIC_VECTOR(15 DOWNTO 0); -- FCS register |
TYPE States_types IS (IDLE_st, READ_st, WRITE_st, WAIT_st, SETZ1_st, WRITEZ1_st, SETZ2_st, WAIT2_st, WAIT_STATE1_st, WAIT_STATE2_st, WAIT_STATE3_st); |
-- Internal states |
VARIABLE state : States_types; -- State register |
|
VARIABLE Data2FCS : STD_LOGIC_VECTOR(7 DOWNTO 0); -- Input data to FCS reg |
|
BEGIN -- process FSM_proc |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
Data2FCS := (OTHERS => '0'); |
FCS_reg := (OTHERS => '1'); |
|
ValidFrame <= '0'; |
WriteByte <= '0'; |
TxData <= (OTHERS => '0'); |
|
RdBuff <= '0'; |
|
state := IDLE_st; |
|
ELSIF TxClk'event AND TxClk = '1' THEN -- rising clock edge |
|
|
|
CASE state IS |
WHEN IDLE_st => |
|
FCS_reg := (OTHERS => '1'); |
Data2FCS := (OTHERS => '1'); |
|
ValidFrame <= TxDataAvail;--'0'; |
|
WriteByte <= '0'; |
TxData <= (OTHERS => '0'); |
|
IF rdy = '1' then --AND TxDataAvail = '1' THEN |
state := READ_st; |
RdBuff <= '1'; |
|
ELSE |
state := IDLE_st; |
RdBuff <= '0'; |
|
END IF; |
-- -- -- -- -- |
WHEN READ_st => |
Data2FCS := TxDataBuff; |
-- FCS calculation |
FCS_reg := nextCRC16_D8 ( Data2FCS, FCS_reg ); |
|
ValidFrame <= '1'; |
WriteByte <= '1'; |
TxData <= TxDataBuff; |
|
RdBuff <= '0'; |
|
state := WAIT_STATE1_st; |
-- -- -- -- -- |
WHEN WAIT_STATE1_st => |
-- this state does nothing but registers all output signals till ack is valid |
-- IF ( ack = '1') THEN |
IF ( rdy = '0') THEN |
state := WAIT_st; |
ELSE |
state := WAIT_STATE1_st; |
END IF; |
|
-- -- -- -- -- |
WHEN WAIT_st => |
|
ValidFrame <= '1'; |
WriteByte <= '0'; |
|
IF TxDataAvail = '1' THEN -- Data Available (wait for rdy) |
TxData <= TxDataBuff; |
Data2FCS := TxDataBuff; |
IF rdy = '1' THEN -- ready to accept new data |
|
RdBuff <= '1'; |
state := READ_st; |
|
ELSE |
RdBuff <= '0'; |
state := WAIT_st; |
|
END IF; |
|
ELSE |
-- No data is available |
IF (FCSen = '1') THEN |
TxData <= (OTHERS => '1'); |
Data2FCS := (OTHERS => '1'); |
FCS_reg := nextCRC16_D8 ( Data2FCS, FCS_reg ); |
|
RdBuff <= '0'; |
state := SETZ1_st; |
ELSE |
TxData <= (OTHERS => '1'); |
Data2FCS := (OTHERS => '1'); |
FCS_reg := (OTHERS => '1'); |
|
RdBuff <= '0'; |
state := IDLE_st; |
|
END IF; |
|
END IF; |
|
-- -- -- -- -- |
WHEN SETZ1_st => |
Data2FCS := (OTHERS => '1'); |
-- FCS calculation |
FCS_reg := nextCRC16_D8 ( Data2FCS, FCS_reg ); |
ValidFrame <= '1'; |
|
WriteByte <= '0'; |
TxData <= (OTHERS => '1'); |
|
RdBuff <= '0'; |
state := SETZ2_st; |
-- -- -- -- -- |
WHEN SETZ2_st => |
|
Data2FCS := (OTHERS => '1'); |
|
ValidFrame <= '1'; |
RdBuff <= '0'; |
|
IF rdy = '1' THEN |
|
WriteByte <= '1'; |
|
TxData(7) <= NOT FCS_reg(8); |
TxData(6) <= NOT FCS_reg(9); |
TxData(5) <= NOT FCS_reg(10); |
TxData(4) <= NOT FCS_reg(11); |
TxData(3) <= NOT FCS_reg(12); |
TxData(2) <= NOT FCS_reg(13); |
TxData(1) <= NOT FCS_reg(14); |
TxData(0) <= NOT FCS_reg(15); |
|
|
state := WAIT_STATE2_st; |
|
ELSE |
-- This the normal case when the other device reply to write |
-- signals by deasserting rdy signal |
TxData <= (OTHERS => '1'); |
WriteByte <= '0'; |
state := SETZ2_st; |
END IF; |
-- -- -- -- -- |
|
WHEN WAIT_STATE2_st => |
-- this state does nothing but registers all output signals till ack is valid |
-- IF (ack = '1') THEN |
IF ( rdy = '0') THEN |
state := WAIT2_st; |
ELSE |
state := WAIT_STATE2_st; |
END IF; |
|
-- -- -- -- -- |
WHEN WAIT2_st => |
Data2FCS := (OTHERS => '1'); |
|
ValidFrame <= '1'; |
RdBuff <= '0'; |
|
IF rdy = '1' THEN |
|
WriteByte <= '1'; |
|
TxData(7) <= NOT FCS_reg(0); |
TxData(6) <= NOT FCS_reg(1); |
TxData(5) <= NOT FCS_reg(2); |
TxData(4) <= NOT FCS_reg(3); |
TxData(3) <= NOT FCS_reg(4); |
TxData(2) <= NOT FCS_reg(5); |
TxData(1) <= NOT FCS_reg(6); |
TxData(0) <= NOT FCS_reg(7); |
|
|
state := WAIT_STATE3_st; |
|
ELSE |
TxData <= (OTHERS => '1'); |
WriteByte <= '0'; |
state := WAIT2_st; |
END IF; |
-- -- -- -- -- |
|
WHEN WAIT_STATE3_st => |
-- this state does nothing but registers all output signals till ack is valid |
-- IF (ack = '1') THEN |
IF ( rdy = '0') THEN |
state := IDLE_st; |
ELSE |
state := WAIT_STATE3_st; |
END IF; |
-- -- -- -- -- |
|
WHEN OTHERS => NULL; |
END CASE; |
|
|
END IF; |
END PROCESS FSM_proc; |
|
|
END Txfcs_beh; |
|
/TxSync.vhd
0,0 → 1,176
------------------------------------------------------------------------------- |
-- Title : Tx Synchronizer |
-- Project : HDLC controller |
------------------------------------------------------------------------------- |
-- File : TxSync.vhd |
-- Author : Jamil Khatib <khatib@ieee.org> |
-- Organization: OpenIPCore Project |
-- Created : 2001/03/22 |
-- Last update: 2001/03/22 |
-- Platform : |
-- Simulators : Modelsim/Win98 , NC-sim/Linux |
-- Synthesizers: |
-- Target : |
-- Dependency : ieee.std_logic |
------------------------------------------------------------------------------- |
-- Description: Tx Synchronizer |
------------------------------------------------------------------------------- |
-- Copyright (c) 2001 Jamil Khatib |
-- |
-- This VHDL design file is an open design; you can redistribute it and/or |
-- modify it and/or implement it after contacting the author |
-- You can check the draft license at |
-- http://www.opencores.org/OIPC/license.shtml |
------------------------------------------------------------------------------- |
-- Revisions : |
-- Revision Number : 1 |
-- Version : 0.1 |
-- Date : 2001/03/22 |
-- Modifier : Jamil Khatib <khatib@ieee.org> |
-- Desccription : Created |
-- ToOptimize : |
-- Known Bugs : |
------------------------------------------------------------------------------- |
-- $Log: not supported by cvs2svn $ |
-- Revision 1.1 2001/03/22 21:58:01 jamil |
-- Initial release |
-- |
------------------------------------------------------------------------------- |
|
LIBRARY ieee; |
USE ieee.std_logic_1164.ALL; |
|
ENTITY txSynch_ent IS |
-- D1 Domain 1 = Serial line |
-- D2 Domain 2 = System interface |
PORT ( |
rst_n : IN std_logic; -- System reset |
clk_D1 : IN std_logic; -- Domain 1 clock |
clk_D2 : IN std_logic; -- Domain 2 clock |
rdy_D1 : IN std_logic; -- Domain 1 ready |
rdy_D2 : OUT std_logic; -- Domain 2 ready |
ack : OUT std_logic; -- Acknowldege signals |
TXD_D1 : OUT std_logic_vector(7 DOWNTO 0); -- Domain 1 Tx Data bus |
TXD_D2 : IN std_logic_vector(7 DOWNTO 0); -- Domain 2 Tx Data Bus |
ValidFrame_D1 : OUT std_logic; -- Domain 1 Valid Frame |
ValidFrame_D2 : IN std_logic; -- Domain 2 Valid Frame |
AbortedTrans_D1 : IN std_logic; -- Domain 1 Aborted Transmission |
AbortedTrans_D2 : OUT std_logic; -- Domain 2 Aborted Transmission |
AbortFrame_D1 : OUT std_logic; -- Domain 1 Abort Frame |
AbortFrame_D2 : IN std_logic; -- Domain 2 Abort Frame |
WriteByte_D1 : OUT std_logic; -- Domain 1 Write Byte |
WriteByte_D2 : IN std_logic -- Domain 2 Write Byte |
|
); |
|
END txSynch_ent; |
------------------------------------------------------------------------------- |
|
ARCHITECTURE TxSynch_rtl OF txSynch_ent IS |
SIGNAL ack_i : std_logic; -- ack signal |
|
BEGIN -- ARCHITECTURE TxSynch_rtl |
|
-- Data bus does not need synchronization |
TXD_D1 <= TXD_D2; |
|
-- purpose: rdy signal |
-- type : sequential |
-- inputs : clk_D2, rst_n |
-- outputs: |
Rdy_signal : PROCESS (clk_D2, rst_n) |
VARIABLE FF1 : std_logic; |
BEGIN -- PROCESS Rdy_signal |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
FF1 := '0'; |
rdy_D2 <= '0'; |
ELSIF clk_D2'event AND clk_D2 = '1' THEN -- rising clock edge |
rdy_D2 <= FF1; |
FF1 := rdy_D1; |
END IF; |
|
END PROCESS Rdy_signal; |
|
-- purpose: write bytes signal |
-- type : sequential |
-- inputs : clk_D1, rst_n |
-- outputs: |
Write_signal : PROCESS (clk_D1, rst_n) |
VARIABLE FF1 : std_logic; |
BEGIN -- PROCESS Write_signal |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
FF1 := '0'; |
WriteByte_D1 <= '0'; |
ack_i <= '0'; |
ELSIF clk_D1'event AND clk_D1 = '1' THEN -- rising clock edge |
ack_i <= FF1; |
WriteByte_D1 <= FF1; |
FF1 := WriteByte_D2; |
END IF; |
END PROCESS Write_signal; |
|
-- purpose: ack signal |
-- type : sequential |
-- inputs : clk_D2, rst_n |
-- outputs: |
ack_signal : PROCESS (clk_D2, rst_n) |
VARIABLE FF1 : std_logic; |
BEGIN -- PROCESS ack_signal |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
FF1 := '0'; |
ack <= '0'; |
ELSIF clk_D2'event AND clk_D2 = '1' THEN -- rising clock edge |
ack <= FF1; |
FF1 := ack_i; |
END IF; |
END PROCESS ack_signal; |
|
-- purpose: Abort Frame signal |
-- type : sequential |
-- inputs : clk_D1, rst_n |
-- outputs: |
AbortFrame_signal : PROCESS (clk_D1, rst_n) |
VARIABLE FF1 : std_logic; |
BEGIN -- PROCESS AbortFrame_signal |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
FF1 := '0'; |
AbortFrame_D1 <= '0'; |
ELSIF clk_D1'event AND clk_D1 = '1' THEN -- rising clock edge |
AbortFrame_D1 <= FF1; |
FF1 := AbortFrame_D2; |
END IF; |
END PROCESS AbortFrame_signal; |
|
-- purpose: Valid Frame signal |
-- type : sequential |
-- inputs : clk_D1, rst_n |
-- outputs: |
ValidFrame_signal : PROCESS (clk_D1, rst_n) |
VARIABLE FF1 : std_logic; |
BEGIN -- PROCESS ValidFrame_signal |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
FF1 := '0'; |
ValidFrame_D1 <= '0'; |
ELSIF clk_D1'event AND clk_D1 = '1' THEN -- rising clock edge |
ValidFrame_D1 <= FF1; |
FF1 := ValidFrame_D2; |
END IF; |
END PROCESS ValidFrame_signal; |
|
-- purpose: Aborted Trans signal |
-- type : sequential |
-- inputs : clk_D2, rst_n |
-- outputs: |
AbortedTrans_signal : PROCESS (clk_D2, rst_n) |
VARIABLE FF1 : std_logic; |
BEGIN -- PROCESS AbortedTrans_signal |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
FF1 := '0'; |
AbortedTrans_D2 <= '0'; |
ELSIF clk_D2'event AND clk_D2 = '1' THEN -- rising clock edge |
AbortedTrans_D2 <= FF1; |
FF1 := AbortedTrans_D1; |
END IF; |
END PROCESS AbortedTrans_signal; |
|
END TxSynch_rtl; |
/hdlc.vhd
0,0 → 1,303
------------------------------------------------------------------------------- |
-- Title : HDLC core |
-- Project : HDLC Standalone controller with buffers |
------------------------------------------------------------------------------- |
-- File : hdlc.vhd |
-- Author : Jamil Khatib (khatib@ieee.org) |
-- Organization: OpenCores Project |
-- Created :2001/03/022 |
-- Last update: 2001/03/22 |
-- Platform : |
-- Simulators : Modelsim 5.3XE/Windows98,NC-SIM/Linux |
-- Synthesizers: |
-- Target : |
-- Dependency : ieee.std_logic_1164 |
-- hdlc.hdlc_components_pkg |
------------------------------------------------------------------------------- |
-- Description: HDLC controller |
------------------------------------------------------------------------------- |
-- Copyright (c) 2000 Jamil Khatib |
-- |
-- This VHDL design file is an open design; you can redistribute it and/or |
-- modify it and/or implement it after contacting the author |
-- You can check the draft license at |
-- http://www.opencores.org/OIPC/license.shtml |
|
------------------------------------------------------------------------------- |
-- Revisions : |
-- Revision Number : 1 |
-- Version : 0.1 |
-- Date : 22 March 2001 |
-- Modifier : Jamil Khatib (khatib@ieee.org) |
-- Desccription : Created |
-- ToOptimize : |
-- Bugs : |
------------------------------------------------------------------------------- |
-- $Log: not supported by cvs2svn $ |
-- Revision 1.3 2001/04/22 20:08:16 jamil |
-- Top level simulation |
-- |
-- Revision 1.1 2001/03/22 21:58:01 jamil |
-- Initial release |
-- |
------------------------------------------------------------------------------- |
LIBRARY ieee; |
USE ieee.std_logic_1164.ALL; |
|
LIBRARY hdlc; |
USE hdlc.hdlc_components_pkg.ALL; |
|
ENTITY hdlc_ent IS |
GENERIC ( |
FCS_TYPE : INTEGER := 2; -- FCS 16 |
ADD_WIDTH : INTEGER := 7); -- Internal buffer address width |
PORT ( |
Txclk : IN STD_LOGIC; -- Tx Clock |
RxClk : IN STD_LOGIC; -- Rx Clock |
Tx : OUT STD_LOGIC; -- Tx setial line |
Rx : IN STD_LOGIC; -- Rx serial line |
TxEN : IN STD_LOGIC; -- Tx Enable |
RxEn : IN STD_LOGIC; -- Rx Enable |
RST_I : IN STD_LOGIC; -- WB reset |
CLK_I : IN STD_LOGIC; -- WB clock |
ADR_I : IN STD_LOGIC_VECTOR(2 DOWNTO 0); -- WB address |
DAT_O : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); -- WB output data |
DAT_I : IN STD_LOGIC_VECTOR(31 DOWNTO 0); -- WB input data |
WE_I : IN STD_LOGIC; -- WB write/read signal |
STB_I : IN STD_LOGIC; -- WB strobe |
ACK_O : OUT STD_LOGIC; -- WB acknowledge |
CYC_I : IN STD_LOGIC; -- WB cycle |
RTY_O : OUT STD_LOGIC; -- WB Retry |
TAG0_O : OUT STD_LOGIC; -- WB TAG (TxDone interrupt) |
TAG1_O : OUT STD_LOGIC); -- WB TAG (RxReady interrupt) |
|
END hdlc_ent; |
|
ARCHITECTURE hdlc_str OF hdlc_ent IS |
SIGNAL rst_n : STD_LOGIC; -- Internal Reset |
|
SIGNAL Tx_rdy_D1 : STD_LOGIC; -- Tx rdy signal (Domain 1) |
SIGNAL Tx_rdy_D2 : STD_LOGIC; -- Tx rdy signal (Domain 2) |
SIGNAL Tx_ack : STD_LOGIC; -- Tx Acknowledge signal |
SIGNAL TXD_D1 : STD_LOGIC_VECTOR(7 DOWNTO 0); -- Tx Data bus (Domain 1) |
SIGNAL TXD_D2 : STD_LOGIC_VECTOR(7 DOWNTO 0); -- Tx Data Bus (Domain 2) |
SIGNAL Tx_ValidFrame_D1 : STD_LOGIC; -- Tx Valid Frame (Domain 1) |
SIGNAL Tx_ValidFrame_D2 : STD_LOGIC; -- Tx Valid Frame (Domain 2) |
SIGNAL Tx_AbortedTrans_D1 : STD_LOGIC; -- Tx Aborted Transmission (Domain 1) |
SIGNAL Tx_AbortedTrans_D2 : STD_LOGIC; -- Tx Aborted Transmission (Domain 2) |
SIGNAL Tx_AbortFrame_D1 : STD_LOGIC; -- Tx Abort Frame (Domain 1) |
SIGNAL Tx_AbortFrame_D2 : STD_LOGIC; -- Tx Abort Frame (Domain 2) |
SIGNAL Tx_WriteByte_D1 : STD_LOGIC; -- Tx Write bytes (Domain 1) |
SIGNAL Tx_WriteByte_D2 : STD_LOGIC; -- Tx Write Byte (Domain 2) |
|
SIGNAL Rx_ValidFrame_D1 : STD_LOGIC; -- Rx Valid Frame (Domain1) |
SIGNAL Rx_ValidFrame_D2 : STD_LOGIC; -- Rx Valid Frame (Domain 2) |
|
SIGNAL RxD_D1 : STD_LOGIC_VECTOR(7 DOWNTO 0); -- Rx Data bus (Domain 1) |
SIGNAL RXD_D2 : STD_LOGIC_VECTOR(7 DOWNTO 0); -- Rx data bus (Domain 2) |
|
SIGNAL Rx_FrameError_D1 : STD_LOGIC; -- Rx Frame Error (Domain 1) |
SIGNAL Rx_FrameError_D2 : STD_LOGIC; -- Rx Frame Error (Domain 2) |
|
SIGNAL Rx_AbortSignal_D1 : STD_LOGIC; -- Rx Abort signal (Domain 1) |
SIGNAL Rx_AbortSignal_D2 : STD_LOGIC; -- Rx Abort signal (Domain 2) |
|
SIGNAL Rx_Readbyte_D1 : STD_LOGIC; -- Rx Read Byte (Domain 1) |
SIGNAL Rx_Readbyte_D2 : STD_LOGIC; -- Rx Read Byte (Domain 2) |
|
SIGNAL Rx_rdy_D1 : STD_LOGIC; -- Rx rdy (Domain 1) |
SIGNAL Rx_rdy_D2 : STD_LOGIC; -- Rx rdy (Domain 2) |
|
|
SIGNAL TxDataAvail : STD_LOGIC; -- Tx Data Available from the Buffer |
SIGNAL Tx_RdBuff : STD_LOGIC; -- Tx Read Byte from the buffer |
SIGNAL TxDone : STD_LOGIC; -- TxDone bit (Interrupt) |
SIGNAL TxEnable : STD_LOGIC; -- TxEnable Bit |
SIGNAL Tx_Full : STD_LOGIC; -- Tx Full Buffer Bit |
SIGNAL TxDataInBuff : STD_LOGIC_VECTOR(7 DOWNTO 0); |
-- Tx input data to buffer |
SIGNAL TxDataOutBuff : STD_LOGIC_VECTOR(7 DOWNTO 0); -- Tx Data output from buffer |
SIGNAL Tx_Wr_Buff : STD_LOGIC; -- Write to Tx Buffer |
|
SIGNAL FCSen : STD_LOGIC; -- FCS Enable (both Tx & Rx) |
|
SIGNAL Rx_WrBuff : STD_LOGIC; -- Write to Rx Buffer |
SIGNAL Rx_EOF : STD_LOGIC; -- RX End Of Frame |
SIGNAL Rx_FrameSize : STD_LOGIC_VECTOR(ADD_WIDTH-1 DOWNTO 0); |
-- Rx Frame size |
SIGNAL Rx_DataBuff : STD_LOGIC_VECTOR(7 DOWNTO 0); -- Rx Input data buffer |
SIGNAL Rx_Buff_Overflow : STD_LOGIC; -- Rx Buffer overflow |
SIGNAL Rx_FCSerr : STD_LOGIC; -- Rx FCS error |
SIGNAL RxDataBuffOut : STD_LOGIC_VECTOR(7 DOWNTO 0); -- Rx Data BUFFER output |
|
SIGNAL Rx_Rd_Buff : STD_LOGIC; -- Rx Read Data Buffer |
SIGNAL RxRdy_int : STD_LOGIC; -- Rx Ready interrupt |
|
BEGIN -- hdlc_str |
|
rst_n <= NOT RST_I; |
|
WB_host : WB_IF_ent |
GENERIC MAP ( |
ADD_WIDTH => ADD_WIDTH) |
PORT MAP ( |
CLK_I => CLK_I, |
RST_I => RST_I, |
ACK_O => ACK_O, |
ADR_I => ADR_I, |
CYC_I => CYC_I, |
DAT_I => DAT_I, |
DAT_O => DAT_O, |
RTY_O => RTY_O, |
STB_I => STB_I, |
WE_I => WE_I, |
TAG0_O => TAG0_O, |
TAG1_O => TAG1_O, |
TxEnable => TxEnable, |
TxDone => TxDone, |
TxDataInBuff => TxDataInBuff, |
Txwr => Tx_Wr_Buff, |
TxAborted => Tx_AbortedTrans_D2, |
TxAbort => Tx_AbortFrame_D2, |
TxOverflow => Tx_Full, |
TxFCSen => FCSen, |
RxFrameSize => Rx_FrameSize, |
RxRdy => RxRdy_int, |
RxDataBuffOut => RxDataBuffOut, |
RxOverflow => Rx_Buff_Overflow, |
RxFrameError => Rx_FrameError_D2, |
RxFCSErr => Rx_FCSErr, |
RxRd => Rx_Rd_Buff, |
RxAbort => Rx_AbortSignal_D2); |
|
TxSynch : txSynch_ent |
PORT MAP ( |
rst_n => rst_n, |
clk_D1 => Txclk, |
clk_D2 => CLK_I, |
rdy_D1 => Tx_rdy_D1, |
rdy_D2 => Tx_rdy_D2, |
ack => Tx_ack, |
TXD_D1 => TXD_D1, |
TXD_D2 => TXD_D2, |
ValidFrame_D1 => Tx_ValidFrame_D1, |
ValidFrame_D2 => Tx_ValidFrame_D2, |
AbortedTrans_D1 => Tx_AbortedTrans_D1, |
AbortedTrans_D2 => Tx_AbortedTrans_D2, |
AbortFrame_D1 => Tx_AbortFrame_D1, |
AbortFrame_D2 => Tx_AbortFrame_D2, |
WriteByte_D1 => Tx_WriteByte_D1, |
WriteByte_D2 => Tx_WriteByte_D2); |
|
TxBuff : TxBuff_ent |
GENERIC MAP ( |
ADD_WIDTH => ADD_WIDTH) |
PORT MAP ( |
TxClk => CLK_I, |
rst_n => rst_n, |
RdBuff => Tx_RdBuff, |
Wr => Tx_Wr_Buff, |
TxDataAvail => TxDataAvail, |
TxEnable => TxEnable, |
TxDone => TxDone, |
TxDataOutBuff => TxDataOutBuff, |
TxDataInBuff => TxDataInBuff, |
Full => Tx_Full); |
|
TxFCS : Txfcs_ent |
GENERIC MAP ( |
FCS_TYPE => FCS_TYPE) |
PORT MAP ( |
TxClk => CLK_I, |
rst_n => rst_n, |
FCSen => FCSen, |
ValidFrame => Tx_ValidFrame_D2, |
WriteByte => Tx_WriteByte_D2, |
rdy => Tx_rdy_D2, |
ack => Tx_ack, |
TxData => TXD_D2, |
TxDataAvail => TxDataAvail, |
RdBuff => Tx_RdBuff, |
TxDataBuff => TxDataOutBuff); |
|
|
TxCore : TxChannel_ent |
PORT MAP ( |
TxClk => TxClk, |
rst_n => rst_n, |
TXEN => TXEN, |
Tx => Tx, |
ValidFrame => Tx_ValidFrame_D1, |
AbortFrame => Tx_AbortFrame_D1, |
AbortedTrans => Tx_AbortedTrans_D1, |
WriteByte => Tx_WriteByte_D1, |
rdy => Tx_rdy_D1, |
TxData => TxD_D1); |
|
RxChannel : RxChannel_ent |
PORT MAP ( |
Rxclk => Rxclk, |
rst => rst_n, |
Rx => Rx, |
RxData => RxD_D1, |
ValidFrame => Rx_ValidFrame_D1, |
FrameError => Rx_FrameError_D1, |
AbortSignal => Rx_AbortSignal_D1, |
Readbyte => Rx_Readbyte_D1, |
rdy => Rx_rdy_D1, |
RxEn => RxEn); |
|
|
RxSynch : RxSynch_ent |
PORT MAP ( |
rst_n => rst_n, |
clk_D1 => Rxclk, |
clk_D2 => CLK_I, |
rdy_D1 => Rx_rdy_D1, |
rdy_D2 => Rx_rdy_D2, |
RXD_D1 => RxD_D1, |
RXD_D2 => RXD_D2, |
ValidFrame_D1 => Rx_ValidFrame_D1, |
ValidFrame_D2 => Rx_ValidFrame_D2, |
AbortSignal_D1 => Rx_AbortSignal_D1, |
AbortSignal_D2 => Rx_AbortSignal_D2, |
FrameError_D1 => Rx_FrameError_D1, |
FrameError_D2 => Rx_FrameError_D2, |
ReadByte_D1 => Rx_ReadByte_D1, |
ReadByte_D2 => Rx_ReadByte_D2); |
|
RxBuff : RxBuff_ent |
GENERIC MAP ( |
FCS_TYPE => FCS_TYPE, |
ADD_WIDTH => ADD_WIDTH) |
PORT MAP ( |
Clk => CLK_I, |
rst_n => rst_n, |
DataBuff => Rx_DataBuff, |
EOF => Rx_EOF, |
WrBuff => Rx_WrBuff, |
FrameSize => Rx_FrameSize, |
RxRdy => RxRdy_int, |
RxDataBuffOut => RxDataBuffOut, |
Overflow => Rx_Buff_Overflow, |
Rd => Rx_Rd_Buff); |
|
|
RxFCS : RxFCS_ent |
GENERIC MAP ( |
FCS_TYPE => FCS_TYPE) |
PORT MAP ( |
clk => CLK_I, |
rst_n => rst_n, |
RxD => RxD_D2, |
ValidFrame => Rx_ValidFrame_D2, |
rdy => Rx_rdy_D2, |
Readbyte => Rx_Readbyte_D2, |
DataBuff => Rx_DataBuff, |
WrBuff => Rx_WrBuff, |
EOF => Rx_EOF, |
FCSen => FCSen, |
FCSerr => Rx_FCSerr); |
|
|
END hdlc_str; |
/RxBuff.vhd
0,0 → 1,266
------------------------------------------------------------------------------ |
-- Title : HDLC Rx Buffer |
-- Project : HDLC controller |
------------------------------------------------------------------------------- |
-- File : RxBuff.vhd |
-- Author : Jamil Khatib <khatib@ieee.org> |
-- Organization: OpenIPCore Project |
-- Created : 2001/04/06 |
-- Last update: 2001/04/25 |
-- Platform : |
-- Simulators : Modelsim/Windows98, NC-sim/Linux |
-- Synthesizers: |
-- Target : |
-- Dependency : ieee.std_logic_1164 |
-- memLib.mem_pkg |
------------------------------------------------------------------------------- |
-- Description: HDLC Receive Buffer |
------------------------------------------------------------------------------- |
-- Copyright (c) 2001 Jamil Khatib |
-- |
-- This VHDL design file is an open design; you can redistribute it and/or |
-- modify it and/or implement it after contacting the author |
-- You can check the draft license at |
-- http://www.opencores.org/OIPC/license.shtml |
------------------------------------------------------------------------------- |
-- Revisions : |
-- Revision Number : 1 |
-- Version : 0.1 |
-- Date : 2001/04/06 |
-- Modifier : Jamil Khatib <khatib@ieee.org> |
-- Desccription : Created |
-- ToOptimize : |
-- Known Bugs : |
------------------------------------------------------------------------------- |
-- $Log: not supported by cvs2svn $ |
-- Revision 1.3 2001/04/27 18:21:59 jamil |
-- After Prelimenray simulation |
-- |
-- Revision 1.2 2001/04/22 20:08:16 jamil |
-- Top level simulation |
-- |
-- Revision 1.1 2001/04/14 15:02:25 jamil |
-- Initial Release |
-- |
------------------------------------------------------------------------------- |
LIBRARY ieee; |
USE ieee.std_logic_1164.ALL; |
USE ieee.std_logic_unsigned.ALL; |
|
LIBRARY memLib; |
USE memLib.mem_Pkg.ALL; |
|
ENTITY RxBuff_ent IS |
|
GENERIC ( |
FCS_TYPE : INTEGER := 2; -- 2 = FCS 16 |
-- 4 = FCS 32 |
-- 0 = FCS disabled |
ADD_WIDTH : INTEGER := 7); -- Internal Address width |
|
PORT ( |
Clk : IN STD_LOGIC; -- System Clock |
rst_n : IN STD_LOGIC; -- System reset |
DataBuff : IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- Rx Data |
EOF : IN STD_LOGIC; -- End of Frame pulse |
WrBuff : IN STD_LOGIC; -- Write buffer |
FrameSize : OUT STD_LOGIC_VECTOR(ADD_WIDTH-1 DOWNTO 0); -- Frame Length |
RxRdy : OUT STD_LOGIC; -- Rx Ready |
RxDataBuffOut : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- Output Rx Buffer |
Overflow : OUT STD_LOGIC; -- Buffer Overflow |
Rd : IN STD_LOGIC); -- Read buffer |
|
END RxBuff_ent; |
|
|
ARCHITECTURE RxBuff_rtl OF RxBuff_ent IS |
|
SIGNAL load_FrSize : STD_LOGIC; -- Load Frame Size |
SIGNAL en_Count : STD_LOGIC; -- Enable Counter |
|
SIGNAL Data_In_i : STD_LOGIC_VECTOR(7 DOWNTO 0); |
-- Internal Data in |
SIGNAL Data_Out_i : STD_LOGIC_VECTOR(7 DOWNTO 0); |
-- Internal Data out |
CONSTANT MAX_ADDRESS : STD_LOGIC_VECTOR(ADD_WIDTH-1 DOWNTO 0) := (OTHERS => '1'); |
-- MAX Address |
|
SIGNAL Count : STD_LOGIC_VECTOR(ADD_WIDTH-1 DOWNTO 0); -- Counter |
SIGNAL rst_count : STD_LOGIC; -- Reset Counter |
|
SIGNAL cs : STD_LOGIC := '1'; -- dummy signal |
|
SIGNAL WR_i : STD_LOGIC; -- Internal Read/Write signal |
SIGNAL Address : STD_LOGIC_VECTOR(ADD_WIDTH-1 DOWNTO 0); |
-- Internal Address bus |
SIGNAL FrameSize_i : STD_LOGIC_VECTOR(ADD_WIDTH-1 DOWNTO 0); |
-- Internal Frame Size |
SIGNAL Overflow_i : STD_LOGIC; -- Internal Overflow |
SIGNAL RxRdy_i : STD_LOGIC; -- Internal RxRdy |
|
TYPE states_typ IS (IDLE_st, WRITE_st, READ_st); -- states types |
|
SIGNAL p_state : states_typ; -- Present state |
SIGNAL n_state : states_typ; -- Next State |
|
|
BEGIN -- RxBuff_rtl |
------------------------------------------------------------------------------- |
|
Data_In_i <= DataBuff; |
RxDataBuffOut <= Data_Out_i; |
|
------------------------------------------------------------------------------- |
-- Full <= '1' WHEN Address = MAX_ADDRESS ELSE '0'; |
Address <= Count; |
|
------------------------------------------------------------------------------- |
-- purpose: Byte counter |
-- type : sequential |
-- inputs : Clk, rst_n |
-- outputs: |
counter_proc : PROCESS (Clk, rst_n) |
BEGIN -- process counter_proc |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
count <= (OTHERS => '0'); |
ELSIF Clk'event AND Clk = '1' THEN -- rising clock edge |
IF rst_count = '1' THEN -- Synchronouse Reset (active high) |
count <= (OTHERS => '0'); |
ELSIF en_Count = '1' THEN |
count <= count +1; |
END IF; |
END IF; |
END PROCESS counter_proc; |
------------------------------------------------------------------------------- |
-- purpose: Frame Size register |
-- type : sequential |
-- inputs : Clk, rst_n |
-- outputs: |
FrameSize_reg : PROCESS (Clk, rst_n) |
BEGIN -- process FrameSize_reg |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
FrameSize <= (OTHERS => '0'); |
FrameSize_i <= (OTHERS => '0'); |
ELSIF Clk'event AND Clk = '1' THEN -- rising clock edge |
IF load_FrSize = '1' THEN |
FrameSize <= address - FCS_TYPE; |
FrameSize_i <= address - FCS_TYPE; |
END IF; |
END IF; |
END PROCESS FrameSize_reg; |
------------------------------------------------------------------------------- |
|
-- purpose: fsm process |
-- type : sequential |
-- inputs : Clk, rst_n |
-- outputs: |
fsm_proc : PROCESS (Clk, rst_n) |
BEGIN -- process fsm_proc |
IF rst_n = '0' THEN -- asynchronous reset (active low) |
p_state <= IDLE_st; |
Overflow <= '0'; |
RxRdy <= '0'; |
ELSIF Clk'event AND Clk = '1' THEN -- rising clock edge |
p_state <= n_state; |
Overflow <= Overflow_i; |
RxRdy <= RxRdy_i; |
END IF; |
END PROCESS fsm_proc; |
------------------------------------------------------------------------------- |
-- purpose: FSM Combinational logic |
-- type : combinational |
-- inputs : p_state,WrBuff,Rd |
-- outputs: |
ReadWrite : PROCESS (p_state, WrBuff, Rd, EOF, FrameSize_i, address) |
|
BEGIN -- PROCESS ReadWrite |
|
CASE p_state IS |
|
WHEN IDLE_st => |
RxRdy_i <= '0'; |
load_FrSize <= '0'; |
wr_i <= NOT WrBuff; |
Overflow_i <= '0'; |
IF WrBuff = '1' THEN |
n_state <= WRITE_st; |
en_Count <= '1'; |
rst_count <= '0'; |
ELSE |
n_state <= IDLE_st; |
en_Count <= '0'; |
rst_count <= '1'; |
END IF; |
|
WHEN WRITE_st => |
IF (Address = MAX_ADDRESS) THEN |
Overflow_i <= '1'; |
ELSE |
Overflow_i <= '0'; |
END IF; |
|
|
-- RxRdy_i <= '0'; |
wr_i <= NOT WrBuff; |
en_Count <= WrBuff; |
|
IF (EOF = '1') OR (address = MAX_ADDRESS) THEN |
RxRdy_i <= '1'; |
n_state <= READ_st; |
load_FrSize <= '1'; |
rst_count <= '1'; |
ELSE |
RxRdy_i <= '0'; |
n_state <= WRITE_st; |
load_FrSize <= '0'; |
rst_count <= '0'; |
END IF; |
|
WHEN READ_st => |
|
wr_i <= '1'; |
en_Count <= Rd; |
load_FrSize <= '0'; |
|
IF address = FrameSize_i THEN |
Overflow_i <= '0'; |
RxRdy_i <= '0'; |
n_state <= IDLE_st; |
rst_count <= '1'; |
ELSE |
IF (WrBuff = '1') THEN |
Overflow_i <= '1'; |
n_state <= WRITE_st; |
rst_count <= '1'; |
ELSE |
Overflow_i <= '0'; |
n_state <= READ_st; |
rst_count <= '0'; |
END IF; |
RxRdy_i <= '1'; |
|
END IF; |
|
END CASE; |
|
END PROCESS ReadWrite; |
|
|
Buff : Spmem_ent |
GENERIC MAP ( |
USE_RESET => FALSE, |
USE_CS => FALSE, |
DEFAULT_OUT => '1', |
OPTION => 0, |
ADD_WIDTH => ADD_WIDTH, |
WIDTH => 8) |
PORT MAP ( |
cs => cs, |
clk => clk, |
reset => rst_n, |
add => Address, |
Data_In => Data_In_i, |
Data_Out => Data_Out_i, |
WR => WR_i); |
|
END RxBuff_rtl; |
/TxBuff.vhd
0,0 → 1,249
------------------------------------------------------------------------------- |
-- Title : Tx buffer |
-- Project : HDLC controller |
------------------------------------------------------------------------------- |
-- File : TxBuff.vhd |
-- Author : Jamil Khatib (khatib@ieee.org) |
-- Organization: OpenIPCore Project |
-- Created :2001/03/08 |
-- Last update: 2001/03/18 |
-- Platform : |
-- Simulators : Modelsim 5.3XE/Windows98,NC-SIM/Linux |
-- Synthesizers: |
-- Target : |
-- Dependency : ieee.std_logic_1164 |
-- memLib.mem_pkg |
------------------------------------------------------------------------------- |
-- Description: HDLC controller |
------------------------------------------------------------------------------- |
-- Copyright (c) 2000 Jamil Khatib |
-- |
-- This VHDL design file is an open design; you can redistribute it and/or |
-- modify it and/or implement it after contacting the author |
-- You can check the draft license at |
-- http://www.opencores.org/OIPC/license.shtml |
|
------------------------------------------------------------------------------- |
-- Revisions : |
-- Revision Number : 1 |
-- Version : 0.1 |
-- Date : 8 March 2001 |
-- Modifier : Jamil Khatib (khatib@ieee.org) |
-- Desccription : Created |
-- ToOptimize : |
-- Bugs : |
------------------------------------------------------------------------------- |
-- $Log: not supported by cvs2svn $ |
-- Revision 1.1 2001/03/21 20:19:43 jamil |
-- Initial Release |
-- |
------------------------------------------------------------------------------- |
|
library ieee; |
use ieee.std_logic_1164.all; |
use ieee.std_logic_unsigned.all; |
|
library memLib; |
use memLib.mem_pkg.all; |
|
entity TxBuff_ent is |
generic ( |
ADD_WIDTH : integer := 7); -- Internal address width |
|
port ( |
TxClk : in std_logic; -- Tx Clock |
rst_n : in std_logic; -- System reset |
RdBuff : in std_logic; -- Read byte |
Wr : in std_logic; -- Write Byte |
TxDataAvail : out std_logic; -- Data Available to be read |
TxEnable : in std_logic; -- TxEnable (Write Frame completed) |
TxDone : out std_logic; -- Transmission Done (Read Frame completed) |
TxDataOutBuff : out std_logic_vector(7 downto 0); -- Output Data |
TxDataInBuff : in std_logic_vector(7 downto 0); -- Input Data |
Full : out std_logic); -- Full Buffer (no more write is allowed) |
|
end TxBuff_ent; |
------------------------------------------------------------------------------- |
|
architecture TxBuff_beh of TxBuff_ent is |
|
signal WR_i : std_logic; -- Internal Read/Write signal |
signal Address : std_logic_vector(ADD_WIDTH-1 downto 0); |
-- Internal Address bus |
type states_typ is (IDLE_typ, WRITE_typ, READ_typ); -- states types |
|
signal p_state : states_typ; -- Present state |
signal n_state : states_typ; -- Next State |
|
signal FrameSize : std_logic_vector(ADD_WIDTH-1 downto 0); -- Frame Size |
signal load_FrSize : std_logic; -- Load Frame Size |
signal en_Count : std_logic; -- Enable Counter |
|
signal Data_In_i : std_logic_vector(7 downto 0); |
-- Internal Data in |
signal Data_Out_i : std_logic_vector(7 downto 0); |
-- Internal Data out |
constant MAX_ADDRESS : std_logic_vector(ADD_WIDTH-1 downto 0) := (others => '1'); |
-- MAX Address |
|
signal Count : std_logic_vector(ADD_WIDTH-1 downto 0); -- Counter |
signal rst_count : std_logic; -- Reset Counter |
|
signal cs_i : std_logic := '1'; -- Internal chip select |
begin -- TxBuff_beh |
|
Spmem_core : Spmem_ent |
generic map ( |
USE_RESET => false, |
USE_CS => false, |
DEFAULT_OUT => '0', |
OPTION => 0, |
ADD_WIDTH => ADD_WIDTH, |
WIDTH => 8) |
port map ( |
cs => cs_i, |
clk => TxClk, |
reset => rst_n, |
add => Address, |
Data_In => Data_In_i, |
Data_Out => Data_Out_i, |
WR => WR_i); |
------------------------------------------------------------------------------- |
|
Data_In_i <= TxDataInBuff; |
TxDataOutBuff <= Data_Out_i; |
|
------------------------------------------------------------------------------- |
Full <= '1' when Address = MAX_ADDRESS else '0'; |
Address <= Count; |
|
------------------------------------------------------------------------------- |
-- purpose: Byte counter |
-- type : sequential |
-- inputs : TxClk, rst_n |
-- outputs: |
counter_proc : process (TxClk, rst_n) |
-- variable count : std_logic_vector(ADD_WIDTH-1 downto 0); -- Counter |
begin -- process counter_proc |
if rst_n = '0' then -- asynchronous reset (active low) |
|
count <= (others => '0'); |
|
elsif TxClk'event and TxClk = '1' then -- rising clock edge |
if rst_count = '1' then |
count <= (others => '0'); |
elsif en_Count = '1' then |
count <= count +1; |
end if; |
|
end if; |
end process counter_proc; |
------------------------------------------------------------------------------- |
-- purpose: Frame Size register |
-- type : sequential |
-- inputs : TxClk, rst_n |
-- outputs: |
FrameSize_reg : process (TxClk, rst_n) |
begin -- process FrameSize_reg |
if rst_n = '0' then -- asynchronous reset (active low) |
FrameSize <= (others => '0'); |
|
elsif TxClk'event and TxClk = '1' then -- rising clock edge |
if load_FrSize = '1' then |
FrameSize <= address; |
end if; |
end if; |
end process FrameSize_reg; |
|
------------------------------------------------------------------------------- |
|
-- purpose: fsm process |
-- type : sequential |
-- inputs : TxClk, rst_n |
-- outputs: |
fsm_proc : process (TxClk, rst_n) |
begin -- process fsm_proc |
if rst_n = '0' then -- asynchronous reset (active low) |
|
p_state <= IDLE_typ; |
|
elsif TxClk'event and TxClk = '1' then -- rising clock edge |
p_state <= n_state; |
end if; |
end process fsm_proc; |
------------------------------------------------------------------------------- |
-- purpose: Read write machine |
-- type : combinational |
-- inputs : strobe |
-- outputs: |
read_write_proc : process (TxEnable, Wr, Address, p_state, RdBuff, FrameSize) |
|
begin -- process read_write_proc |
|
case p_state is |
|
when IDLE_typ => |
|
TxDone <= '1'; |
TxDataAvail <= '0'; |
load_FrSize <= '0'; |
|
wr_i <= not wr; |
|
|
if wr = '1' then |
n_state <= WRITE_typ; |
en_Count <= '1'; |
rst_count <= '0'; |
else |
n_state <= IDLE_typ; |
en_Count <= '0'; |
rst_count <= '1'; |
end if; |
|
when WRITE_typ => |
TxDone <= '0'; |
TxDataAvail <= '0'; |
|
wr_i <= not wr; |
en_Count <= wr; |
|
if (TxEnable = '1') or (address = MAX_ADDRESS) then |
|
n_state <= READ_typ; |
load_FrSize <= '1'; |
rst_count <= '1'; |
else |
n_state <= WRITE_typ; |
load_FrSize <= '0'; |
rst_count <= '0'; |
end if; |
|
when READ_typ => |
|
wr_i <= '1'; |
en_Count <= RdBuff; |
load_FrSize <= '0'; |
TxDataAvail <= '1'; |
|
if address = FrameSize then |
TxDone <= '1'; |
n_state <= IDLE_typ; |
rst_count <= '1'; |
else |
TxDone <= '0'; |
n_state <= READ_typ; |
rst_count <= '0'; |
end if; |
|
when others => |
wr_i <= '1'; |
en_Count <= '0'; |
load_FrSize <= '0'; |
TxDataAvail <= '0'; |
TxDone <= '0'; |
rst_count <= '1'; |
end case; |
|
end process read_write_proc; |
end TxBuff_beh; |