OpenCores
URL https://opencores.org/ocsvn/hdlc/hdlc/trunk

Subversion Repositories hdlc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 12 to Rev 13
    Reverse comparison

Rev 12 → Rev 13

/trunk/CODE/TX/core/TXcont.vhd
6,7 → 6,7
-- Author : Jamil Khatib (khatib@ieee.org)
-- Organization: OpenIPCore Project
-- Created :2001/01/15
-- Last update: 2001/01/26
-- Last update: 2001/10/20
-- Platform :
-- Simulators : Modelsim 5.3XE/Windows98
-- Synthesizers:
34,182 → 34,157
-- Bugs :
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
entity TxCont_ent is
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY TxCont_ent IS
 
port (
TXclk : in std_logic; -- TX clock
rst_n : in std_logic; -- System Reset
TXEN : in std_logic; -- TX enable
enable : out std_logic; -- Enable control
BackendEnable : out std_logic; -- Backend Enable
abortedTrans : in std_logic; -- No Valid data from the backend
inProgress : in std_logic; -- Data in progress
ValidFrame : in std_logic; -- Valid Frame
Frame : out std_logic; -- Frame strobe
AbortFrame : in std_logic; -- AbortFrame
AbortTrans : out std_logic); -- Abort data transmission
PORT (
TXclk : IN STD_LOGIC; -- TX clock
rst_n : IN STD_LOGIC; -- System Reset
TXEN : IN STD_LOGIC; -- TX enable
enable : OUT STD_LOGIC; -- Enable control
BackendEnable : OUT STD_LOGIC; -- Backend Enable
abortedTrans : IN STD_LOGIC; -- No Valid data from the backend
inProgress : IN STD_LOGIC; -- Data in progress
ValidFrame : IN STD_LOGIC; -- Valid Frame
Frame : OUT STD_LOGIC; -- Frame strobe
AbortFrame : IN STD_LOGIC; -- AbortFrame
AbortTrans : OUT STD_LOGIC); -- Abort data transmission
 
end TxCont_ent;
END TxCont_ent;
-------------------------------------------------------------------------------
architecture TxCont_beh of TxCont_ent is
ARCHITECTURE TxCont_beh OF TxCont_ent IS
 
begin -- TxCont_beh
BEGIN -- TxCont_beh
 
-- purpose: Abort Machine
-- type : sequential
-- inputs : Txclk, rst_n
-- outputs:
abort_proc : process (Txclk, rst_n)
abort_proc : PROCESS (Txclk, rst_n)
 
variable counter : integer range 0 to 14; -- Counter
VARIABLE counter : INTEGER RANGE 0 TO 14; -- Counter
 
variable state : std_logic; -- Internal State
VARIABLE state : STD_LOGIC; -- Internal State
-- state ==> '0' No abort signal
-- state ==> '1' Abort signal
begin -- process abort_proc
if rst_n = '0' then -- asynchronous reset (active low)
BEGIN -- process abort_proc
IF rst_n = '0' THEN -- asynchronous reset (active low)
AbortTrans <= '0';
Counter := 0;
enable <= '1';
state := '0';
elsif Txclk'event and Txclk = '1' then -- rising clock edge
if TXEN = '1' then
ELSIF Txclk'event AND Txclk = '1' THEN -- rising clock edge
IF TXEN = '1' THEN
 
case state is
CASE state IS
 
when '0' =>
if abortedTrans = '1' or AbortFrame = '1' then
WHEN '0' =>
IF abortedTrans = '1' OR AbortFrame = '1' THEN
state := '1';
Counter := 0;
end if;
END IF;
AbortTrans <= '0';
 
when '1' =>
if counter = 8 then
WHEN '1' =>
IF counter = 8 THEN
counter := 0;
if abortedTrans = '0' and AbortFrame = '0' then
IF abortedTrans = '0' AND AbortFrame = '0' THEN
 
state := '0';
AbortTrans <= '0';
else
ELSE
AbortTrans <= '1';
end if;
END IF;
 
else
ELSE
counter := counter +1;
end if; -- counter
END IF; -- counter
 
when others => null;
WHEN OTHERS => NULL;
 
end case;
end if; -- TXEN
END CASE;
END IF; -- TXEN
enable <= TXEN;
 
end if; -- TXclk
end process abort_proc;
END IF; -- TXclk
END PROCESS abort_proc;
 
-- purpose: Flag Controller
-- type : sequential
-- inputs : Txclk, rst_n
-- outputs:
Flag_proc : process (Txclk, rst_n)
Flag_proc : PROCESS (Txclk, rst_n)
 
variable state : std_logic_vector(2 downto 0); -- Internal State machine
variable counter : integer range 0 to 16; -- Internal counter
VARIABLE state : STD_LOGIC_VECTOR(2 DOWNTO 0); -- Internal State machine
VARIABLE counter : INTEGER RANGE 0 TO 16; -- Internal counter
 
begin -- process Flag_proc
if rst_n = '0' then -- asynchronous reset (active low)
Frame <= '0';
state := (others => '0');
BEGIN -- process Flag_proc
IF rst_n = '0' THEN -- asynchronous reset (active low)
Frame <= '0';
state := (OTHERS => '0');
counter := 0;
BackendEnable <= '1';
elsif Txclk'event and Txclk = '1' then -- rising clock edge
if TXEN = '1' then
BackendEnable <= '0';
ELSIF Txclk'event AND Txclk = '1' THEN -- rising clock edge
IF TXEN = '1' THEN
 
case state is
when "000" => -- Check Valid Frame
Frame <= '0';
if ValidFrame = '1' then
state := "001";
counter := 0;
end if;
BackendEnable <= '1';
CASE state IS
WHEN "000" => -- Check Valid Frame
Frame <= '0';
IF ValidFrame = '1' THEN
state := "001";
BackendEnable <= '1';
ELSE
BackendEnable <= '0';
END IF;
counter := 0;
 
when "001" => -- Wait 16 clks before set internal frame
counter := counter + 1;
WHEN "001" =>
 
if counter = 16 then
counter := 0;
IF counter > 1 AND inProgress = '0' THEN
state := "010";
Frame <= '1';
ELSE
Frame <= '0';
END IF;
 
if inProgress = '0' then
state := "010";
Frame <= '1';
else
state := "101";
Frame <= '0';
end if;
else
Frame <= '0';
end if;
BackendEnable <= '1';
IF inProgress = '0' THEN
counter := counter +1;
END IF;
 
when "101" => -- Wait for inProgress
 
if inProgress = '0' then
state := "010";
Frame <= '1';
else
Frame <= '0';
end if;
BackendEnable <= '1';
 
when "010" => -- Check ValidFrame
WHEN "010" => -- Check ValidFrame
 
Frame <= '1';
 
if ValidFrame = '0' then
IF ValidFrame = '0' THEN
state := "011";
counter := 0;
BackendEnable <= '0';
else
ELSE
BackendEnable <= '1';
end if;
END IF;
 
when "011" => -- wait 16 clk before trying to unset
-- internal frame
counter := counter + 1;
if counter = 16 then
counter := 0;
if inProgress = '0' then
state := "000";
Frame <= '0';
else
state := "100";
Frame <= '1';
end if;
else
Frame <= '1';
end if;
counter := 0;
 
BackendEnable <= '0';
 
when "100" =>
 
if inProgress = '0' then
WHEN "011" =>
IF counter > 2 AND inProgress = '0' THEN
state := "000";
Frame <= '0';
else
ELSE
Frame <= '1';
end if;
END IF;
 
IF inProgress = '0' THEN
counter := counter +1;
END IF;
 
BackendEnable <= '0';
 
when others => null;
end case;
end if; -- TXEN
end if;
end process Flag_proc;
WHEN OTHERS => NULL;
END CASE;
END IF; -- TXEN
END IF;
END PROCESS Flag_proc;
-------------------------------------------------------------------------------
end TxCont_beh;
END TxCont_beh;
/trunk/CODE/TX/core/zero_ins.vhd
6,7 → 6,7
-- Author : Jamil Khatib (khatib@ieee.org)
-- Organization: OpenIPCore Project
-- Created : 2001/01/12
-- Last update: 2001/05/27
-- Last update:2001/10/20
-- Platform :
-- Simulators : Modelsim 5.3XE/Windows98
-- Synthesizers:
40,37 → 40,40
-- Zero is inserted after 5 sequence of 1's insted of 6 1's
-------------------------------------------------------------------------------
-- $Log: not supported by cvs2svn $
-- Revision 1.2 2001/05/28 19:14:22 khatib
-- TX zero insertion bug fixed
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 
entity ZeroIns_ent is
ENTITY ZeroIns_ent IS
 
port (
TxClk : in std_logic; -- Tx clock
rst_n : in std_logic; -- system reset
enable : in std_logic; -- enable (Driven by controller)
inProgress : out std_logic; -- Data in progress
BackendEnable : in std_logic; -- Backend Enable
PORT (
TxClk : IN STD_LOGIC; -- Tx clock
rst_n : IN STD_LOGIC; -- system reset
enable : IN STD_LOGIC; -- enable (Driven by controller)
inProgress : OUT STD_LOGIC; -- Data in progress
BackendEnable : IN STD_LOGIC; -- Backend Enable
-- backend interface
abortedTrans : out std_logic; -- aborted Transmission
ValidFrame : in std_logic; -- Valid Frame signal
Writebyte : in std_logic; -- Back end write byte
rdy : out std_logic; -- data ready
TXD : out std_logic; -- TX serial data
Data : in std_logic_vector(7 downto 0)); -- TX data bus
abortedTrans : OUT STD_LOGIC; -- aborted Transmission
ValidFrame : IN STD_LOGIC; -- Valid Frame signal
Writebyte : IN STD_LOGIC; -- Back end write byte
rdy : OUT STD_LOGIC; -- data ready
TXD : OUT STD_LOGIC; -- TX serial data
Data : IN STD_LOGIC_VECTOR(7 DOWNTO 0)); -- TX data bus
 
end ZeroIns_ent;
END ZeroIns_ent;
-------------------------------------------------------------------------------
architecture zero_ins_beh of ZeroIns_ent is
ARCHITECTURE zero_ins_beh OF ZeroIns_ent IS
 
signal data_reg : std_logic_vector(7 downto 0); -- Data register (used as
SIGNAL data_reg : STD_LOGIC_VECTOR(7 DOWNTO 0); -- Data register (used as
-- internal buffer)
signal flag : std_logic; -- control signal between processes
signal delay_TX : std_logic; -- Delayed output
SIGNAL flag : STD_LOGIC; -- control signal between processes
SIGNAL delay_TX : STD_LOGIC; -- Delayed output
 
begin -- zero_ins_beh
BEGIN -- zero_ins_beh
 
 
-- purpose: Parallel to Serial
77,15 → 80,15
-- type : sequential
-- inputs : TxClk, rst_n
-- outputs:
P2S_proc : process (TxClk, rst_n)
variable tmp_reg : std_logic_vector(15 downto 0); -- Temp Shift register
variable counter : integer range 0 to 8; -- Counter
variable OnesDetected : std_logic; -- 6 ones detected
P2S_proc : PROCESS (TxClk, rst_n)
VARIABLE tmp_reg : STD_LOGIC_VECTOR(15 DOWNTO 0); -- Temp Shift register
VARIABLE counter : INTEGER RANGE 0 TO 8; -- Counter
VARIABLE OnesDetected : STD_LOGIC; -- 6 ones detected
 
begin -- process P2S_proc
if rst_n = '0' then -- asynchronous reset (active low)
BEGIN -- process P2S_proc
IF rst_n = '0' THEN -- asynchronous reset (active low)
 
tmp_reg := (others => '0');
tmp_reg := (OTHERS => '0');
Counter := 0;
flag <= '1';
OnesDetected := '0';
93,93 → 96,92
delay_TX <= '1';
inProgress <= '0';
 
elsif TxClk'event and TxClk = '1' then -- rising clock edge
if enable = '1' then
ELSIF TxClk'event AND TxClk = '1' THEN -- rising clock edge
IF enable = '1' THEN
 
OnesDetected := tmp_reg(0) and tmp_reg(1) and tmp_reg(2) and tmp_reg(3) and tmp_reg(4);
OnesDetected := tmp_reg(0) AND tmp_reg(1) AND tmp_reg(2) AND tmp_reg(3) AND tmp_reg(4);
 
delay_TX <= tmp_reg(0);
TXD <= delay_TX;
 
if OnesDetected = '1' then
IF OnesDetected = '1' THEN
-- Zero insertion
tmp_reg(4 downto 0) := '0' & tmp_reg(4 downto 1);
tmp_reg(4 DOWNTO 0) := '0' & tmp_reg(4 DOWNTO 1);
 
else
ELSE
-- Total Shift
tmp_reg(15 downto 0) := '0' & tmp_reg(15 downto 1);
tmp_reg(15 DOWNTO 0) := '0' & tmp_reg(15 DOWNTO 1);
 
Counter := Counter +1;
 
end if; -- ones detected
END IF; -- ones detected
 
if counter = 8 then
IF counter = 8 THEN
 
counter := 0;
flag <= '1';
inProgress <= '0';
 
tmp_reg(15 downto 8) := data_reg;
else
tmp_reg(15 DOWNTO 8) := data_reg;
ELSE
inProgress <= '1';
flag <= '0';
end if; -- counter
end if; -- enable
end if; -- clk
end process P2S_proc;
END IF; -- counter
END IF; -- enable
END IF; -- clk
END PROCESS P2S_proc;
-------------------------------------------------------------------------------
 
-- purpose: Baclend Interface
-- purpose: Backend Interface
-- type : sequential
-- inputs : TxClk, rst_n
-- outputs:
Backend_proc : process (TxClk, rst_n)
variable state : std_logic; -- Backend state
Backend_proc : PROCESS (TxClk, rst_n)
VARIABLE state : STD_LOGIC; -- Backend state
 
begin -- process Backend_proc
if rst_n = '0' then -- asynchronous reset (active low)
state := '0';
data_reg <= (others => '0');
rdy <= '0';
abortedTrans <= '0';
elsif TxClk'event and TxClk = '1' then -- rising clock edge
if enable = '1' then
if BackendEnable = '1' then
if ValidFrame = '1' then
BEGIN -- process Backend_proc
IF rst_n = '0' THEN -- asynchronous reset (active low)
state := '0';
data_reg <= (OTHERS => '0');
rdy <= '0';
abortedTrans <= '0';
ELSIF TxClk'event AND TxClk = '1' THEN -- rising clock edge
IF enable = '1' THEN
IF BackendEnable = '1' THEN
CASE state IS
WHEN '0' => -- wait for reading the register
IF flag = '1' THEN -- Register has been read
state := '1';
rdy <= '1';
data_reg <= "00000000"; -- set register to known pattern to
-- avoid invalid read (upon valid
-- read this value will be overwritten)
END IF;
 
case state is
when '0' => -- wait for reading the register
if flag = '1' then -- Register has been read
state := '1';
rdy <= '1';
data_reg <= "00000000"; -- set register to known pattern to
-- avoid invalid read (upon valid
-- read this value will be overwritten)
end if;
WHEN '1' =>
IF WriteByte = '1' THEN
state := '0';
rdy <= '0';
data_reg <= Data;
ELSIF flag = '1' THEN -- Another flag but without read
state := '0';
rdy <= '0';
data_reg <= "00000000";
abortedTrans <= '1';
END IF;
 
when '1' =>
if WriteByte = '1' then
state := '0';
rdy <= '0';
data_reg <= Data;
elsif flag = '1' then -- Another flag but without read
state := '0';
rdy <= '0';
data_reg <= "00000000";
abortedTrans <= '1';
end if;
WHEN OTHERS => NULL;
END CASE;
 
when others => null;
end case;
else
abortedTrans <= '0';
end if; -- ValidFrame
else
data_reg <= (others => '0');
end if; -- Backend enable
end if; -- enable
end if; -- Txclk
end process Backend_proc;
ELSE
rdy <= '0';
state := '0';
abortedTrans <= '0';
END IF; -- Backend enable
 
end zero_ins_beh;
END IF; -- enable
END IF; -- Txclk
END PROCESS Backend_proc;
 
 
END zero_ins_beh;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.