fix: Corrects ready signal and data buffering logic

- Corrects the ready signal to properly reflect buffer status.
- Modifies data buffering logic to ensure proper data handling.
- Updates the ready signal to high when buffer is not full.
This commit is contained in:
2025-07-11 10:17:37 +00:00
parent 5e1a3c2161
commit 506f2edabb

View File

@@ -7,14 +7,14 @@ entity PipelineBufferController is
generic ( generic (
--@ Reset active at this level --@ Reset active at this level
G_ResetActiveAt : std_logic := '1' G_ResetActiveAt : std_logic := '1'
); );
port ( port (
--@ Clock signal; (**Rising edge** triggered) --@ Clock signal; (**Rising edge** triggered)
I_CLK : in std_logic := '0'; I_CLK : in std_logic := '0';
--@ Reset; (**Synchronous**, **Active at `G_ResetActiveAt`**) --@ Reset; (**Synchronous**, **Active at `G_ResetActiveAt`**)
I_RST : in std_logic := '0'; I_RST : in std_logic := '0';
--@ Chip enable; (**Synchronous**, **Active high**) --@ Chip enable; (**Synchronous**, **Active high**)
I_CE : in std_logic := '1'; I_CE : in std_logic := '1';
--@ [1]: If low, data is passed through, else data is registered --@ [1]: If low, data is passed through, else data is registered
--@ [0]: Enable for register --@ [0]: Enable for register
@@ -22,46 +22,50 @@ entity PipelineBufferController is
--@ @virtualbus AXI-Flags-In @dir In Input interface for AXI-like handshake --@ @virtualbus AXI-Flags-In @dir In Input interface for AXI-like handshake
--@ AXI like valid; (**Synchronous**, **Active high**) --@ AXI like valid; (**Synchronous**, **Active high**)
I_Valid : in std_logic := '0'; I_Valid : in std_logic := '0';
--@ AXI like ready; (**Synchronous**, **Active high**) --@ AXI like ready; (**Synchronous**, **Active high**)
O_Ready : out std_logic := '0'; O_Ready : out std_logic := '0';
--@ @end --@ @end
--@ @virtualbus AXI-Flags-Out @dir Out Output interface for AXI-like handshake --@ @virtualbus AXI-Flags-Out @dir Out Output interface for AXI-like handshake
--@ AXI like valid; (**Synchronous**, **Active high**) --@ AXI like valid; (**Synchronous**, **Active high**)
O_Valid : out std_logic := '0'; O_Valid : out std_logic := '0';
--@ AXI like ready; (**Synchronous**, **Active high**) --@ AXI like ready; (**Synchronous**, **Active high**)
I_Ready : in std_logic := '0' I_Ready : in std_logic := '0'
--@ @end --@ @end
); );
end entity PipelineBufferController; end entity PipelineBufferController;
architecture RTL of PipelineBufferController is architecture RTL of PipelineBufferController is
signal C_MUX : std_logic := '0'; signal C_MUX : std_logic := '0';
signal C_Enable : std_logic := '0'; signal C_Enable : std_logic := '0';
signal R_IsBuffered : std_logic := '0'; signal R_IsBuffered : std_logic := '0';
signal R_Ready : std_logic := '1';
begin begin
--@ Set mux to buffered mode if data is available in the buffer. --@ Set mux to buffered mode if data is available in the buffer.
C_MUX <= R_IsBuffered; C_MUX <= R_IsBuffered;
--@ Enable the buffer register if not buffered and chip enable is high. --@ Enable the buffer register if not buffered and chip enable is high.
C_Enable <= I_CE and not R_IsBuffered; C_Enable <= I_CE and not R_IsBuffered;
--@ Set the ready signal to high if not buffered.
O_Ready <= not R_IsBuffered;
--@ Set the valid signal to high if data is available in the buffer or if data is valid. --@ Set the valid signal to high if data is available in the buffer or if data is valid.
O_Valid <= R_IsBuffered or I_Valid; O_Valid <= R_IsBuffered or I_Valid;
O_Ready <= R_Ready;
process (I_CLK) process (I_CLK)
begin begin
if rising_edge(I_CLK) then if rising_edge(I_CLK) then
if I_RST = G_ResetActiveAt then if I_RST = G_ResetActiveAt then
R_IsBuffered <= '0'; R_IsBuffered <= '0';
R_Ready <= '1';
elsif I_CE = '1' then elsif I_CE = '1' then
if R_IsBuffered = '0' and I_Valid = '1' then if R_IsBuffered = '0' and I_Valid = '1' then
R_IsBuffered <= '1'; R_IsBuffered <= '1';
R_Ready <= '0';
elsif I_Ready = '1' and (R_IsBuffered or I_Valid) = '1' then elsif I_Ready = '1' and (R_IsBuffered or I_Valid) = '1' then
R_IsBuffered <= '0'; R_IsBuffered <= '0';
R_Ready <= '1';
end if; end if;
end if; end if;
end if; end if;