QPSK调制和解调VHDL代码Quartus仿真
名称:QPSK调制和解调VHDL代码Quartus仿真
软件:Quartus
语言:VHDL
代码功能:
QPSK调制和解调
使用VHDL语言进行QPSK调制和解调,并进行仿真
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件

2. 程序文件


3. 程序编译

4. Testbench

5. 仿真图
调制过程:首先通过m序列产生随机信号,作为调制信号,再将改信号转换为2为并行数据,通过在正弦波基础上改变相位得到QPSK信号。

5.1 QPSK调制部分



解调过程:将QPSK信号与sin和cos载波相乘,再对相乘的结果进行滤波,即可解调得到原信号。

5.2 QPSK解调部分




部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --QPSK调制和解调 ENTITY QPSK_demodulate IS PORT ( clk : IN STD_LOGIC; rst : IN STD_LOGIC; data : OUT STD_LOGIC_VECTOR(1 DOWNTO 0) ); END QPSK_demodulate; ARCHITECTURE behave OF QPSK_demodulate IS --QPSK调制模块 COMPONENT QPSK_modulate IS PORT ( clk : IN STD_LOGIC; rst : IN STD_LOGIC; qout : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END COMPONENT; --正弦和余弦 COMPONENT carrier_sin_cos IS PORT ( clk : IN STD_LOGIC; rst : IN STD_LOGIC; cos_wave : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); sin_wave : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END COMPONENT; SIGNAL qout : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL cos_wave : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL sin_wave : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL cos_mul : STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL sin_mul : STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL filter_cos_cnt : STD_LOGIC_VECTOR(5 DOWNTO 0) := "000000"; SIGNAL filter_sin_cnt : STD_LOGIC_VECTOR(5 DOWNTO 0) := "000000"; SIGNAL demodulate_a : STD_LOGIC := '0'; SIGNAL demodulate_b : STD_LOGIC := '0'; SIGNAL data_buf : STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL data_buf_2 : STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL data_changed : STD_LOGIC; SIGNAL data_cnt : STD_LOGIC_VECTOR(5 DOWNTO 0); SIGNAL data_out : STD_LOGIC_VECTOR(1 DOWNTO 0) := "00"; BEGIN --调用QPSK调制模块 i_QPSK_modulate : QPSK_modulate PORT MAP ( clk => clk, rst => rst, qout => qout ); --调用载波模块 i_carrier_sin_cos : carrier_sin_cos PORT MAP ( clk => clk, rst => rst, cos_wave => cos_wave, sin_wave => sin_wave ); cos_mul <= (cos_wave * qout);--QPSK调制信号和cos载波相乘 sin_mul <= (sin_wave * qout);--QPSK调制信号和sin载波相乘 --对cos_mul信号滤波 PROCESS (clk) BEGIN IF (clk'EVENT AND clk = '1') THEN IF (rst = '1') THEN filter_cos_cnt <= "000000"; ELSIF (cos_mul(15) = '1') THEN filter_cos_cnt <= "000001"; ELSIF (filter_cos_cnt = "000000") THEN filter_cos_cnt <= "000000"; ELSIF (filter_cos_cnt >= "011001") THEN filter_cos_cnt <= "000000"; ELSE filter_cos_cnt <= filter_cos_cnt + "000001"; END IF; END IF; END PROCESS; PROCESS (clk) BEGIN IF (clk'EVENT AND clk = '1') THEN IF (filter_cos_cnt = "000000") THEN--解调出a路 demodulate_a <= '0'; ELSE demodulate_a <= '1'; END IF; END IF; END PROCESS; --对sin_mul信号滤波 PROCESS (clk) BEGIN IF (clk'EVENT AND clk = '1') THEN IF (rst = '1') THEN filter_sin_cnt <= "000000"; ELSIF (sin_mul(15) = '1') THEN filter_sin_cnt <= "000001"; ELSIF (filter_sin_cnt = "000000") THEN filter_sin_cnt <= "000000"; ELSIF (filter_sin_cnt >= "011001") THEN filter_sin_cnt <= "000000"; ELSE filter_sin_cnt <= filter_sin_cnt + "000001"; END IF; END IF; END PROCESS; PROCESS (clk) BEGIN IF (clk'EVENT AND clk = '1') THEN IF (filter_sin_cnt = "000000") THEN--解调出b路 demodulate_b <= '0'; ELSE demodulate_b <= '1'; END IF; END IF; END PROCESS; data_buf <= (demodulate_a & demodulate_b);--ab两路拼接为2bit信号 PROCESS (clk) BEGIN IF (clk'EVENT AND clk = '1') THEN data_buf_2 <= data_buf; END IF; END PROCESS; PROCESS (clk) BEGIN IF (clk'EVENT AND clk = '1') THEN IF (data_buf_2 /= data_buf) THEN--data_buf是否变化 data_changed <= '1'; ELSE data_changed <= '0'; END IF; END IF; END PROCESS; PROCESS (clk) BEGIN IF (clk'EVENT AND clk = '1') THEN IF (data_changed = '1') THEN data_cnt <= "000000"; data_out <= data_out; ELSIF (data_cnt >= "011010") THEN data_cnt <= data_cnt; data_out <= data_buf_2; ELSE data_cnt <= data_cnt + "000001"; data_out <= data_out; END IF; END IF; END PROCESS; data <= data_out; END behave;
代码文件(付费下载):
![]()
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » QPSK调制和解调VHDL代码Quartus仿真
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » QPSK调制和解调VHDL代码Quartus仿真