OpenCores
URL https://opencores.org/ocsvn/viterbi_decoder_axi4s/viterbi_decoder_axi4s/trunk

Subversion Repositories viterbi_decoder_axi4s

[/] [viterbi_decoder_axi4s/] [trunk/] [src/] [axi4s_buffer.vhd] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 mfehrenz
--!
2
--! Copyright (C) 2012 - 2014 Creonic GmbH
3
--!
4
--! This file is part of the Creonic Viterbi Decoder, which is distributed
5
--! under the terms of the GNU General Public License version 2.
6
--!
7
--! @file
8
--! @brief  AXI4-Stream buffer that allows to buffer the accept-signal.
9
--! @author Matthias Alles
10
--! @date   2012/04/18
11
--!
12
--! @details
13
--! One problem when concatenating multiple AXI4-Stream builind blocks is that
14
--! the accept signal has to pass from the very last component to the input
15
--! of the very first component. Only then it is possible to have an interruption
16
--! free data processing within the whole chain. The drawback of this approach is
17
--! that the accept signal has a long path and high fanouts.
18
--! This entity allows to use registers on the accept signals by introducing buffers
19
--! for storing the input values. It should improve timing of bigger building blocks.
20
--!
21
 
22
library ieee;
23
use ieee.std_logic_1164.all;
24
 
25
 
26
entity axi4s_buffer is
27
        generic (
28
                DATA_WIDTH : natural := 1
29
        );
30
        port (
31
 
32
        clk            : in  std_logic;
33
        rst            : in  std_logic;
34
 
35
        -- Input data handling
36
        ----------------------
37
 
38
        input          : in  std_logic_vector(DATA_WIDTH - 1 downto 0);
39
        input_valid    : in  std_logic;
40
        input_last     : in  std_logic;
41
        input_accept   : out std_logic;
42
 
43
 
44
        -- Output data handling
45
        -----------------------
46
        output         : out std_logic_vector(DATA_WIDTH - 1 downto 0);
47
        output_valid   : out std_logic;
48
        output_last    : out std_logic;
49
        output_accept  : in  std_logic
50
);
51
end entity axi4s_buffer;
52
 
53
 
54
architecture rtl of axi4s_buffer is
55
 
56
 
57
        signal input_accept_int : std_logic;
58
 
59
        signal output_reg        : std_logic_vector(DATA_WIDTH - 1 downto 0);
60
        signal output_last_reg   : std_logic;
61
        signal output_valid_reg  : std_logic;
62
 
63
        signal buffer_full : std_logic;
64
        signal buffer_data : std_logic_vector(DATA_WIDTH - 1 downto 0);
65
        signal buffer_last : std_logic;
66
 
67
begin
68
 
69
        input_accept <= input_accept_int;
70
 
71
        output       <= output_reg;
72
        output_last  <= output_last_reg;
73
        output_valid <= output_valid_reg;
74
 
75
        --
76
        -- This process registers all signals.
77
        -- No combinatorial logic is bypassed from input to output and vice versa.
78
        --
79
        pr_reg: process(clk) is
80
        begin
81
        if rising_edge(clk) then
82
                if rst = '1' then
83
                        output_reg        <= (others => '0');
84
                        output_last_reg   <= '0';
85
                        output_valid_reg  <= '0';
86
 
87
                        input_accept_int <= '1';
88
 
89
                        buffer_full <= '0';
90
                        buffer_data <= (others => '0');
91
                        buffer_last <= '0';
92
                else
93
 
94
                        --
95
                        -- Data is coming, buf output data can't be sent => Store input data in buffer
96
                        -- and remove input_accept signal!
97
                        --
98
                        if input_valid = '1' and input_accept_int = '1' and output_valid_reg = '1' and output_accept = '0' then
99
                                buffer_data      <= input;
100
                                buffer_last      <= input_last;
101
                                buffer_full      <= '1';
102
                                input_accept_int <= '0';
103
                        end if;
104
 
105
                        --
106
                        -- Output data is being read but there is data in the buffer waiting for being sent
107
                        -- => Use the buffer data!
108
                        --
109
                        if output_accept = '1' and output_valid_reg = '1' and buffer_full = '1' then
110
                                output_reg       <= buffer_data;
111
                                output_last_reg  <= buffer_last;
112
                                output_valid_reg <= '1';
113
                                buffer_full      <= '0';
114
                                input_accept_int <= '1';
115
 
116
                        --
117
                        -- Data is being read and buffer is empty => Use input data directly!
118
                        -- Output register is empty => Use input data directly!
119
                        --
120
                        elsif (output_accept = '1' and output_valid_reg = '1') or output_valid_reg = '0' then
121
                                output_reg       <= input;
122
                                output_last_reg  <= input_last;
123
                                output_valid_reg <= input_valid;
124
                        end if;
125
 
126
                end if;
127
        end if;
128
        end process pr_reg;
129
 
130
end architecture rtl;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.