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

Subversion Repositories tdm

[/] [tdm/] [trunk/] [code/] [tdm_cont/] [core/] [TxTDMBuff.vhd] - Rev 6

Compare with Previous | Blame | View Log

-------------------------------------------------------------------------------
-- Title      : TDM controller Tx Buffer
-- Project    : TDM controller
-------------------------------------------------------------------------------
-- File       : TxTDMBuff.vhd
-- Author     : Jamil Khatib  <khatib@ieee.org>
-- Organization:  OpenCores.org
-- Created    : 2001/05/14
-- Last update:2001/05/22
-- Platform   : 
-- Simulators  : NC-sim/linux, Modelsim XE/windows98
-- Synthesizers: Leonardo
-- Target      : 
-- Dependency  : ieee.std_logic_1164,ieee.std_logic_unsigned
--               memLib.mem_pkg
-------------------------------------------------------------------------------
-- Description:  Transmit Buffer that uses internal Sram
-------------------------------------------------------------------------------
-- 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/05/15
-- Modifier        :  Jamil Khatib  <khatib@ieee.org>
-- Desccription    :  Created
-- ToOptimize      :
-- Known Bugs      : 
-------------------------------------------------------------------------------
-- $Log: not supported by cvs2svn $
-- Revision 1.1  2001/05/24 22:48:56  jamil
-- TDM Initial release
--
-------------------------------------------------------------------------------
 
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
 
LIBRARY memLib;
USE memLib.mem_pkg.ALL;
 
ENTITY TxTDMBuff IS
 
  PORT (
    CLK_I       : IN  STD_LOGIC;                     -- System Clock
    rst_n       : IN  STD_LOGIC;                     -- System reset
    TxD         : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Tx output data
    TxValidData : OUT STD_LOGIC;                     -- Tx Valid Data
    TxWrite     : OUT STD_LOGIC;                     -- Write byte
    TxRdy       : IN  STD_LOGIC;                     -- Ready to send data
 
    WrBuff       : IN  STD_LOGIC;       -- Write to buffer
    TxData       : IN  STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Tx Byte output from buffer
    NoChannels   : IN  STD_LOGIC_VECTOR(4 DOWNTO 0);  -- No of channels
    DropChannels : IN  STD_LOGIC_VECTOR(4 DOWNTO 0);  -- No of channels to be dropped
    TxDone       : OUT STD_LOGIC;       -- Transmission completed
    TxOverflow   : OUT STD_LOGIC        -- Tx buffer overflow
 
    );
 
END TxTDMBuff;
 
ARCHITECTURE TxTDMBuff_rtl OF TxTDMBuff IS
 
  TYPE States_type IS (IDLE_st, READ_st, WAITREAD_st, WRITE_st);  -- Buffer states
 
  SIGNAL Address : STD_LOGIC_VECTOR(4 DOWNTO 0);  -- memory address
 
  SIGNAL cs : STD_LOGIC := '1';         -- dummy signal
 
  SIGNAL wr_i    : STD_LOGIC;                     -- Read/Write signal
  SIGNAL Data_In : STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Memory Data in
 
  SIGNAL Data_Out : STD_LOGIC_VECTOR(7 DOWNTO 0);  -- Memory Data out
 
  SIGNAL TotalChannels : STD_LOGIC_VECTOR(4 DOWNTO 0);  -- Totoal Channels
 
BEGIN  -- TxTDMBuff_rtl
 
-------------------------------------------------------------------------------
  TxD           <= Data_Out;
  TotalChannels <= NoChannels - DropChannels;
 
-------------------------------------------------------------------------------
-- purpose: FSM process
-- type   : sequential
-- inputs : CLK_I, rst_n
-- outputs: 
  fsm : PROCESS (CLK_I, rst_n)
 
    VARIABLE state   : States_type;                   -- internal state
    VARIABLE counter : STD_LOGIC_VECTOR(4 DOWNTO 0);  -- Internal Counter
--    VARIABLE TxwriteDelayed : STD_LOGIC;            -- Delayed TxWrite
 
  BEGIN  -- PROCESS fsm
 
    IF rst_n = '0' THEN                 -- asynchronous reset (active low)
      state       := IDLE_st;
      TxWrite     <= '0';
      Counter     := "00000";
      TxValidData <= '0';
 
      TxOverflow <= '0';
 
      address <= (OTHERS => '0');
      Data_In <= (OTHERS => '0');
 
      TxDone <= '0';
      wr_i   <= '1';
 
    ELSIF CLK_I'event AND CLK_I = '1' THEN  -- rising clock edge
 
 
      CASE state IS
        WHEN IDLE_st =>
          TxValidData <= '0';
          TxOverflow  <= '0';
 
          Counter := "00000";
          address <= Counter;
          Data_In <= TxData;
 
          Txwrite <= '0';
          TxDone  <= '1';
 
          IF (WrBuff = '1') THEN
 
            state   := WRITE_st;
            Counter := Counter +1;
 
          END IF;
 
          wr_i <= NOT WrBuff;
 
          TxOverflow <= '0';
 
        WHEN READ_st =>
          TxValidData <= '1';
          TxDone      <= '0';
          TxOverflow  <= '0';
 
          wr_i    <= '1';
          Txwrite <= '0';
 
          address <= Counter;
 
          IF (TxRdy = '1') THEN
 
            state := WAITREAD_st;
 
          END IF;
 
        WHEN WAITREAD_st =>
          TxDone      <= '0';
          TxValidData <= '1';
          Txwrite     <= '1';
          TxOverflow  <= '0';
 
          address <= counter;
 
          wr_i <= '1';
 
          IF (TxRdy = '0') THEN
            IF (counter = TotalChannels) THEN             
 
              counter := (OTHERS => '0');
              state := IDLE_st;
 
              else
                counter := counter +1;
                state := READ_st;
            END IF;
 
          END IF;
 
        WHEN WRITE_st =>
          TxDone <= '0';
 
          TxValidData <= '0';
 
          TxOverflow <= '0';
 
          Txwrite <= '0';
 
          wr_i <= NOT WrBuff;
 
          address <= Counter;
          Data_In <= TxData;
 
          IF (counter = TotalChannels) THEN
 
            counter := "00000";
            state   := READ_st;
 
          ELSIF (WrBuff = '1') THEN
            counter := counter + 1;
          END IF;
 
 
        WHEN OTHERS => NULL;
      END CASE;
    END IF;
 
  END PROCESS fsm;
------------------------------------------------------------------------------
 
  Buff : Spmem_ent
    GENERIC MAP (
      USE_RESET   => FALSE,
      USE_CS      => FALSE,
      DEFAULT_OUT => '1',
      OPTION      => 0,
      ADD_WIDTH   => 5,
      WIDTH       => 8)
    PORT MAP (
      cs          => cs,
      clk         => clk_I,
      reset       => rst_n,
      add         => Address,
      Data_In     => Data_In,
      Data_Out    => Data_Out,
      WR          => WR_i);
 
END TxTDMBuff_rtl;
 
 
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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