riscv_core_with_axi_master.v 5.3 KB
Newer Older
饶先宏's avatar
饶先宏 已提交
1 2 3 4

`timescale 1 ns / 1 ps

module riscv_core_with_axi_master (
饶先宏's avatar
饶先宏 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
		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
饶先宏's avatar
饶先宏 已提交
26 27
);

饶先宏's avatar
饶先宏 已提交
28
	reg			axi_awvalid;	assign m00_axi_awvalid = axi_awvalid;
饶先宏's avatar
饶先宏 已提交
29 30
	reg [31:0] 	axi_awaddr;		assign m00_axi_awaddr = axi_awaddr;
								assign m00_axi_awprot = 3'b000;
饶先宏's avatar
饶先宏 已提交
31

饶先宏's avatar
饶先宏 已提交
32 33 34
	reg			axi_wvalid;		assign m00_axi_wvalid = axi_wvalid;
	reg [31:0] 	axi_wdata;		assign m00_axi_wdata = axi_wdata;
	reg [3:0]   axi_wstrb;		assign m00_axi_wstrb = axi_wstrb;
饶先宏's avatar
饶先宏 已提交
35

饶先宏's avatar
饶先宏 已提交
36
								assign m00_axi_bready = 1'b1;
饶先宏's avatar
饶先宏 已提交
37

饶先宏's avatar
饶先宏 已提交
38 39 40
	reg			axi_arvalid;	assign m00_axi_arvalid = axi_arvalid;
	reg [31:0] 	axi_araddr;		assign m00_axi_araddr = axi_araddr;
								assign m00_axi_arprot = 3'b001;
饶先宏's avatar
饶先宏 已提交
41

饶先宏's avatar
饶先宏 已提交
42
								assign m00_axi_rready = 1'b1;
饶先宏's avatar
饶先宏 已提交
43 44 45

    wire wWrite, wRead, wReadReady, wWriteReady;
    wire [31:0] bWriteAddr, bWriteData, bReadAddr, bReadData, bReadDataRam, bReadDataKey;
饶先宏's avatar
饶先宏 已提交
46
	wire [3:0]  bWriteMask;
饶先宏's avatar
饶先宏 已提交
47 48 49 50 51 52 53 54 55 56 57 58

	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
饶先宏 已提交
59 60 61
	reg [31:0] lastreadaddr;
	reg		   lastread;

饶先宏's avatar
饶先宏 已提交
62 63
	always @(posedge m00_axi_aclk)
	if (~m00_axi_aresetn) begin
饶先宏's avatar
饶先宏 已提交
64 65 66 67 68 69 70
		lastreadaddr <= 0;
		lastread <= 0;
	end else begin
		lastreadaddr <= bReadAddr;
		lastread <= wRead;
	end

饶先宏's avatar
饶先宏 已提交
71 72 73
	wire isramaddr = (lastreadaddr & 32'hfff0_0000) == 32'h0000_0000; /* 1MB ram addr */
	assign bReadData = isramaddr ? bReadDataRam : m00_axi_rdata;
	assign wReadReady = isramaddr ? lastread : m00_axi_rvalid;
饶先宏's avatar
饶先宏 已提交
74

饶先宏's avatar
饶先宏 已提交
75 76
	wire isramwriteaddr = (bWriteAddr & 32'hfff0_0000) == 32'h0000_0000; /* 1MB ram addr */
	wire isramreadaddr  = (bReadAddr & 32'hfff0_0000) == 32'h0000_0000; /* 1MB ram addr */
饶先宏's avatar
饶先宏 已提交
77 78 79 80

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

饶先宏's avatar
饶先宏 已提交
81 82 83
	reg [4:0] lastregno;
	reg [4:0] lastregno2;

饶先宏's avatar
饶先宏 已提交
84
	always @(posedge m00_axi_aclk) begin
饶先宏's avatar
饶先宏 已提交
85 86 87 88
		lastregno <= regno;
		lastregno2 <= regno2;
	end

饶先宏's avatar
饶先宏 已提交
89 90
    regfile    regs(regno, regena, m00_axi_aclk, regwrdata, regwren, regrddata);
    regfile    regs2(regno2, regena2, m00_axi_aclk, regwrdata2, regwren2, regrddata2);
饶先宏's avatar
饶先宏 已提交
91

饶先宏's avatar
饶先宏 已提交
92
`define ALTERA
饶先宏's avatar
饶先宏 已提交
93 94

`ifdef ALTERA
饶先宏's avatar
饶先宏 已提交
95
	ram4kB    ram(.clock(m00_axi_aclk), .address(ramaddr), .byteena(~bWriteMask), .data(bWriteData), .wren(isramwriteaddr ? wWrite : 1'b0), .q(bReadDataRam));
饶先宏's avatar
饶先宏 已提交
96
`else
饶先宏's avatar
饶先宏 已提交
97
    ram4KB  ram(.clka(m00_axi_aclk), .ena(1'b1), .addra(ramaddr), .wea((isramwriteaddr && wWrite)?(~bWriteMask):4'b0), .dina(bWriteData) , .douta(bReadDataRam));
饶先宏's avatar
饶先宏 已提交
98
`endif
饶先宏's avatar
饶先宏 已提交
99
	riscv_core_v5 core(
饶先宏's avatar
饶先宏 已提交
100 101
				m00_axi_aclk, 
				m00_axi_aresetn, 
饶先宏's avatar
饶先宏 已提交
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
				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
饶先宏 已提交
121
				);
饶先宏's avatar
饶先宏 已提交
122 123 124


	//Write Address
饶先宏's avatar
饶先宏 已提交
125
	wire writeaxi = (wWrite && ~isramwriteaddr);
饶先宏's avatar
饶先宏 已提交
126 127
	reg [31:0] awaddr;
	reg awvalid;
饶先宏's avatar
饶先宏 已提交
128 129
	always @(posedge m00_axi_aclk)
	if (~m00_axi_aresetn) begin
饶先宏's avatar
饶先宏 已提交
130
		awvalid <= 1'b0;
饶先宏's avatar
饶先宏 已提交
131
	end else if (writeaxi) begin
饶先宏's avatar
饶先宏 已提交
132 133
		awaddr <= bWriteAddr;
		awvalid <= 1'b1;
饶先宏's avatar
饶先宏 已提交
134
	end else if (m00_axi_awready) begin
饶先宏's avatar
饶先宏 已提交
135 136 137
		awvalid <= 1'b0;
	end

饶先宏's avatar
饶先宏 已提交
138
	always @(wWrite or awvalid or bWriteAddr or awaddr)
饶先宏's avatar
饶先宏 已提交
139
	begin
饶先宏's avatar
饶先宏 已提交
140
		axi_awvalid = writeaxi ? 1'b1 : awvalid;
饶先宏's avatar
饶先宏 已提交
141 142 143 144
		axi_awaddr = wWrite ? bWriteAddr : awaddr;
	end

	/* Write Data */
饶先宏's avatar
饶先宏 已提交
145
	reg [31:0] waddr;
饶先宏's avatar
饶先宏 已提交
146 147 148
	reg [31:0] wdata;
	reg [3:0]  wstrb;
	reg		   wvalid;
饶先宏's avatar
饶先宏 已提交
149
	reg		   write_local;
饶先宏's avatar
饶先宏 已提交
150
	always @(posedge m00_axi_aclk)
饶先宏's avatar
饶先宏 已提交
151
	begin
饶先宏's avatar
饶先宏 已提交
152
		if (~m00_axi_aresetn) begin
饶先宏's avatar
饶先宏 已提交
153
			wvalid <= 1'b0;
饶先宏's avatar
饶先宏 已提交
154 155
		end else if (writeaxi) begin
			waddr <= bWriteAddr;
饶先宏's avatar
饶先宏 已提交
156 157 158
			wdata <= bWriteData;
			wstrb <= ~bWriteMask;
			wvalid <= 1'b1;
饶先宏's avatar
饶先宏 已提交
159
		end if (m00_axi_wready) begin
饶先宏's avatar
饶先宏 已提交
160 161
			wvalid <= 1'b0;
		end
饶先宏's avatar
饶先宏 已提交
162 163 164 165 166 167 168 169 170
		if (~m00_axi_aresetn) begin
			write_local <= 1'b0;
		end else if (wWrite) begin
			if (isramwriteaddr) begin
				write_local <= 1;
			end else begin
				write_local <= 0;
			end
		end
饶先宏's avatar
饶先宏 已提交
171 172
	end

饶先宏's avatar
饶先宏 已提交
173 174 175 176 177 178 179
	reg writeready;
	assign wWriteReady = writeready;
	always @(posedge m00_axi_aclk)
	if (~m00_axi_aresetn)
		writeready <= 1'b0;
	else
		writeready <= m00_axi_wready || write_local || isramwriteaddr;
饶先宏's avatar
饶先宏 已提交
180 181

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

饶先宏's avatar
饶先宏 已提交
188
	wire readaxi = wRead && ~isramreadaddr;
饶先宏's avatar
饶先宏 已提交
189 190 191
	//Read Address
	reg [31:0] araddr;
	reg arvalid;
饶先宏's avatar
饶先宏 已提交
192 193
	always @(posedge m00_axi_aclk)
	if (~m00_axi_aresetn) begin
饶先宏's avatar
饶先宏 已提交
194
		arvalid <= 1'b0;
饶先宏's avatar
饶先宏 已提交
195
	end else if (readaxi) begin
饶先宏's avatar
饶先宏 已提交
196 197
		araddr <= bReadAddr;
		arvalid <= 1'b1;
饶先宏's avatar
饶先宏 已提交
198
	end else if (m00_axi_arready) begin
饶先宏's avatar
饶先宏 已提交
199 200 201
		arvalid <= 1'b0;
	end

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

endmodule
饶先宏's avatar
饶先宏 已提交
209