zynq-sandbox

old FPGA projects for ZYNQ
git clone http://frotz.net/git/zynq-sandbox.git
Log | Files | Refs | README

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