nexys4.sv (4843B)
1 // Copyright 2014 Brian Swetland <swetland@frotz.net> 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 module top( 16 input clk, 17 output [15:0]led, 18 output phy0_mdc, 19 inout phy0_mdio, 20 output phy0_rstn, 21 input phy0_crs, 22 input phy0_rxerr, 23 input [1:0]phy0_rx, 24 output phy0_txen, 25 output [1:0]phy0_tx, 26 output phy0_clk, 27 input phy0_intn, 28 output [3:0]JD 29 ); 30 31 wire clk50; 32 wire clk50b; 33 34 assign phy0_clk = clk50; 35 //assign phy0_mdc = 1; 36 //assign phy0_mdio = 1; 37 assign phy0_rstn = 1; 38 39 40 //assign JD[0] = phy0_clk; 41 //assign JD[1] = phy0_txen; 42 //assign JD[2] = phy0_tx[0]; 43 //assign JD[3] = phy0_tx[1]; 44 //assign JD[0] = phy0_clk; 45 //assign JD[1] = phy0_crs; 46 //assign JD[2] = phy0_rx[0]; 47 //assign JD[3] = phy0_rx[1]; 48 49 //assign phy0_txen = 0; 50 //assign phy0_tx = 0; 51 52 mmcm_1in_3out #( 53 .CLKIN_PERIOD(10.0), 54 .VCO_MUL(10.000), 55 .VCO_DIV(1), 56 .OUT0_DIV(20.000), // 50MHz 57 .OUT1_DIV(20), // 50MHz 58 .OUT2_DIV(4) // 250MHz 59 ) mmcm0 ( 60 .i_clk(clk), 61 .o_clk0(clk50), 62 .o_clk1(clk50b), 63 .o_clk2() 64 ); 65 66 wire [7:0]rxdata; 67 wire rxvalid; 68 wire rxeop; 69 70 (* keep_hierarchy = "yes" *) 71 eth_rmii_rx phy0rx( 72 .clk50(clk50), 73 .rx(phy0_rx), 74 .crs_dv(phy0_crs), 75 .data(rxdata), 76 .valid(rxvalid), 77 .eop(rxeop), 78 .out_tx(), 79 .out_txen(), 80 .sop() 81 ); 82 83 wire go; 84 85 reg [7:0]txptr = 0; 86 reg [7:0]pdata[0:128]; 87 initial $readmemh("testpacket.hex", pdata); 88 89 wire txbusy; 90 wire txadvance; 91 wire [7:0]txdata = pdata[txptr]; 92 reg txpacket = 0; 93 94 always @(posedge clk50b) begin 95 if (txpacket) begin 96 if (txadvance) begin 97 txptr <= txptr + 1; 98 if (txptr == 101) begin 99 txpacket <= 0; 100 txptr <= 0; 101 end 102 end 103 end else if (go) begin 104 txpacket <= 1; 105 end 106 end 107 108 eth_rmii_tx phy0tx( 109 .clk50(clk50b), 110 .tx(phy0_tx), 111 .txen(phy0_txen), 112 .data(txdata), 113 .packet(txpacket), 114 .busy(txbusy), 115 .advance(txadvance) 116 ); 117 118 wire i_mdio; 119 wire o_mdio; 120 wire t_mdio; 121 IOBUF buf_mdio( 122 .O(i_mdio), 123 .I(o_mdio), 124 .T(t_mdio), 125 .IO(phy0_mdio) 126 ); 127 128 assign JD[0] = phy0_mdc; 129 assign JD[1] = i_mdio; 130 131 wire mi_read; 132 wire mi_write; 133 wire [31:0]mi_txdata; 134 wire [15:0]mi_rxdata; 135 wire mi_busy; 136 137 (* keep_hierarchy = "yes" *) 138 eth_mdio mdio0( 139 .clk(clk50), 140 .do_read(mi_read), 141 .do_write(mi_write), 142 .txdata(mi_txdata), 143 .rxdata(mi_rxdata), 144 .busy(mi_busy), 145 .i_mdio(i_mdio), 146 .o_mdio(o_mdio), 147 .t_mdio(t_mdio), 148 .mdc(phy0_mdc) 149 ); 150 151 (* keep_hierarchy = "yes" *) 152 packetlogger log0( 153 .clk50(clk50), 154 .rxdata(rxdata), 155 .rxvalid(rxvalid), 156 .rxeop(rxeop), 157 .go(go), 158 .mi_read(mi_read), 159 .mi_write(mi_write), 160 .mi_txdata(mi_txdata), 161 .mi_rxdata(mi_rxdata), 162 .mi_busy(mi_busy) 163 ); 164 165 endmodule 166 167 module packetlogger( 168 input clk50, 169 input [7:0]rxdata, 170 input rxvalid, 171 input rxeop, 172 output reg go = 0, 173 output reg mi_read = 0, 174 output reg mi_write = 0, 175 output [31:0]mi_txdata, 176 input [15:0]mi_rxdata, 177 input mi_busy 178 ); 179 180 reg [11:0]rdptr = 0; 181 reg [11:0]rxptr = 0; 182 reg [11:0]next_rdptr; 183 reg [11:0]next_rxptr; 184 185 wire [8:0]rdata; 186 reg bufrd = 0; 187 188 ram rxbuffer( 189 .clk(clk50), 190 .wen(rxvalid | rxeop), 191 .waddr(rxptr), 192 .wdata( { rxeop, rxdata } ), 193 .ren(bufrd), 194 .raddr(rdptr), 195 .rdata(rdata) 196 ); 197 198 wire [31:0]dbg_wdata; 199 reg [31:0]dbg_rdata; 200 wire [2:0]dbg_addr; 201 wire dbg_rd; 202 wire dbg_wr; 203 204 assign mi_txdata = dbg_wdata; 205 206 always_comb begin 207 next_rxptr = rxptr; 208 next_rdptr = rdptr; 209 bufrd = 0; 210 if (rxvalid | rxeop) begin 211 if (rxptr != 12'b111111111111) 212 next_rxptr = rxptr + 1; 213 end 214 if (dbg_rd) begin 215 if (dbg_addr == 1) begin 216 next_rdptr = rdptr + 1; 217 bufrd = 1; 218 end 219 end 220 case (dbg_addr) 221 0: dbg_rdata = 32'h12345678; 222 1: dbg_rdata = { 23'd0, rdata }; 223 2: dbg_rdata = { 20'd0, rxptr }; 224 3: dbg_rdata = { 15'd0, mi_busy, mi_rxdata }; 225 default: dbg_rdata = 0; 226 endcase 227 end 228 229 always_ff @(posedge clk50) begin 230 rxptr <= next_rxptr; 231 rdptr <= next_rdptr; 232 if (dbg_wr) begin 233 if (dbg_addr == 0) go <= 1; 234 if (dbg_addr == 3) begin 235 mi_read <= (dbg_wdata[29:28] == 2'b10); 236 mi_write <= 1; 237 end 238 end else begin 239 go <= 0; 240 mi_read <= 0; 241 mi_write <= 0; 242 end 243 end 244 245 (* keep_hierarchy = "yes" *) 246 jtag_debug_port port0( 247 .clk(clk50), 248 .o_wdata(dbg_wdata), 249 .i_rdata(dbg_rdata), 250 .o_addr(dbg_addr), 251 .o_rd(dbg_rd), 252 .o_wr(dbg_wr) 253 ); 254 255 endmodule 256 257 module ram( 258 input clk, 259 input ren, 260 input [11:0]raddr, 261 output reg [8:0]rdata, 262 input wen, 263 input [11:0]waddr, 264 input [8:0]wdata 265 ); 266 267 reg [8:0]memory[0:4095]; 268 269 always_ff @(posedge clk) begin 270 if (ren) 271 rdata <= memory[raddr]; 272 if (wen) 273 memory[waddr] <= wdata; 274 end 275 276 endmodule 277 278 279 280 281 282 283