QPSK调制和解调VHDL代码Quartus仿真

名称:QPSK调制和解调VHDL代码Quartus仿真

软件:Quartus

语言:VHDL

代码功能:

QPSK调制和解调

 使用VHDL语言进行QPSK调制和解调,并进行仿真


FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com

演示视频:


设计文档:

设计文档.doc

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仿真

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员