axis_wb_bridge: Fix wishbone handshaking
The wishbone transfer logic is incorrect. We need to use signals from the
current cycle, not the previous one.
Fixes: 7514231
("Add AXIS-Wishbone bridge")
Signed-off-by: Sean Anderson <seanga2@gmail.com>
This commit is contained in:
parent
a5d1eff22b
commit
1bbb6d7f41
|
@ -46,8 +46,8 @@ module axis_wb_bridge (
|
||||||
localparam RESP1 = 9;
|
localparam RESP1 = 9;
|
||||||
localparam RESP0 = 10;
|
localparam RESP0 = 10;
|
||||||
|
|
||||||
reg s_axis_ready_next, s_axis_valid_last, m_axis_valid_next;
|
reg s_axis_ready_next, m_axis_valid_next;
|
||||||
reg [7:0] s_axis_data_last, m_axis_data_next;
|
reg [7:0] m_axis_data_next;
|
||||||
reg wb_ack_last, wb_err_last;
|
reg wb_ack_last, wb_err_last;
|
||||||
reg wb_stb_next, wb_we_next;
|
reg wb_stb_next, wb_we_next;
|
||||||
reg [ADDR_WIDTH - 1:0] wb_addr_next;
|
reg [ADDR_WIDTH - 1:0] wb_addr_next;
|
||||||
|
@ -75,12 +75,12 @@ module axis_wb_bridge (
|
||||||
overflow_latch_next = overflow_latch || overflow;
|
overflow_latch_next = overflow_latch || overflow;
|
||||||
|
|
||||||
case (state)
|
case (state)
|
||||||
IDLE: if (s_axis_valid_last) begin
|
IDLE: if (s_axis_valid && s_axis_ready) begin
|
||||||
if (s_axis_data_last[0])
|
if (s_axis_data[0])
|
||||||
wb_addr_next = {ADDR_WIDTH{1'b0}};
|
wb_addr_next = {ADDR_WIDTH{1'b0}};
|
||||||
wb_we_next = s_axis_data_last[1];
|
wb_we_next = s_axis_data[1];
|
||||||
postinc_next = s_axis_data_last[2];
|
postinc_next = s_axis_data[2];
|
||||||
case (s_axis_data_last[4:3])
|
case (s_axis_data[4:3])
|
||||||
2'd3: state_next = ADDR3;
|
2'd3: state_next = ADDR3;
|
||||||
2'd2: state_next = ADDR1;
|
2'd2: state_next = ADDR1;
|
||||||
2'd1: state_next = ADDR0;
|
2'd1: state_next = ADDR0;
|
||||||
|
@ -93,24 +93,24 @@ module axis_wb_bridge (
|
||||||
end
|
end
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
ADDR3: if (s_axis_valid_last) begin
|
ADDR3: if (s_axis_valid && s_axis_ready) begin
|
||||||
if (ADDR_WIDTH >= 32)
|
if (ADDR_WIDTH >= 32)
|
||||||
wb_addr_next[31:24] = s_axis_data_last;
|
wb_addr_next[31:24] = s_axis_data;
|
||||||
state_next = ADDR2;
|
state_next = ADDR2;
|
||||||
end
|
end
|
||||||
ADDR2: if (s_axis_valid_last) begin
|
ADDR2: if (s_axis_valid && s_axis_ready) begin
|
||||||
if (ADDR_WIDTH >= 24)
|
if (ADDR_WIDTH >= 24)
|
||||||
wb_addr_next[23:16] = s_axis_data_last;
|
wb_addr_next[23:16] = s_axis_data;
|
||||||
state_next = ADDR1;
|
state_next = ADDR1;
|
||||||
end
|
end
|
||||||
ADDR1: if (s_axis_valid_last) begin
|
ADDR1: if (s_axis_valid && s_axis_ready) begin
|
||||||
if (ADDR_WIDTH >= 16)
|
if (ADDR_WIDTH >= 16)
|
||||||
wb_addr_next[15:8] = s_axis_data_last;
|
wb_addr_next[15:8] = s_axis_data;
|
||||||
state_next = ADDR0;
|
state_next = ADDR0;
|
||||||
end
|
end
|
||||||
ADDR0: if (s_axis_valid_last) begin
|
ADDR0: if (s_axis_valid && s_axis_ready) begin
|
||||||
if (ADDR_WIDTH >= 8)
|
if (ADDR_WIDTH >= 8)
|
||||||
wb_addr_next[7:0] = s_axis_data_last;
|
wb_addr_next[7:0] = s_axis_data;
|
||||||
if (wb_we) begin
|
if (wb_we) begin
|
||||||
state_next = DATA1;
|
state_next = DATA1;
|
||||||
end else begin
|
end else begin
|
||||||
|
@ -119,12 +119,12 @@ module axis_wb_bridge (
|
||||||
s_axis_ready_next = 0;
|
s_axis_ready_next = 0;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
DATA1: if (s_axis_valid_last) begin
|
DATA1: if (s_axis_valid && s_axis_ready) begin
|
||||||
wb_data_write_next = { wb_data_write[7:0], s_axis_data_last };
|
wb_data_write_next = { wb_data_write[7:0], s_axis_data };
|
||||||
state_next = DATA0;
|
state_next = DATA0;
|
||||||
end
|
end
|
||||||
DATA0: if(s_axis_valid_last) begin
|
DATA0: if(s_axis_valid && s_axis_ready) begin
|
||||||
wb_data_write_next = { wb_data_write[7:0], s_axis_data_last };
|
wb_data_write_next = { wb_data_write[7:0], s_axis_data };
|
||||||
state_next = BUS;
|
state_next = BUS;
|
||||||
wb_stb_next = 1;
|
wb_stb_next = 1;
|
||||||
s_axis_ready_next = 0;
|
s_axis_ready_next = 0;
|
||||||
|
@ -154,7 +154,6 @@ module axis_wb_bridge (
|
||||||
end
|
end
|
||||||
|
|
||||||
always @(posedge clk) begin
|
always @(posedge clk) begin
|
||||||
s_axis_data_last <= s_axis_data;
|
|
||||||
m_axis_data <= m_axis_data_next;
|
m_axis_data <= m_axis_data_next;
|
||||||
wb_we <= wb_we_next;
|
wb_we <= wb_we_next;
|
||||||
wb_addr <= wb_addr_next;
|
wb_addr <= wb_addr_next;
|
||||||
|
@ -166,7 +165,6 @@ module axis_wb_bridge (
|
||||||
always @(posedge clk, posedge rst) begin
|
always @(posedge clk, posedge rst) begin
|
||||||
if (rst) begin
|
if (rst) begin
|
||||||
s_axis_ready <= 1;
|
s_axis_ready <= 1;
|
||||||
s_axis_valid_last <= 0;
|
|
||||||
m_axis_valid <= 0;
|
m_axis_valid <= 0;
|
||||||
wb_ack_last <= 0;
|
wb_ack_last <= 0;
|
||||||
wb_err_last <= 0;
|
wb_err_last <= 0;
|
||||||
|
@ -175,7 +173,6 @@ module axis_wb_bridge (
|
||||||
overflow_latch <= 0;
|
overflow_latch <= 0;
|
||||||
end else begin
|
end else begin
|
||||||
s_axis_ready <= s_axis_ready_next;
|
s_axis_ready <= s_axis_ready_next;
|
||||||
s_axis_valid_last <= s_axis_valid;
|
|
||||||
m_axis_valid <= m_axis_valid_next;
|
m_axis_valid <= m_axis_valid_next;
|
||||||
wb_ack_last <= wb_ack;
|
wb_ack_last <= wb_ack;
|
||||||
wb_err_last <= wb_err;
|
wb_err_last <= wb_err;
|
||||||
|
|
Loading…
Reference in New Issue