]> git.gag.com Git - debian/gnuradio/blob - usrp2/fpga/eth/demo/verilog/demo_packet_generator.v
Copied wb_1master back from quad radio
[debian/gnuradio] / usrp2 / fpga / eth / demo / verilog / demo_packet_generator.v
1 module demo_packet_generator(\r
2   Reset_n,\r
3   Clk,\r
4 \r
5   //--- Wishbone interface\r
6   STB_I,\r
7   CYC_I,\r
8   ADR_I,\r
9   WE_I,\r
10   DAT_I,\r
11   DAT_O,\r
12   ACK_O,\r
13 \r
14   //--- Packet Descriptor Memory interface\r
15   // RdData_i is always valid exactly one clock after Addr_o changes\r
16   // and Rd_o is asserted\r
17   Rd_o,\r
18   Addr_o,\r
19   RdData_i,\r
20 \r
21   //--- User (packet) interface\r
22   Rx_mac_ra,\r
23   Rx_mac_rd,\r
24   Rx_mac_data,\r
25   Rx_mac_BE,\r
26   Rx_mac_pa,\r
27   Rx_mac_sop,\r
28   Rx_mac_err,\r
29   Rx_mac_eop,\r
30 \r
31   Tx_mac_wa,\r
32   Tx_mac_wr,\r
33   Tx_mac_data,\r
34   Tx_mac_BE,\r
35   Tx_mac_sop,\r
36   Tx_mac_eop\r
37 );\r
38 \r
39   input         Reset_n;\r
40   input         Clk;\r
41 \r
42   //--- Wishbone interface\r
43   input         STB_I;\r
44   input         CYC_I;\r
45   input [1:0]   ADR_I;\r
46   input         WE_I;\r
47   input [15:0]  DAT_I;\r
48   output [15:0] DAT_O;\r
49   output        ACK_O;\r
50 \r
51   //--- Packet Generator interface\r
52   // RdData_o is always valid exactly one clock after Addr_o changes\r
53   // and Rd_o is asserted\r
54   output        Rd_o;\r
55   output [13:0] Addr_o;\r
56   input [31:0]  RdData_i;\r
57 \r
58   //--- User (packet) interface\r
59   input         Rx_mac_ra;\r
60   output        Rx_mac_rd;\r
61   input [31:0]  Rx_mac_data;\r
62   input [1:0]   Rx_mac_BE;\r
63   input         Rx_mac_pa;\r
64   input         Rx_mac_sop;\r
65   input         Rx_mac_err;\r
66   input         Rx_mac_eop;\r
67 \r
68   input         Tx_mac_wa;\r
69   output        Tx_mac_wr;\r
70   output [31:0] Tx_mac_data;\r
71   output [1:0]  Tx_mac_BE;\r
72   output        Tx_mac_sop;\r
73   output        Tx_mac_eop;\r
74 \r
75   //-------------------------------------------------------------------------\r
76   // Local declarations\r
77   //-------------------------------------------------------------------------\r
78 \r
79   reg        ACK_O;\r
80   reg [15:0] DAT_O;\r
81 \r
82   reg        Rd_o;\r
83   reg        Tx_mac_wr;\r
84   reg [1:0]  Tx_mac_BE;\r
85   reg        Tx_mac_sop;\r
86   reg        Tx_mac_eop;\r
87 \r
88   //--- Wishbone interface --------------------------------------------------\r
89 \r
90   reg [1:0] PG_CFG;\r
91   wire      PG_Enable = PG_CFG[0];\r
92   \r
93   always @( negedge Reset_n or posedge Clk )\r
94     if ( ~Reset_n )\r
95       begin\r
96         ACK_O <= 0;\r
97         DAT_O <= 'b0;\r
98 \r
99         PG_CFG <= 2'h0;\r
100       end\r
101     else\r
102       begin\r
103         ACK_O <= 0;\r
104         if ( CYC_I & STB_I )\r
105           begin\r
106             ACK_O <= ~ACK_O; // Generate single cycle pulse!\r
107             if ( WE_I )\r
108               begin\r
109                 PG_CFG <= DAT_I;\r
110               end\r
111             else\r
112               begin\r
113                 DAT_O[1:0] <= PG_CFG;\r
114               end\r
115           end\r
116       end\r
117 \r
118   //--- Packet Generator FSM ------------------------------------------------\r
119 \r
120   parameter  PG_FSM_STATE_IDLE               = 3'h0;\r
121   parameter  PG_FSM_STATE_LD_DESC_1          = 3'h1;\r
122   parameter  PG_FSM_STATE_LD_DESC_2          = 3'h2;\r
123   parameter  PG_FSM_STATE_RD_HEADER          = 3'h3;\r
124   parameter  PG_FSM_STATE_PAYLOAD_SEQ_NUMBER = 3'h4;\r
125   parameter  PG_FSM_STATE_PAYLOAD            = 3'h5;\r
126   parameter  PG_FSM_STATE_DONE               = 3'h6;\r
127   reg [2:0]  PG_FSM_State;\r
128 \r
129   reg [9:0] DescHigh; // Selects currente descriptor\r
130   reg [3:0] DescLow; // Index into a single descriptor (16 entries)\r
131 \r
132   reg        PDM_CFG1_LAST;\r
133   reg [3:0]  PDM_CFG1_REPEAT;\r
134   reg [3:0]  PDM_CFG1_HDRLEN;\r
135   reg [15:0] PDM_CFG2_PAYLDLEN;\r
136 \r
137   reg [31:0] Tx_mac_data_reg;\r
138   reg        WriteHeader;\r
139   reg [15:0] PayloadRemaining;\r
140   reg [31:0] PacketSequenceNumber;\r
141   reg [31:0] Payload;\r
142   \r
143   always @( negedge Reset_n or posedge Clk )\r
144     if ( ~Reset_n )\r
145       begin\r
146         PG_FSM_State <= PG_FSM_STATE_IDLE;\r
147 \r
148         Rd_o <= 0;\r
149 \r
150         DescHigh <= 10'b0;\r
151         DescLow  <= 4'b0;\r
152 \r
153         Tx_mac_wr  <= 0;\r
154         Tx_mac_sop <= 0;\r
155         Tx_mac_eop <= 0;\r
156         Tx_mac_BE  <= 2'b00;\r
157 \r
158         Tx_mac_data_reg <= 32'b0;\r
159         WriteHeader <= 0;\r
160         PayloadRemaining <= 16'd0;\r
161 \r
162         PacketSequenceNumber <= 32'd0;\r
163         Payload <= 32'h0;\r
164 \r
165         { PDM_CFG1_HDRLEN, PDM_CFG1_REPEAT, PDM_CFG1_LAST, PDM_CFG2_PAYLDLEN } <= 'b0;\r
166       end\r
167     else\r
168       begin\r
169         casez ( PG_FSM_State )\r
170           PG_FSM_STATE_IDLE:\r
171             if ( PG_Enable )\r
172               begin\r
173                 PG_FSM_State <= PG_FSM_STATE_LD_DESC_1;\r
174                 Rd_o <= 1;\r
175               end\r
176             else\r
177               begin\r
178                 DescHigh <= 10'b0;\r
179                 DescLow  <= 4'b0;\r
180               end\r
181 \r
182           PG_FSM_STATE_LD_DESC_1:\r
183             begin\r
184               PG_FSM_State <= PG_FSM_STATE_LD_DESC_2;\r
185 \r
186               DescLow <= DescLow + 1;\r
187             end\r
188 \r
189           PG_FSM_STATE_LD_DESC_2:\r
190             begin\r
191               PG_FSM_State <= PG_FSM_STATE_RD_HEADER;\r
192 \r
193               { PDM_CFG1_LAST, PDM_CFG1_REPEAT, PDM_CFG1_HDRLEN, PDM_CFG2_PAYLDLEN } <=\r
194                 { RdData_i[31], RdData_i[23:20], RdData_i[19:16], RdData_i[15:0] };\r
195             end\r
196 \r
197           PG_FSM_STATE_RD_HEADER:\r
198             begin\r
199               Tx_mac_wr <= 0;\r
200               if ( Tx_mac_wa )\r
201                 begin\r
202                   // Space in Tx FIFO - write next header word\r
203                   DescLow <= DescLow + 1;\r
204                   Tx_mac_wr <= 1;\r
205                   Tx_mac_sop <= ( DescLow == 1 ); // Assert SOP on first header word\r
206                   WriteHeader <= 1;\r
207                   if ( DescLow == PDM_CFG1_HDRLEN )\r
208                     begin\r
209                       // The requested number of header words has been read\r
210                       // - proceed to generate packet payload\r
211                       PG_FSM_State <= PG_FSM_STATE_PAYLOAD_SEQ_NUMBER;\r
212                       PayloadRemaining <= PDM_CFG2_PAYLDLEN;\r
213                     end\r
214                 end\r
215             end\r
216 \r
217           PG_FSM_STATE_PAYLOAD_SEQ_NUMBER:\r
218             begin\r
219               WriteHeader <= 0;\r
220               Tx_mac_data_reg <= PacketSequenceNumber;\r
221               Tx_mac_wr <= 0;\r
222               Tx_mac_sop <= 0;\r
223               if ( Tx_mac_wa )\r
224                 begin\r
225                   Tx_mac_wr <= 1;\r
226                   PG_FSM_State <= PG_FSM_STATE_PAYLOAD;\r
227                   Payload <= 32'h01020304;\r
228                   PayloadRemaining <= PayloadRemaining - 4;\r
229                 end\r
230             end\r
231 \r
232           PG_FSM_STATE_PAYLOAD:\r
233             begin\r
234               Tx_mac_data_reg <= Payload;\r
235               Tx_mac_wr <= 0;\r
236               if ( Tx_mac_wa )\r
237                 begin\r
238                   Tx_mac_wr <= 1;\r
239                   Tx_mac_data_reg <= Payload;\r
240                   Payload[31:24] <= Payload[31:24] + 8'h04;\r
241                   Payload[23:16] <= Payload[23:16] + 8'h04;\r
242                   Payload[15: 8] <= Payload[15: 8] + 8'h04;\r
243                   Payload[ 7: 0] <= Payload[ 7: 0] + 8'h04;\r
244                   PayloadRemaining <= PayloadRemaining - 4;\r
245                   if ( PayloadRemaining <= 4 )\r
246                     begin\r
247                       PG_FSM_State <= PG_FSM_STATE_DONE;\r
248 \r
249                       Tx_mac_eop <= 1;\r
250                       // Indicate how many bytes are valid in this last transfer\r
251                       Tx_mac_BE <= PayloadRemaining[1:0];\r
252                     end\r
253                 end\r
254             end\r
255 \r
256           PG_FSM_STATE_DONE:\r
257             begin\r
258               // TBD: Add support for REPEAT, NEXT & LAST!\r
259               Tx_mac_wr <= 0;\r
260               Tx_mac_eop <= 0;\r
261             end\r
262         endcase\r
263       end\r
264 \r
265   //-------------------------------------------------------------------------\r
266 \r
267   assign Tx_mac_data = WriteHeader ?\r
268                        RdData_i : Tx_mac_data_reg;\r
269 \r
270   assign Addr_o = { DescHigh, DescLow };\r
271 \r
272   assign Rx_mac_rd = 0;\r
273 \r
274 endmodule\r