Skip to content

Commit 00fc0ff

Browse files
committed
Split constellation mapper radius and IQ RAM interfaces
1 parent 53288e4 commit 00fc0ff

15 files changed

+8561
-8565
lines changed

rtl/axi_constellation_mapper.vhd

Lines changed: 38 additions & 187 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ use fpga_cores.common_pkg.all;
3434
use fpga_cores.axi_pkg.all;
3535

3636
use 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+
);
7178
end axi_constellation_mapper;
7279

7380
architecture 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-
271128
begin
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

Comments
 (0)