⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 txfcs.vhd

📁 HDLC在通讯设备中占有重要地位
💻 VHD
字号:
--------------------------------------------------------------------------------- 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 bufferEND Txfcs_ent;ARCHITECTURE Txfcs_beh OF Txfcs_ent ISBEGIN  -- 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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -