Hallo,
ich habe folgendes Problem.
Ich will eine QAM Modulation in VHDL realisieren. Der Modulator steht.
Der Demodulator auch. Bis auf die beiden Tiefpassfilter der beiden
demodulierten I und Q Signale.
Ich habe im Netz einen Code für QAM Modulation gefunden, der einen
anscheinend sehr einfachen TP enthält, aber ich weis nicht was der Code
macht. Ich hoffe Ihr könnt mir helfen. Hier ein Auszug:
1 | entity iq_demod is
|
2 |
|
3 | generic (
|
4 | filter_shift : natural := 4; -- left shift to scale output filter
|
5 | filter_rate : natural := 8 -- multiplier, filter A = rate/2**shift
|
6 | -- ...
|
7 | );
|
8 |
|
9 | port (
|
10 | -- ...
|
11 | );
|
12 |
|
13 | end;
|
14 |
|
15 |
|
16 | architecture RTL of iq_demod is
|
17 | signal filterI, filterQ : signed(baseband_bits-1 downto 0);
|
18 | -- ...
|
19 | begin
|
20 |
|
21 | if Rst = '1' then
|
22 | filterI <= (others => '0');
|
23 | filterq <= (others => '0');
|
24 | sumI := (others => '0');
|
25 | sumQ := (others => '0');
|
26 | elsif rising_edge(Clk) then
|
27 | if dump = '1' then -- Dump integrator, generate output
|
28 | -- Output lowpass
|
29 | filterI <= resize(
|
30 | filterI + ((signed'((sumI - filterI) * filter_rate)) sra filter_shift),
|
31 | filterI'length);
|
32 | filterQ <= resize(
|
33 | filterQ + ((signed'((sumQ - filterQ) * filter_rate)) sra filter_shift),
|
34 | filterQ'length);
|
35 | -- dump the integrator
|
36 | sumI := (others => '0');
|
37 | sumQ := (others => '0');
|
38 | end if;
|
39 | -- Integrate (or initialise, if it's the dump cycle)
|
40 | sumI := sumI + prodI;
|
41 | sumQ := sumQ + prodQ;
|
42 | end if;
|
43 |
|
44 | end process;
|
45 | end;
|
Um den Code kurz zu halten wurde der Rest entfernt. Im Anhang sind aber
der Demod + Testbench drin.
So funktionierts:
sumI und sumQ summieren die demodulierten(!) Amplitudenwerte (prodI und
prodQ) des I und Q Kanals während einer Periode auf. dump ist dann ein
Hilfssignal, welches nach jeder Periode sumI und sumQ zurücksetzt.
filterI und filterQ sind dann der Ausgang des TP-Filters. Eben diesen
verstehe ich nicht. (Anm. sra ist analog zu shift_right).
Ich hoffe ihr könnt mir ein paar Tips geben