riscv_core_with_axi_master.v 6.2 KB
Newer Older
饶先宏's avatar
饶先宏 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

`timescale 1 ns / 1 ps

module riscv_core_with_axi_master (
	    // clock and reset
		input wire				wClk,
		input wire				nwReset,

		// Write Address
		output wire				wAWValid,
		output wire [31 : 0]	bAWAddr,
		output wire [2 : 0]		bAWProt,
		input wire				wAWReady,

		// Write Data 
		output wire				wWValid,
		output wire [31 : 0]	bWData,
		output wire [3 : 0]		bWStrb,
		input wire				wWReady,

		// Write Response
		output wire				wBReady,
		input wire [1 : 0]		bBResp,
		input wire				wBValid,

		// ReadAddr
		output wire				wARValid,
		output wire [31 : 0]	bARAddr,
		output wire [2 : 0]		bARProt,
		input wire				wARReady,

		//ReadData
饶先宏's avatar
饶先宏 已提交
33
		output wire				wRReady,
饶先宏's avatar
饶先宏 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
		input wire				wRValid,
		input wire [31 : 0]		bRData,
		input wire [1 : 0]		bRResp
);

	reg			axi_awvalid;	assign wAWValid = axi_awvalid;
	reg [31:0] 	axi_awaddr;		assign bAWAddr = axi_awaddr;
								assign bAWProt = 3'b000;

	reg			axi_wvalid;		assign wWValid = axi_wvalid;
	reg [31:0] 	axi_wdata;		assign bWData = axi_wdata;
	reg [3:0]   axi_wstrb;		assign bWStrb = axi_wstrb;

								assign wBReady = 1'b1;

	reg			axi_arvalid;	assign wARValid = axi_arvalid;
	reg [31:0] 	axi_araddr;		assign bARAddr = axi_araddr;
								assign bARProt = 3'b001;

								assign wRReady = 1'b1;

    wire wWrite, wRead, wReadReady, wWriteReady;
    wire [31:0] bWriteAddr, bWriteData, bReadAddr, bReadData, bReadDataRam, bReadDataKey;
饶先宏's avatar
饶先宏 已提交
57
	wire [3:0]  bWriteMask;
饶先宏's avatar
饶先宏 已提交
58 59 60 61 62 63 64 65 66 67 68 69

	wire [4:0]  regno;
    wire [3:0]  regena;
    wire [31:0] regwrdata;
    wire        regwren;
    wire [31:0] regrddata;
    wire [4:0]  regno2;
    wire [3:0]  regena2;
    wire [31:0] regwrdata2;
    wire        regwren2;
    wire [31:0] regrddata2;

饶先宏's avatar
饶先宏 已提交
70 71 72 73 74 75 76 77 78 79 80 81 82
	reg [31:0] lastreadaddr;
	reg		   lastread;

	always @(posedge wClk)
	if (~nwReset) begin
		lastreadaddr <= 0;
		lastread <= 0;
	end else begin
		lastreadaddr <= bReadAddr;
		lastread <= wRead;
	end

	assign bReadData = 
饶先宏's avatar
饶先宏 已提交
83 84
            ((lastreadaddr & 32'hf000_0000) == 32'hf000_0000) ? bRData : (
            ((lastreadaddr & 32'hff00_0000) == 32'h0000_0000) ? bReadDataRam : (32'h0)
饶先宏's avatar
饶先宏 已提交
85 86
            );

饶先宏's avatar
饶先宏 已提交
87 88
	assign wReadReady = ((lastreadaddr & 32'hf000_0000) == 32'hf000_0000) ? wRValid : (
						((lastreadaddr & 32'hfff0_0000) == 32'h0000_0000) ? lastread : (0)
饶先宏's avatar
饶先宏 已提交
89 90 91 92 93 94
						);


    wire [29:0] ramaddr;
    assign ramaddr = wWrite?bWriteAddr[31:2]:bReadAddr[31:2];

饶先宏's avatar
饶先宏 已提交
95 96 97 98 99 100 101 102
	reg [4:0] lastregno;
	reg [4:0] lastregno2;

	always @(posedge wClk) begin
		lastregno <= regno;
		lastregno2 <= regno2;
	end

饶先宏's avatar
饶先宏 已提交
103 104
    regfile    regs(regno, regena, wClk, regwrdata, regwren, regrddata);
    regfile    regs2(regno2, regena2, wClk, regwrdata2, regwren2, regrddata2);
饶先宏's avatar
饶先宏 已提交
105

饶先宏's avatar
饶先宏 已提交
106
`define ALTERA
饶先宏's avatar
饶先宏 已提交
107 108 109 110 111 112

`ifdef ALTERA
	ram4kB    ram(.clock(wClk), .address(ramaddr), .byteena(~bWriteMask), .data(bWriteData), .wren(((bWriteAddr & 32'hff000000) == 0)?wWrite:1'b0), .q(bReadDataRam));
`else
    ram4KB  ram(.clka(wClk), .ena(1'b1), .addra(ramaddr), .wea(((bWriteAddr & 32'hff000000) == 0 && wWrite)?(~bWriteMask):4'b0), .dina(bWriteData) , .douta(bReadDataRam));
`endif
饶先宏's avatar
饶先宏 已提交
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
	riscv_core_v5 core(
				wClk, 
				nwReset, 
				wWrite, 
				bWriteAddr, 
				bWriteData, 
				bWriteMask, 
				wWriteReady,
				wRead, 
				bReadAddr, 
				bReadData, 
				wReadReady,
                regno, 
				regena, 
				regwrdata, 
				regwren, 
				(lastregno == 0) ? 0 : regrddata,
				regno2, 
				regena2, 
				regwrdata2, 
				regwren2, 
				(lastregno2 == 0) ? 0 : regrddata2
饶先宏's avatar
饶先宏 已提交
135
				);
饶先宏's avatar
饶先宏 已提交
136 137 138


	//Write Address
饶先宏's avatar
饶先宏 已提交
139
	wire writeaxi = (wWrite && ((bWriteAddr & 32'hfff00000) != 0));
饶先宏's avatar
饶先宏 已提交
140 141 142 143 144
	reg [31:0] awaddr;
	reg awvalid;
	always @(posedge wClk)
	if (~nwReset) begin
		awvalid <= 1'b0;
饶先宏's avatar
饶先宏 已提交
145
	end else if (writeaxi) begin
饶先宏's avatar
饶先宏 已提交
146 147 148 149 150 151
		awaddr <= bWriteAddr;
		awvalid <= 1'b1;
	end else if (wAWReady) begin
		awvalid <= 1'b0;
	end

饶先宏's avatar
饶先宏 已提交
152
	always @(wWrite or awvalid or bWriteAddr or awaddr)
饶先宏's avatar
饶先宏 已提交
153
	begin
饶先宏's avatar
饶先宏 已提交
154
		axi_awvalid = writeaxi ? 1'b1 : awvalid;
饶先宏's avatar
饶先宏 已提交
155 156 157 158 159 160 161
		axi_awaddr = wWrite ? bWriteAddr : awaddr;
	end

	/* Write Data */
	reg [31:0] wdata;
	reg [3:0]  wstrb;
	reg		   wvalid;
饶先宏's avatar
饶先宏 已提交
162
	always @(posedge wClk)
饶先宏's avatar
饶先宏 已提交
163 164 165
	begin
		if (~nwReset) begin
			wvalid <= 1'b0;
饶先宏's avatar
饶先宏 已提交
166
		end if (writeaxi) begin
饶先宏's avatar
饶先宏 已提交
167 168 169 170 171 172 173 174
			wdata <= bWriteData;
			wstrb <= ~bWriteMask;
			wvalid <= 1'b1;
		end if (wWReady) begin
			wvalid <= 1'b0;
		end
	end

饶先宏's avatar
饶先宏 已提交
175
	assign wWriteReady = ((wWrite || wvalid) && wWReady) || writeaxi;
饶先宏's avatar
饶先宏 已提交
176 177

	always @(wWrite or wvalid or bWriteData or wdata or bWriteMask or wstrb)
饶先宏's avatar
饶先宏 已提交
178
	begin
饶先宏's avatar
饶先宏 已提交
179 180 181
		axi_wvalid = writeaxi ? 1'b1 : wvalid;
		axi_wdata = writeaxi  ? bWriteData : wdata;
		axi_wstrb = writeaxi  ? ~bWriteMask : wstrb;
饶先宏's avatar
饶先宏 已提交
182 183
	end

饶先宏's avatar
饶先宏 已提交
184
	wire readaxi = wRead && ((bReadAddr & 32'hfff00000) != 0);
饶先宏's avatar
饶先宏 已提交
185 186 187 188 189 190
	//Read Address
	reg [31:0] araddr;
	reg arvalid;
	always @(posedge wClk)
	if (~nwReset) begin
		arvalid <= 1'b0;
饶先宏's avatar
饶先宏 已提交
191
	end else if (readaxi) begin
饶先宏's avatar
饶先宏 已提交
192 193 194 195 196 197
		araddr <= bReadAddr;
		arvalid <= 1'b1;
	end else if (wARReady) begin
		arvalid <= 1'b0;
	end

饶先宏's avatar
饶先宏 已提交
198
	always @(wRead or arvalid or bReadAddr or araddr)
饶先宏's avatar
饶先宏 已提交
199
	begin
饶先宏's avatar
饶先宏 已提交
200
		axi_arvalid = readaxi ? 1'b1 : arvalid;
饶先宏's avatar
饶先宏 已提交
201 202 203 204
		axi_araddr = wRead ? bReadAddr : araddr;
	end

endmodule
饶先宏's avatar
饶先宏 已提交
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263

`timescale 1 ns / 1 ps

module riscv_core_with_axi_master_xilinxwrap
	(
		input wire  m00_axi_aclk,
		input wire  m00_axi_aresetn,
		output wire [31 : 0] m00_axi_awaddr,
		output wire [2 : 0] m00_axi_awprot,
		output wire  m00_axi_awvalid,
		input wire  m00_axi_awready,
		output wire [31 : 0] m00_axi_wdata,
		output wire [3 : 0] m00_axi_wstrb,
		output wire  m00_axi_wvalid,
		input wire  m00_axi_wready,
		input wire [1 : 0] m00_axi_bresp,
		input wire  m00_axi_bvalid,
		output wire  m00_axi_bready,
		output wire [31 : 0] m00_axi_araddr,
		output wire [2 : 0] m00_axi_arprot,
		output wire  m00_axi_arvalid,
		input wire  m00_axi_arready,
		input wire [31 : 0] m00_axi_rdata,
		input wire [1 : 0] m00_axi_rresp,
		input wire  m00_axi_rvalid,
		output wire  m00_axi_rready
	);

	riscv_core_with_axi_master riscv_core_inst (
		.wClk(m00_axi_aclk),
		.nwReset(m00_axi_aresetn),

		.bAWAddr(m00_axi_awaddr),
		.bAWProt(m00_axi_awprot),
		.wAWValid(m00_axi_awvalid),
		.wAWReady(m00_axi_awready),

		.bWData(m00_axi_wdata),
		.bWStrb(m00_axi_wstrb),
		.wWValid(m00_axi_wvalid),
		.wWReady(m00_axi_wready),

		.bBResp(m00_axi_bresp),
		.wBValid(m00_axi_bvalid),
		.wBReady(m00_axi_bready),

		.bARAddr(m00_axi_araddr),
		.bARProt(m00_axi_arprot),
		.wARValid(m00_axi_arvalid),
		.wARReady(m00_axi_arready),

		.bRData(m00_axi_rdata),
		.bRResp(m00_axi_rresp),
		.wRValid(m00_axi_rvalid),
		.wRReady(m00_axi_rready)
	);


endmodule