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

Subversion Repositories gbiteth

[/] [gbiteth/] [trunk/] [rtl/] [rgmii/] [rgmii_tx.vhd] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 axuan25268
-------------------------------------------------------------------------------
2
-- Title      : 
3
-- Project    : 
4
-------------------------------------------------------------------------------
5
-- File       : rgmii_tx.vhd
6
-- Author     : liyi  <alxiuyain@foxmail.com>
7
-- Company    : OE@HUST
8
-- Created    : 2012-11-15
9
-- Last update: 2013-05-07
10
-- Platform   : 
11
-- Standard   : VHDL'93/02
12
-------------------------------------------------------------------------------
13
-- Description: 
14
-------------------------------------------------------------------------------
15
-- Copyright (c) 2012 OE@HUST
16
-------------------------------------------------------------------------------
17
-- Revisions  :
18
-- Date        Version  Author  Description
19
-- 2012-11-15  1.0      root    Created
20
-------------------------------------------------------------------------------
21
LIBRARY ieee;
22
USE ieee.std_logic_1164.ALL;
23
USE ieee.numeric_std.ALL;
24
-------------------------------------------------------------------------------
25
ENTITY rgmii_tx IS
26
 
27
  PORT (
28
    iClk   : IN STD_LOGIC;
29
    iRst_n : IN STD_LOGIC;
30
 
31
    -- from fifo
32
    iTxData     : IN  STD_LOGIC_VECTOR(7 DOWNTO 0);
33
    oSOF        : OUT STD_LOGIC;
34
    iEOF        : IN  STD_LOGIC;
35
    iGenFrame   : IN  STD_LOGIC;
36
    oGenFrameAck : OUT STD_LOGIC;
37
 
38
    -- signals TO PHY
39
    oTxData : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
40
    oTxEn   : OUT STD_LOGIC;
41
    oTxErr  : OUT STD_LOGIC
42
    );
43
 
44
END ENTITY rgmii_tx;
45
-------------------------------------------------------------------------------
46
ARCHITECTURE rtl OF rgmii_tx IS
47
 
48
  TYPE state_t IS (IDLE, PREAMBLE, SEND_DATA, PAD, SEND_CRC, IPG);
49
  SIGNAL state                      : state_t;
50
  ATTRIBUTE syn_encoding            : STRING;
51
  ATTRIBUTE syn_encoding OF state_t : TYPE IS "safe,onehot";
52
 
53
  SIGNAL byteCnt : UNSIGNED(15 DOWNTO 0);
54
 
55
  SIGNAL crcInit : STD_LOGIC;
56
  SIGNAL crcEn   : STD_LOGIC;
57
  SIGNAL crc     : STD_LOGIC_VECTOR(31 DOWNTO 0);
58
 
59
BEGIN  -- ARCHITECTURE rtl
60
 
61
  crcCalc : ENTITY work.eth_crc32
62
    PORT MAP (
63
      iClk    => iClk,
64
      iRst_n  => iRst_n,
65
      iInit   => crcInit,
66
      iCalcEn => crcEn,
67
      iData   => iTxData,
68
      oCRC    => crc,
69
      oCRCErr => OPEN);
70
 
71
  oTxErr <= '0';
72
 
73
  PROCESS (iClk, iRst_n) IS
74
  BEGIN
75
    IF iRst_n = '0' THEN
76
      state        <= IDLE;
77
      oSOF         <= '0';
78
      byteCnt      <= (OTHERS => '0');
79
      oGenFrameAck <= '0';
80
      crcInit      <= '0';
81
      crcEn        <= '0';
82
      oTxData      <= (OTHERS => '0');
83
      oTxEn        <= '0';
84
    ELSIF rising_edge(iClk) THEN
85
      oGenFrameAck <= '0';
86
      crcInit      <= '0';
87
      oSOF         <= '0';
88
      byteCnt      <= byteCnt + 1;
89
      CASE state IS
90
        WHEN IDLE =>
91
          byteCnt <= (OTHERS => '0');
92
          IF iGenFrame = '1' THEN
93
            crcInit      <= '1';
94
            oGenFrameAck <= '1';
95
            state        <= PREAMBLE;
96
          END IF;
97
        -----------------------------------------------------------------------
98
        WHEN PREAMBLE =>
99
          oTxEn   <= '1';
100
          oTxData <= X"55";
101
          CASE byteCnt(2 DOWNTO 0) IS
102
            WHEN B"101" => oSOF <= '1';
103
            WHEN B"111" =>
104
              oTxData <= X"D5";
105
              crcEn   <= '1';
106
              state   <= SEND_DATA;
107
              byteCnt <= (OTHERS => '0');
108
            WHEN OTHERS => NULL;
109
          END CASE;
110
        -----------------------------------------------------------------------
111
        WHEN SEND_DATA =>
112
          oTxData <= iTxData;
113
          IF iEOF = '1' THEN
114
            IF byteCnt < X"003B" THEN
115
              state <= PAD;
116
            ELSE
117
              state <= SEND_CRC;
118
              crcEn <= '0';
119
              byteCnt <= (OTHERS => '0');
120
            END IF;
121
          END IF;
122
        -----------------------------------------------------------------------
123
        WHEN PAD =>
124
          oTxData <= iTxData;
125
          IF byteCnt(7 DOWNTO 0) = X"3B" THEN
126
            crcEn   <= '0';
127
            state   <= SEND_CRC;
128
            byteCnt <= (OTHERS => '0');
129
          END IF;
130
        -----------------------------------------------------------------------
131
        WHEN SEND_CRC =>
132
          CASE byteCnt(1 DOWNTO 0) IS
133
            WHEN B"00" => oTxData <= crc(31 DOWNTO 24);
134
            WHEN B"01" => oTxData <= crc(23 DOWNTO 16);
135
            WHEN B"10" => oTxData <= crc(15 DOWNTO 8);
136
            WHEN B"11" =>
137
              oTxData <= crc(7 DOWNTO 0);
138
              state   <= IPG;
139
              byteCnt <= (OTHERS => '0');
140
            WHEN OTHERS => NULL;
141
          END CASE;
142
        -----------------------------------------------------------------------
143
        WHEN IPG =>                     -- 96 bits(12 Bytes) time
144
          oTxEn <= '0';
145
          IF byteCnt(3 DOWNTO 0) = X"B" THEN
146
            state   <= IDLE;
147
            byteCnt <= (OTHERS => '0');
148
          END IF;
149
        -----------------------------------------------------------------------
150
        WHEN OTHERS => NULL;
151
      END CASE;
152
    END IF;
153
  END PROCESS;
154
 
155
END ARCHITECTURE rtl;

powered by: WebSVN 2.1.0

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