@@ -34,6 +34,7 @@ use fpga_cores.common_pkg.all;
3434use fpga_cores.axi_pkg.all ;
3535
3636use work.dvb_utils_pkg.all ;
37+ use work.constellation_mapper_pkg.all ;
3738
3839------------------------
3940-- Entity declaration --
@@ -46,189 +47,47 @@ entity axi_constellation_mapper is
4647 );
4748 port (
4849 -- Usual ports
49- clk : in std_logic ;
50- rst : in std_logic ;
51- -- Mapping RAM config
52- ram_wren : in std_logic ;
53- ram_addr : in std_logic_vector (6 downto 0 );
54- ram_wdata : in std_logic_vector (OUTPUT_DATA_WIDTH - 1 downto 0 );
55- ram_rdata : out std_logic_vector (OUTPUT_DATA_WIDTH - 1 downto 0 );
50+ clk : in std_logic ;
51+ rst : in std_logic ;
5652 -- AXI data input
57- s_frame_type : in frame_type_t;
58- s_constellation : in constellation_t;
59- s_code_rate : in code_rate_t;
60- s_tready : out std_logic ;
61- s_tvalid : in std_logic ;
62- s_tlast : in std_logic ;
63- s_tdata : in std_logic_vector (INPUT_DATA_WIDTH - 1 downto 0 );
64- s_tid : in std_logic_vector (TID_WIDTH - 1 downto 0 );
53+ s_frame_type : in frame_type_t;
54+ s_constellation : in constellation_t;
55+ s_code_rate : in code_rate_t;
56+ s_tready : out std_logic ;
57+ s_tvalid : in std_logic ;
58+ s_tlast : in std_logic ;
59+ s_tdata : in std_logic_vector (INPUT_DATA_WIDTH - 1 downto 0 );
60+ s_tid : in std_logic_vector (TID_WIDTH - 1 downto 0 );
6561 -- AXI output
66- m_tready : in std_logic ;
67- m_tvalid : out std_logic ;
68- m_tlast : out std_logic ;
69- m_tdata : out std_logic_vector (OUTPUT_DATA_WIDTH - 1 downto 0 );
70- m_tid : out std_logic_vector (TID_WIDTH - 1 downto 0 ));
62+ m_tready : in std_logic ;
63+ m_tvalid : out std_logic ;
64+ m_tlast : out std_logic ;
65+ m_tdata : out std_logic_vector (OUTPUT_DATA_WIDTH - 1 downto 0 );
66+ m_tid : out std_logic_vector (TID_WIDTH - 1 downto 0 );
67+ -- IQ mapping RAM config (optional, default values should work)
68+ iq_ram_wren : in std_logic := 'U' ;
69+ iq_ram_addr : in std_logic_vector (5 downto 0 ) := (others => 'U' );
70+ iq_ram_wdata : in std_logic_vector (OUTPUT_DATA_WIDTH - 1 downto 0 ) := (others => 'U' );
71+ iq_ram_rdata : out std_logic_vector (OUTPUT_DATA_WIDTH - 1 downto 0 );
72+ -- Mapping RAM config (optional, default values should work)
73+ radius_ram_wren : in std_logic := 'U' ;
74+ radius_ram_addr : in std_logic_vector (numbits(RADIUS_TABLE_DEPTH) - 1 downto 0 ) := (others => 'U' );
75+ radius_ram_wdata : in std_logic_vector (OUTPUT_DATA_WIDTH - 1 downto 0 ) := (others => 'U' );
76+ radius_ram_rdata : out std_logic_vector (OUTPUT_DATA_WIDTH - 1 downto 0 )
77+ );
7178end axi_constellation_mapper;
7279
7380architecture axi_constellation_mapper of axi_constellation_mapper is
7481
75- constant BASE_OFFSET_QPSK : integer := 0 ;
76- constant BASE_OFFSET_8PSK : integer := BASE_OFFSET_QPSK + 4 ;
77- constant BASE_OFFSET_16APSK : integer := BASE_OFFSET_8PSK + 8 ;
78- constant BASE_OFFSET_32APSK : integer := BASE_OFFSET_16APSK + 16 ;
79-
80- -- Small helpers to reduce footprint of calling this over and over
81- impure function get_iq_pair (constant x : real ) return std_logic_vector is
82- variable result : std_logic_vector (OUTPUT_DATA_WIDTH - 1 downto 0 );
83- begin
84- return std_logic_vector (cos (x, OUTPUT_DATA_WIDTH/ 2 ) & sin (x, OUTPUT_DATA_WIDTH/ 2 ));
85- end function get_iq_pair;
86-
87- constant MAPPING_TABLE : std_logic_array_t(0 to 59 )(OUTPUT_DATA_WIDTH - 1 downto 0 ) := (
88- -- QPSK
89- 0 => get_iq_pair( MATH_PI / 4.0 ),
90- 1 => get_iq_pair( 7.0 * MATH_PI / 4.0 ),
91- 2 => get_iq_pair( 3.0 * MATH_PI / 4.0 ),
92- 3 => get_iq_pair( 5.0 * MATH_PI / 4.0 ),
93-
94- -- 8PSK
95- 4 => get_iq_pair( MATH_PI / 4.0 ),
96- 5 => get_iq_pair( 0.0 ),
97- 6 => get_iq_pair( 4.0 * MATH_PI / 4.0 ),
98- 7 => get_iq_pair( 5.0 * MATH_PI / 4.0 ),
99- 8 => get_iq_pair( 2.0 * MATH_PI / 4.0 ),
100- 9 => get_iq_pair( 7.0 * MATH_PI / 4.0 ),
101- 10 => get_iq_pair( 3.0 * MATH_PI / 4.0 ),
102- 11 => get_iq_pair( 6.0 * MATH_PI / 4.0 ),
103-
104- -- 16APSK (although here we only have the the PSK part)
105- 12 => get_iq_pair( MATH_PI / 4.0 ),
106- 13 => get_iq_pair( - MATH_PI / 4.0 ),
107- 14 => get_iq_pair( 3.0 * MATH_PI / 4.0 ),
108- 15 => get_iq_pair( - 3.0 * MATH_PI / 4.0 ),
109- 16 => get_iq_pair( MATH_PI / 12.0 ),
110- 17 => get_iq_pair( - MATH_PI / 12.0 ),
111- 18 => get_iq_pair( 11.0 * MATH_PI / 12.0 ),
112- 19 => get_iq_pair(- 11.0 * MATH_PI / 12.0 ),
113- 20 => get_iq_pair( 5.0 * MATH_PI / 12.0 ),
114- 21 => get_iq_pair( - 5.0 * MATH_PI / 12.0 ),
115- 22 => get_iq_pair( 7.0 * MATH_PI / 12.0 ),
116- 23 => get_iq_pair( - 7.0 * MATH_PI / 12.0 ),
117- 24 => get_iq_pair( MATH_PI / 4.0 ),
118- 25 => get_iq_pair( - MATH_PI / 4.0 ),
119- 26 => get_iq_pair( 3.0 * MATH_PI / 4.0 ),
120- 27 => get_iq_pair( - 3.0 * MATH_PI / 4.0 ),
121-
122- -- 32APSK (although here we only have the the PSK part)
123- 28 => get_iq_pair( MATH_PI / 4.0 ),
124- 29 => get_iq_pair( 5.0 * MATH_PI / 12.0 ),
125- 30 => get_iq_pair( - MATH_PI / 4.0 ),
126- 31 => get_iq_pair( - 5.0 * MATH_PI / 12.0 ),
127- 32 => get_iq_pair( 3.0 * MATH_PI / 4.0 ),
128- 33 => get_iq_pair( 7.0 * MATH_PI / 12.0 ),
129- 34 => get_iq_pair( - 3.0 * MATH_PI / 4.0 ),
130- 35 => get_iq_pair( - 7.0 * MATH_PI / 12.0 ),
131- 36 => get_iq_pair( MATH_PI / 8.0 ),
132- 37 => get_iq_pair( 3.0 * MATH_PI / 8.0 ),
133- 38 => get_iq_pair( - MATH_PI / 4.0 ),
134- 39 => get_iq_pair( - MATH_PI / 2.0 ),
135- 40 => get_iq_pair( 3.0 * MATH_PI / 4.0 ),
136- 41 => get_iq_pair( MATH_PI / 2.0 ),
137- 42 => get_iq_pair( - 7.0 * MATH_PI / 8.0 ),
138- 43 => get_iq_pair( - 5.0 * MATH_PI / 8.0 ),
139- 44 => get_iq_pair( MATH_PI / 12.0 ),
140- 45 => get_iq_pair( MATH_PI / 4.0 ),
141- 46 => get_iq_pair( - MATH_PI / 12.0 ),
142- 47 => get_iq_pair( - MATH_PI / 4.0 ),
143- 48 => get_iq_pair( 11.0 * MATH_PI / 12.0 ),
144- 49 => get_iq_pair( 3.0 * MATH_PI / 4.0 ),
145- 50 => get_iq_pair(- 11.0 * MATH_PI / 12.0 ),
146- 51 => get_iq_pair( - 3.0 * MATH_PI / 4.0 ),
147- 52 => get_iq_pair( 0.0 ),
148- 53 => get_iq_pair( MATH_PI / 4.0 ),
149- 54 => get_iq_pair( - MATH_PI / 8.0 ),
150- 55 => get_iq_pair( - 3.0 * MATH_PI / 8.0 ),
151- 56 => get_iq_pair( 7.0 * MATH_PI / 8.0 ),
152- 57 => get_iq_pair( 5.0 * MATH_PI / 8.0 ),
153- 58 => get_iq_pair( MATH_PI ),
154- 59 => get_iq_pair( - 3.0 * MATH_PI / 4.0 )
155- );
156-
157- -- Radius table addresses
158- constant RADIUS_SHORT_16APSK_C2_3 : integer := 0 ;
159- constant RADIUS_SHORT_16APSK_C3_4 : integer := 1 ;
160- constant RADIUS_SHORT_16APSK_C3_5 : integer := 2 ;
161- constant RADIUS_SHORT_16APSK_C4_5 : integer := 3 ;
162- constant RADIUS_SHORT_16APSK_C5_6 : integer := 4 ;
163- constant RADIUS_SHORT_16APSK_C8_9 : integer := 5 ;
164-
165- constant RADIUS_NORMAL_16APSK_C2_3 : integer := 6 ;
166- constant RADIUS_NORMAL_16APSK_C3_4 : integer := 7 ;
167- constant RADIUS_NORMAL_16APSK_C3_5 : integer := 8 ;
168- constant RADIUS_NORMAL_16APSK_C4_5 : integer := 9 ;
169- constant RADIUS_NORMAL_16APSK_C5_6 : integer := 10 ;
170- constant RADIUS_NORMAL_16APSK_C8_9 : integer := 11 ;
171- constant RADIUS_NORMAL_16APSK_C9_10 : integer := 12 ;
172-
173- constant RADIUS_SHORT_32APSK_C3_4 : integer := 13 ;
174- constant RADIUS_SHORT_32APSK_C4_5 : integer := 14 ;
175- constant RADIUS_SHORT_32APSK_C5_6 : integer := 15 ;
176- constant RADIUS_SHORT_32APSK_C8_9 : integer := 16 ;
177-
178- constant RADIUS_NORMAL_32APSK_C3_4 : integer := 17 ;
179- constant RADIUS_NORMAL_32APSK_C4_5 : integer := 18 ;
180- constant RADIUS_NORMAL_32APSK_C5_6 : integer := 19 ;
181- constant RADIUS_NORMAL_32APSK_C8_9 : integer := 20 ;
182- constant RADIUS_NORMAL_32APSK_C9_10 : integer := 21 ;
183-
184- function get_row_content ( constant r0, r1 : real ) return std_logic_vector is
185- constant r0_uns : signed (OUTPUT_DATA_WIDTH/ 2 - 1 downto 0 ) := to_signed_fixed_point(r0, OUTPUT_DATA_WIDTH/ 2 );
186- constant r1_uns : signed (OUTPUT_DATA_WIDTH/ 2 - 1 downto 0 ) := to_signed_fixed_point(r1, OUTPUT_DATA_WIDTH/ 2 );
187- begin
188- return std_logic_vector (r0_uns) & std_logic_vector (r1_uns);
189- end function get_row_content;
190-
191- constant UNIT_RADIUS : signed (OUTPUT_DATA_WIDTH/ 2 - 1 downto 0 ) := to_signed_fixed_point(1.0 , OUTPUT_DATA_WIDTH/ 2 );
192-
193- constant RADIUS_COEFFICIENT_TABLE : std_logic_array_t(0 to 21 )(OUTPUT_DATA_WIDTH - 1 downto 0 ) := (
194- RADIUS_SHORT_16APSK_C2_3 => get_row_content(r0 => 0.31746031746031744 , r1 => 1.0 ),
195- RADIUS_SHORT_16APSK_C3_4 => get_row_content(r0 => 0.3508771929824561 , r1 => 1.0 ),
196- RADIUS_SHORT_16APSK_C3_5 => get_row_content(r0 => 0.27027027027027023 , r1 => 1.0 ),
197- RADIUS_SHORT_16APSK_C4_5 => get_row_content(r0 => 0.36363636363636365 , r1 => 1.0 ),
198- RADIUS_SHORT_16APSK_C5_6 => get_row_content(r0 => 0.37037037037037035 , r1 => 1.0 ),
199- RADIUS_SHORT_16APSK_C8_9 => get_row_content(r0 => 0.3846153846153846 , r1 => 1.0 ),
200-
201- RADIUS_NORMAL_16APSK_C2_3 => get_row_content(r0 => 0.31746031746031744 , r1 => 1.0 ),
202- RADIUS_NORMAL_16APSK_C3_4 => get_row_content(r0 => 0.3508771929824561 , r1 => 1.0 ),
203- RADIUS_NORMAL_16APSK_C3_5 => get_row_content(r0 => 0.27027027027027023 , r1 => 1.0 ),
204- RADIUS_NORMAL_16APSK_C4_5 => get_row_content(r0 => 0.36363636363636365 , r1 => 1.0 ),
205- RADIUS_NORMAL_16APSK_C5_6 => get_row_content(r0 => 0.37037037037037035 , r1 => 1.0 ),
206- RADIUS_NORMAL_16APSK_C8_9 => get_row_content(r0 => 0.3846153846153846 , r1 => 1.0 ),
207- RADIUS_NORMAL_16APSK_C9_10 => get_row_content(r0 => 0.38910505836575876 , r1 => 1.0 ),
208-
209- RADIUS_SHORT_32APSK_C3_4 => get_row_content(r0 => 0.18975332068311196 , r1 => 0.538899430740038 ),
210- RADIUS_SHORT_32APSK_C4_5 => get_row_content(r0 => 0.20533880903490762 , r1 => 0.5585215605749487 ),
211- RADIUS_SHORT_32APSK_C5_6 => get_row_content(r0 => 0.21551724137931036 , r1 => 0.5689655172413793 ),
212- RADIUS_SHORT_32APSK_C8_9 => get_row_content(r0 => 0.23094688221709006 , r1 => 0.5866050808314087 ),
213-
214- RADIUS_NORMAL_32APSK_C3_4 => get_row_content(r0 => 0.18975332068311196 , r1 => 0.538899430740038 ),
215- RADIUS_NORMAL_32APSK_C4_5 => get_row_content(r0 => 0.20533880903490762 , r1 => 0.5585215605749487 ),
216- RADIUS_NORMAL_32APSK_C5_6 => get_row_content(r0 => 0.21551724137931036 , r1 => 0.5689655172413793 ),
217- RADIUS_NORMAL_32APSK_C8_9 => get_row_content(r0 => 0.23094688221709006 , r1 => 0.5866050808314087 ),
218- RADIUS_NORMAL_32APSK_C9_10 => get_row_content(r0 => 0.23255813953488372 , r1 => 0.5883720930232558 )
219- );
220-
221- constant TUSER_WIDTH : integer := TID_WIDTH + ENCODED_CONFIG_WIDTH;
82+ constant MAPPING_TABLE : std_logic_array_t := get_iq_table(OUTPUT_DATA_WIDTH);
83+ constant RADIUS_TABLE : std_logic_array_t := get_radius_table(OUTPUT_DATA_WIDTH);
84+ constant UNIT_RADIUS : signed (OUTPUT_DATA_WIDTH/ 2 - 1 downto 0 ) := to_signed_fixed_point(1.0 , OUTPUT_DATA_WIDTH/ 2 );
85+ constant TUSER_WIDTH : integer := TID_WIDTH + ENCODED_CONFIG_WIDTH;
22286
22387 -------------
22488 -- Signals --
22589 -------------
22690 signal s_tready_i : std_logic ;
227- -- IQ and radius RAM interface
228- signal iq_ram_wren : std_logic ;
229- signal iq_ram_rdata : std_logic_vector (OUTPUT_DATA_WIDTH - 1 downto 0 );
230- signal radius_ram_wren : std_logic ;
231- signal radius_ram_rdata : std_logic_vector (OUTPUT_DATA_WIDTH - 1 downto 0 );
23291
23392 signal mux_sel : std_logic_vector (3 downto 0 );
23493 signal width_conv_tready : std_logic_vector (3 downto 0 );
@@ -255,7 +114,7 @@ architecture axi_constellation_mapper of axi_constellation_mapper is
255114 signal ram_out_i : signed (OUTPUT_DATA_WIDTH/ 2 - 1 downto 0 );
256115 signal ram_out_q : signed (OUTPUT_DATA_WIDTH/ 2 - 1 downto 0 );
257116
258- signal radius_rd_addr : unsigned (numbits(RADIUS_COEFFICIENT_TABLE 'length ) - 1 downto 0 );
117+ signal radius_rd_addr : unsigned (numbits(RADIUS_TABLE_DEPTH ) - 1 downto 0 );
259118
260119 signal radius_0 : signed (OUTPUT_DATA_WIDTH/ 2 - 1 downto 0 );
261120 signal radius_1 : signed (OUTPUT_DATA_WIDTH/ 2 - 1 downto 0 );
@@ -266,8 +125,6 @@ architecture axi_constellation_mapper of axi_constellation_mapper is
266125 signal output_i : signed (OUTPUT_DATA_WIDTH - 1 downto 0 );
267126 signal output_q : signed (OUTPUT_DATA_WIDTH - 1 downto 0 );
268127
269- signal axi_out_tuser : std_logic_vector (ENCODED_CONFIG_WIDTH - 1 downto 0 );
270-
271128begin
272129
273130 s_tready <= '1' when s_constellation = unknown else s_tready_i;
@@ -488,12 +345,6 @@ begin
488345
489346 (others => 'U' );
490347
491- -- Split the RAM write port
492- iq_ram_wren <= ram_wren and not ram_addr(6 );
493- radius_ram_wren <= ram_wren and ram_addr(6 );
494-
495- ram_rdata <= iq_ram_rdata when ram_addr(6 ) = '0' else
496- radius_ram_rdata;
497348 ram_block : block
498349 signal tag_agg_in : std_logic_vector (TID_WIDTH downto 0 );
499350 signal tag_agg_out : std_logic_vector (TID_WIDTH downto 0 );
@@ -520,8 +371,8 @@ begin
520371 -- Write side
521372 wr_tready => open ,
522373 wr_tvalid => iq_ram_wren,
523- wr_addr => ram_addr(numbits(MAPPING_TABLE 'length ) - 1 downto 0 ) ,
524- wr_data_in => ram_wdata ,
374+ wr_addr => iq_ram_addr ,
375+ wr_data_in => iq_ram_wdata ,
525376 wr_data_out => iq_ram_rdata,
526377
527378 -- Read request side
@@ -542,9 +393,9 @@ begin
542393
543394 radius_ram_u : entity fpga_cores.axi_stream_ram
544395 generic map (
545- DEPTH => RADIUS_COEFFICIENT_TABLE 'length ,
396+ DEPTH => RADIUS_TABLE_DEPTH ,
546397 DATA_WIDTH => OUTPUT_DATA_WIDTH,
547- INITIAL_VALUE => RADIUS_COEFFICIENT_TABLE ,
398+ INITIAL_VALUE => RADIUS_TABLE ,
548399 TAG_WIDTH => ENCODED_CONFIG_WIDTH,
549400 RAM_TYPE => auto)
550401 port map (
@@ -553,8 +404,8 @@ begin
553404 -- Write side
554405 wr_tready => open ,
555406 wr_tvalid => radius_ram_wren,
556- wr_addr => ram_addr(numbits(RADIUS_COEFFICIENT_TABLE 'length ) - 1 downto 0 ) ,
557- wr_data_in => ram_wdata ,
407+ wr_addr => radius_ram_addr ,
408+ wr_data_in => radius_ram_wdata ,
558409 wr_data_out => radius_ram_rdata,
559410
560411 -- Read request side
0 commit comments