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

📄 rxbuff.vhd

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

⌨️ 快捷键说明

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