3 use ieee.std_logic_1164.
all;
4 use ieee.numeric_std.
all;
6 entity ReconPixelIndex
is
8 Reset_n
: in std_logic;
10 in_request
: out std_logic;
11 in_valid
: in std_logic;
12 in_data
: in signed
(31 downto 0);
14 out_requested
: in std_logic;
15 out_valid
: out std_logic;
16 out_data
: out signed
(31 downto 0)
18 end entity ReconPixelIndex
;
20 architecture a_ReconPixelIndex
of ReconPixelIndex
is
23 WIDTH
: positive
:= 32);
25 Reset_n
: in std_logic;
27 in_request
: out std_logic;
28 in_valid
: in std_logic;
29 dividend
: in unsigned
(WIDTH
-1 downto 0);
30 divisor
: in unsigned
(WIDTH
-1 downto 0);
32 out_requested
: in std_logic;
33 out_valid
: out std_logic;
34 quotient
: out unsigned
(WIDTH
-1 downto 0);
35 remainder
: out unsigned
(WIDTH
-1 downto 0));
40 constant VFRAGPIXELS
: unsigned
(3 downto 0) := x"
8"
;
41 constant HFRAGPIXELS
: unsigned
(3 downto 0) := x"
8"
;
43 constant RPI_POS_WIDTH
: positive
:= 17;
44 constant HV_FRAG_WIDTH
: positive
:= 8;
45 constant Y_STRIDE_WIDTH
: positive
:= 12;
46 constant UV_STRIDE_WIDTH
: positive
:= 11;
47 constant Y_PL_FRAG_WIDTH
: positive
:= 21;
48 constant UV_PL_FRAG_WIDTH
: positive
:= 19;
49 constant RECON_Y_DATA_OFS_WIDTH
: positive
:= 20;
50 constant RECON_UV_DATA_OFS_WIDTH
: positive
:= 20;
53 type state_t
is (stt_readIn
, stt_Proc
, stt_WriteOut
);
54 signal state
: state_t
;
56 type read_state_t
is (stt_read_HFragments
,
57 stt_read_YPlaneFragments
,
59 stt_read_UVPlaneFragments
,
62 stt_read_ReconYDataOffset
,
63 stt_read_ReconUDataOffset
,
64 stt_read_ReconVDataOffset
,
66 signal read_state
: read_state_t
;
68 type proc_state_t
is (stt_proc_1
, stt_proc_2
);
69 signal proc_state
: proc_state_t
;
71 -- Signals that will be received
72 signal rpi_position
: unsigned
(RPI_POS_WIDTH
-1 downto 0);
73 signal HFragments
: unsigned
(HV_FRAG_WIDTH
-1 downto 0);
74 -- signal VFragments : unsigned(HV_FRAG_WIDTH-1 downto 0);
75 signal YStride
: unsigned
(Y_STRIDE_WIDTH
-1 downto 0);
76 signal UVStride
: unsigned
(UV_STRIDE_WIDTH
-1 downto 0);
77 signal YPlaneFragments
: unsigned
(Y_PL_FRAG_WIDTH
-1 downto 0);
78 signal UVPlaneFragments
: unsigned
(UV_PL_FRAG_WIDTH
-1 downto 0);
79 signal ReconYDataOffset
: unsigned
(RECON_Y_DATA_OFS_WIDTH
-1 downto 0);
80 signal ReconUDataOffset
: unsigned
(RECON_UV_DATA_OFS_WIDTH
-1 downto 0);
81 signal ReconVDataOffset
: unsigned
(RECON_UV_DATA_OFS_WIDTH
-1 downto 0);
84 signal rpi_value
: signed
(31 downto 0);
87 signal s_in_request
: std_logic;
88 signal s_out_valid
: std_logic;
91 signal s_divider_in_request
: std_logic;
92 signal s_divider_in_valid
: std_logic;
93 signal s_divider_dividend
: unsigned
(RPI_POS_WIDTH
-1 downto 0);
94 signal s_divider_divisor
: unsigned
(RPI_POS_WIDTH
-1 downto 0);
95 signal s_divider_out_requested
: std_logic;
96 signal s_divider_out_valid
: std_logic;
97 signal s_divider_quotient
: unsigned
(RPI_POS_WIDTH
-1 downto 0);
98 signal s_divider_remainder
: unsigned
(RPI_POS_WIDTH
-1 downto 0);
101 begin -- a_ReconPixelIndex
104 generic map (WIDTH
=> RPI_POS_WIDTH
)
107 in_request
=> s_divider_out_requested
,
108 in_valid
=> s_divider_out_valid
,
109 dividend
=> s_divider_dividend
,
110 divisor
=> s_divider_divisor
,
111 out_requested
=> s_divider_in_request
,
112 out_valid
=> s_divider_in_valid
,
113 quotient
=> s_divider_quotient
,
114 remainder
=> s_divider_remainder
);
116 in_request
<= s_in_request
;
117 out_valid
<= s_out_valid
;
125 if (s_in_request
= '1' and in_valid
= '1') then
128 when stt_read_HFragments
=>
129 read_state
<= stt_read_YPlaneFragments
;
130 HFragments
<= unsigned
(in_data
(HV_FRAG_WIDTH
-1 downto 0));
132 when stt_read_YPlaneFragments
=>
133 read_state
<= stt_read_YStride
;
134 YPlaneFragments
<= unsigned
(in_data
(Y_PL_FRAG_WIDTH
-1 downto 0));
136 when stt_read_YStride
=>
137 read_state
<= stt_read_UVPlaneFragments
;
138 YStride
<= unsigned
(in_data
(Y_STRIDE_WIDTH
-1 downto 0));
140 when stt_read_UVPlaneFragments
=>
141 read_state
<= stt_read_UVStride
;
142 UVPlaneFragments
<= unsigned
(in_data
(UV_PL_FRAG_WIDTH
-1 downto 0));
144 when stt_read_UVStride
=>
145 read_state
<= stt_read_VFragments
;
146 UVStride
<= unsigned
(in_data
(UV_STRIDE_WIDTH
-1 downto 0));
148 when stt_read_VFragments
=>
149 read_state
<= stt_read_ReconYDataOffset
;
150 -- VFragments <= unsigned(in_data(HV_FRAG_WIDTH-1 downto 0));
152 when stt_read_ReconYDataOffset
=>
153 read_state
<= stt_read_ReconUDataOffset
;
154 ReconYDataOffset
<= unsigned
(in_data
(RECON_Y_DATA_OFS_WIDTH
-1 downto 0));
156 when stt_read_ReconUDataOffset
=>
157 read_state
<= stt_read_ReconVDataOffset
;
158 ReconUDataOffset
<= unsigned
(in_data
(RECON_UV_DATA_OFS_WIDTH
-1 downto 0));
160 when stt_read_ReconVDataOffset
=>
161 read_state
<= stt_read_Position
;
162 ReconVDataOffset
<= unsigned
(in_data
(RECON_UV_DATA_OFS_WIDTH
-1 downto 0));
164 when others => -- stt_read_Position
165 read_state
<= stt_read_Position
;
167 proc_state
<= stt_proc_1
;
168 rpi_position
<= unsigned
(in_data
(RPI_POS_WIDTH
-1 downto 0));
172 end procedure ReadIn
;
176 s_divider_out_valid
<= '0';
177 s_divider_in_request
<= '0';
180 if (s_divider_out_requested
= '1') then
181 s_divider_out_valid
<= '1';
182 s_divider_in_request
<= '1';
183 proc_state
<= stt_proc_2
;
184 if (rpi_position
< YPlaneFragments
) then
185 s_divider_dividend
<= rpi_position
;
186 s_divider_divisor
<= resize
(HFragments
, RPI_POS_WIDTH
);
187 rpi_value
<= resize
(signed
('0' & ReconYDataOffset), 32);
189 elsif (rpi_position < YPlaneFragments + UVPlaneFragments) then
190 s_divider_dividend <= resize(rpi_position - YPlaneFragments, RPI_POS_WIDTH);
191 s_divider_divisor <= resize(SHIFT_RIGHT(HFragments, 1), RPI_POS_WIDTH);
192 rpi_value <= resize(signed('0' & ReconUDataOffset
) , 32);
194 s_divider_dividend
<= resize
(rpi_position
- (YPlaneFragments
+ UVPlaneFragments
), RPI_POS_WIDTH
);
195 s_divider_divisor
<= resize
(SHIFT_RIGHT
(HFragments
, 1), RPI_POS_WIDTH
);
196 rpi_value
<= resize
(signed
('0' & ReconVDataOffset), 32);
203 s_divider_in_request <= '1';
204 if (s_divider_in_request = '1' and s_divider_in_valid = '1') then
205 s_divider_in_request <= '0';
206 proc_state <= stt_proc_1;
207 state <= stt_WriteOut;
209 if (rpi_position < YPlaneFragments) then
210 rpi_value <= rpi_value +
212 (s_divider_quotient
* VFRAGPIXELS
* YStride
+
213 s_divider_remainder
* HFRAGPIXELS
)), 32);
215 rpi_value
<= rpi_value
+
217 (s_divider_quotient * VFRAGPIXELS * UVStride +
218 s_divider_remainder * HFRAGPIXELS)), 32);
226 procedure WriteOut is
229 out_data <= rpi_value;
230 if (out_requested = '1') then
233 end procedure WriteOut;
238 if (clk'event and clk = '1') then
239 if (Reset_n = '0') then
241 read_state <= stt_read_HFragments;
242 proc_state <= stt_proc_1;
247 when stt_readIn => ReadIn;
248 when stt_Proc => Proc;
249 when others => WriteOut;
256 end a_ReconPixelIndex;