riscv_core_with_axi_master.v 6.4 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 139 140 141 142 143


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

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

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

饶先宏's avatar
饶先宏 已提交
174
	assign wWriteReady = ((wWrite || wvalid) && wWReady) || (wWrite && ((bWriteAddr & 32'hfff00000) != 0));
饶先宏's avatar
饶先宏 已提交
175 176

	always @(wWrite or wvalid or bWriteData or wdata or bWriteMask or wstrb)
饶先宏's avatar
饶先宏 已提交
177
	begin
饶先宏's avatar
饶先宏 已提交
178 179 180
		axi_wvalid = (wWrite && ((bWriteAddr & 32'hfff00000) != 0)) ? 1'b1 : wvalid;
		axi_wdata = (wWrite && ((bWriteAddr & 32'hfff00000) != 0))  ? bWriteData : wdata;
		axi_wstrb = (wWrite && ((bWriteAddr & 32'hfff00000) != 0))  ? ~bWriteMask : wstrb;
饶先宏's avatar
饶先宏 已提交
181 182 183 184 185 186 187 188
	end

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

饶先宏's avatar
饶先宏 已提交
196
	always @(wRead or arvalid or bReadAddr or araddr)
饶先宏's avatar
饶先宏 已提交
197
	begin
饶先宏's avatar
饶先宏 已提交
198
		axi_arvalid = (wRead && (bReadAddr & 32'hfff00000) != 0) ? 1'b1 : arvalid;
饶先宏's avatar
饶先宏 已提交
199 200 201 202
		axi_araddr = wRead ? bReadAddr : araddr;
	end

endmodule
饶先宏's avatar
饶先宏 已提交
203 204 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

`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