提交 6e8b1bac 编写于 作者: 饶先宏's avatar 饶先宏

202109131717

上级 cbd5fc48
......@@ -175,8 +175,8 @@ module de1_riscv_axi(
.m00_axi_rready(m00_axi_rready)
);
wire is_led_key_w = ((m00_axi_awaddr & 32'hffff_fff0) == 32'hf000_0000);
wire is_led_key_r = ((m00_axi_araddr & 32'hffff_fff0) == 32'hf000_0000);
wire is_led_key_w = ((m00_axi_awaddr & 32'hffff_ff00) == 32'hf000_0000);
wire is_led_key_r = ((m00_axi_araddr & 32'hffff_ff00) == 32'hf000_0000);
wire [3 : 0] s00_axi_awaddr = m00_axi_awaddr[3:0];
wire [2 : 0] s00_axi_awprot = m00_axi_awprot;
wire s00_axi_awvalid = m00_axi_awvalid && is_led_key_w;
......@@ -225,27 +225,27 @@ module de1_riscv_axi(
.led(LEDR[5:2])
);
wire is_uart_w = ((m00_axi_awaddr & 32'hffff_fff0) == 32'hf000_0100);
wire is_uart_r = ((m00_axi_araddr & 32'hffff_fff0) == 32'hf000_0100);
wire is_uart_w = ((m00_axi_awaddr & 32'hffff_ff00) == 32'hf000_0100);
wire is_uart_r = ((m00_axi_araddr & 32'hffff_ff00) == 32'hf000_0100);
wire [3 : 0] s01_axi_awaddr = m00_axi_awaddr[3:0];
wire [2 : 0] s01_axi_awprot = m00_axi_awprot;
wire s01_axi_awvalid = m00_axi_awvalid && is_led_key_w;
wire s01_axi_awvalid = m00_axi_awvalid && is_uart_w;
wire s01_axi_awready;
wire [31 : 0] s01_axi_wdata = m00_axi_wdata;
wire [3 : 0] s01_axi_wstrb = m00_axi_wstrb;
wire s01_axi_wvalid = m00_axi_wvalid && is_led_key_w;
wire s01_axi_wvalid = m00_axi_wvalid && is_uart_w;
wire s01_axi_wready;
wire [1 : 0] s01_axi_bresp;
wire s01_axi_bvalid;
wire s01_axi_bready = m00_axi_bready;//?? && is_led_key_w;
wire s01_axi_bready = m00_axi_bready;//?? && is_uart_w;
wire [3 : 0] s01_axi_araddr = m00_axi_araddr;
wire [2 : 0] s01_axi_arprot = m00_axi_arprot;
wire s01_axi_arvalid = m00_axi_arvalid && is_led_key_r;
wire s01_axi_arvalid = m00_axi_arvalid && is_uart_r;
wire s01_axi_arready;
wire [31 : 0] s01_axi_rdata;
wire [1 : 0] s01_axi_rresp;
wire s01_axi_rvalid;
wire s01_axi_rready = m00_axi_rready && is_led_key_r;
wire s01_axi_rready = m00_axi_rready && is_uart_r;
hdl4se_uart_ctrl_axi (
.s00_axi_aclk(wClk),
......@@ -270,7 +270,11 @@ module de1_riscv_axi(
.s00_axi_rvalid(s01_axi_rvalid),
.s00_axi_rready(s01_axi_rready),
.uart_tx(uart_tx),
.uart_rx(uart_rx)
.uart_rx(uart_rx),
.dataready(LEDR[6]),
.sendready(LEDR[7]),
.sendfull(LEDR[8]),
.recvempty(LEDR[9])
);
always @(*)
......
......@@ -103,7 +103,7 @@ module riscv_core_with_axi_master (
regfile regs(regno, regena, wClk, regwrdata, regwren, regrddata);
regfile regs2(regno2, regena2, wClk, regwrdata2, regwren2, regrddata2);
`define ALTERA_
`define ALTERA
`ifdef ALTERA
ram4kB ram(.clock(wClk), .address(ramaddr), .byteena(~bWriteMask), .data(bWriteData), .wren(((bWriteAddr & 32'hff000000) == 0)?wWrite:1'b0), .q(bReadDataRam));
......@@ -136,12 +136,13 @@ module riscv_core_with_axi_master (
//Write Address
wire writeaxi = (wWrite && ((bWriteAddr & 32'hfff00000) != 0));
reg [31:0] awaddr;
reg awvalid;
always @(posedge wClk)
if (~nwReset) begin
awvalid <= 1'b0;
end else if ((wWrite && ((bWriteAddr & 32'hfff00000) != 0))) begin
end else if (writeaxi) begin
awaddr <= bWriteAddr;
awvalid <= 1'b1;
end else if (wAWReady) begin
......@@ -150,7 +151,7 @@ module riscv_core_with_axi_master (
always @(wWrite or awvalid or bWriteAddr or awaddr)
begin
axi_awvalid = (wWrite && ((bWriteAddr & 32'hfff00000) != 0)) ? 1'b1 : awvalid;
axi_awvalid = writeaxi ? 1'b1 : awvalid;
axi_awaddr = wWrite ? bWriteAddr : awaddr;
end
......@@ -162,7 +163,7 @@ module riscv_core_with_axi_master (
begin
if (~nwReset) begin
wvalid <= 1'b0;
end if ((wWrite && ((bWriteAddr & 32'hfff00000) != 0))) begin
end if (writeaxi) begin
wdata <= bWriteData;
wstrb <= ~bWriteMask;
wvalid <= 1'b1;
......@@ -171,22 +172,23 @@ module riscv_core_with_axi_master (
end
end
assign wWriteReady = ((wWrite || wvalid) && wWReady) || (wWrite && ((bWriteAddr & 32'hfff00000) != 0));
assign wWriteReady = ((wWrite || wvalid) && wWReady) || writeaxi;
always @(wWrite or wvalid or bWriteData or wdata or bWriteMask or wstrb)
begin
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;
axi_wvalid = writeaxi ? 1'b1 : wvalid;
axi_wdata = writeaxi ? bWriteData : wdata;
axi_wstrb = writeaxi ? ~bWriteMask : wstrb;
end
wire readaxi = wRead && ((bReadAddr & 32'hfff00000) != 0);
//Read Address
reg [31:0] araddr;
reg arvalid;
always @(posedge wClk)
if (~nwReset) begin
arvalid <= 1'b0;
end else if ((wRead && (bReadAddr & 32'hfff00000) != 0)) begin
end else if (readaxi) begin
araddr <= bReadAddr;
arvalid <= 1'b1;
end else if (wARReady) begin
......@@ -195,7 +197,7 @@ module riscv_core_with_axi_master (
always @(wRead or arvalid or bReadAddr or araddr)
begin
axi_arvalid = (wRead && (bReadAddr & 32'hfff00000) != 0) ? 1'b1 : arvalid;
axi_arvalid = readaxi ? 1'b1 : arvalid;
axi_araddr = wRead ? bReadAddr : araddr;
end
......
......@@ -136,22 +136,17 @@ module hdl4se_uart_ctrl_axi
assign ctl_state = {28'h0, send_buf_full, send_buf_empty, recv_buf_full, ~recv_buf_empty};
/* axi bus */
reg [3 : 0] axi_awaddr;
reg axi_awready;
reg axi_wready;
reg [1 : 0] axi_bresp;
reg axi_bvalid;
reg [3 : 0] axi_araddr;
reg axi_arready;
reg [31 : 0] axi_rdata;
reg [1 : 0] axi_rresp;
reg axi_rvalid;
wire slv_reg_rden;
wire slv_reg_wren;
reg aw_en;
assign s00_axi_awready = axi_awready;
assign s00_axi_wready = axi_wready;
assign s00_axi_awready = 1'b1;
assign s00_axi_wready = 1'b1;
assign s00_axi_bresp = axi_bresp;
assign s00_axi_bvalid = axi_bvalid;
assign s00_axi_arready = axi_arready;
......@@ -159,45 +154,7 @@ module hdl4se_uart_ctrl_axi
assign s00_axi_rdata = axi_rdata;
assign s00_axi_rresp = axi_rresp;
always @( posedge s00_axi_aclk )
begin
if ( s00_axi_aresetn == 1'b0 ) begin
axi_awready <= 1'b0;
aw_en <= 1'b1;
end else begin
if (~axi_awready && s00_axi_awvalid && s00_axi_wvalid && aw_en) begin
axi_awready <= 1'b1;
aw_en <= 1'b0;
end else if (s00_axi_bready && axi_bvalid) begin
aw_en <= 1'b1;
axi_awready <= 1'b1;
end else begin
axi_awready <= 1'b1;
end
end
end
always @( posedge s00_axi_aclk )
begin
if ( s00_axi_aresetn == 1'b0 ) begin
axi_awaddr <= 0;
end else if (~axi_awready && s00_axi_awvalid && s00_axi_wvalid && aw_en) begin
axi_awaddr <= s00_axi_awaddr;
end
end
always @( posedge s00_axi_aclk )
begin
if ( s00_axi_aresetn == 1'b0 ) begin
axi_wready <= 1'b0;
end else if (~axi_wready && s00_axi_wvalid && s00_axi_awvalid && aw_en ) begin
axi_wready <= 1'b1;
end else begin
axi_wready <= 1'b1;
end
end
assign slv_reg_wren = axi_wready && s00_axi_wvalid && axi_awready && s00_axi_awvalid;
assign slv_reg_wren = s00_axi_wvalid && s00_axi_awvalid;
always @( posedge s00_axi_aclk )
begin
......@@ -222,7 +179,7 @@ module hdl4se_uart_ctrl_axi
if ( s00_axi_aresetn == 1'b0 ) begin
axi_bvalid <= 0;
axi_bresp <= 2'b0;
end else if (axi_awready && s00_axi_awvalid && ~axi_bvalid && axi_wready && s00_axi_wvalid) begin
end else if (slv_reg_wren) begin
axi_bvalid <= 1'b1;
axi_bresp <= 2'b0; // 'OKAY' response
end else if (s00_axi_bready && axi_bvalid) begin
......@@ -230,47 +187,27 @@ module hdl4se_uart_ctrl_axi
end
end
always @( posedge s00_axi_aclk )
begin
if ( s00_axi_aresetn == 1'b0 ) begin
axi_arready <= 1'b0;
axi_araddr <= 32'b0;
end else if (~axi_arready && s00_axi_arvalid) begin
axi_arready <= 1'b1;
axi_araddr <= s00_axi_araddr;
end else begin
axi_arready <= 1'b0;
end
end
always @( posedge s00_axi_aclk )
begin
if ( s00_axi_aresetn == 1'b0 ) begin
axi_rvalid <= 0;
axi_rresp <= 0;
end else if (axi_arready && s00_axi_arvalid && ~axi_rvalid) begin
axi_rvalid <= 1'b1;
axi_rresp <= 2'b0; // 'OKAY' response
end else if (axi_rvalid && s00_axi_rready) begin
axi_rvalid <= 1'b0;
end
end
assign slv_reg_rden = axi_arready & s00_axi_arvalid & ~axi_rvalid;
always @( posedge s00_axi_aclk )
begin
if ( s00_axi_aresetn == 1'b0 ) begin
axi_rdata <= 0;
axi_rvalid <= 0;
recv_buf_read <= 1'b0;
end else if (slv_reg_rden) begin
axi_rresp <= 0;
end else if (s00_axi_arvalid) begin
recv_buf_read <= 1'b0;
if ((s00_axi_araddr & 4'hf) == 8) /* read state */
axi_rvalid <= 0;
if ((s00_axi_araddr & 4'hf) == 8) begin /* read state */
axi_rdata <= ctl_state;
else if ((s00_axi_araddr & 4'hf) == 0) /* read recv */
axi_rvalid <= 1;
end else if ((s00_axi_araddr & 4'hf) == 0) begin/* read recv */
axi_rdata <= {recv_buf_empty, 23'b0, recv_buf_q};
recv_buf_read <= ~recv_buf_empty;
axi_rvalid <= 1;
end
end else begin
recv_buf_read <= 1'b0;
recv_buf_read <= 0;
axi_rvalid <= 0;
end
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册