FPGA实现QPSK信号的产生【非常详细!具体到ip核的参数设置原理】

这里不再阐述QPSK的原理直接详细介绍基于FPGA的QPSK实现

输入输出信号

module QPSK_top(
    input clk,
    input rst,
    input [1:0]data_send,
    output [35:0] qpsk
    
    );

其中定义随机信号data_send的产生来自由matlab随机产生的数据文件定义。
后面在介绍在仿真所用的tb文件进行读取相应文件进行仿真。

信号对极化

	wire [1:0]I;
    wire [1:0]Q;
    //对极化 :0——>+1(01)  1——>-1(11)
    assign I ={
   data_send[0],1'b1};
    assign Q ={
   data_send[1],1'b1};

上采样&成型滤波

 reg [3:0] cnt_16  = 4'b00;//16计数器,内插系数是16(时钟速率是符号速率的4倍)
    always @(posedge clk)
    begin
        if(rst) begin
            cnt_16<=4'b00;     
        end else begin
            cnt_16 <= cnt_16+1'b1;
        end
    end

    wire fir_nd; //输入FIR滤波器有效信号
    assign fir_nd = (cnt_16 == 4'd15);
 

    wire [23:0] I_filtered;
    wire [23:0] Q_filtered;
    wire [15:0]  carry_cos;
    wire [15:0]  carry_sin;
    //I路成形滤波
    rcosfilter rcosfilter_I (
        .aclk(clk),                    // input wire aclk
        .s_axis_data_tvalid(fir_nd),        // 输入I路有效信号
        .s_axis_data_tready(),             // output wire s_axis_data_tready
        .s_axis_data_tdata({
   6'd0,I[1:0]}), // input wire [7 : 0] s_axis_data_tdata     {6{I[1]}}
        .m_axis_data_tvalid(),             // output wire m_axis_data_tvalid
        .m_axis_data_tdata(I_filtered)     // output wire [23 : 0] m_axis_data_tdata
    );

    //Q路成形滤波
    rcosfilter rcosfilter_Q (
        .aclk(clk),                    // input wire aclk
        .s_axis_data_tvalid(fir_nd),        // 输入Q路有效信号
        .s_axis_data_tready(),             // output wire s_axis_data_tready
        .s_axis_data_tdata({
   6'd0,Q[1:0]}), // input wire [7 : 0] s_axis_data_tdata
        .m_axis_data_tvalid(),             // output wire m_axis_data_tvalid
        .m_axis_data_tdata(Q_filtered)     // output wire [23 : 0] m_axis_data_tdata
    );  

这里设置内插系数为16 ,通过16位计数器的方式控制成型滤波器的使能,进而实现上采样

滤波器的IP核设置

两路的成型滤波器用到了【FIR Compiler】滤波器IP核,根据各参数进行设置
配置过程如下:
本文只简单介绍主要配置,具体IP核每项配置的含义和设置可以参照手册或文章
1、选择coe文件
在这里插入图片描述
coe文件对应要设置的滤波器系数,上面的文件名hrc_16.coe的16指的是量化系数16
可以从matlab得到

clc
### FPGA中AD9361的配置应用 #### 配置流程概述 对于ZedBoard和AD9361组合,在FPGA中的配置主要分为两个部分:一是通过PS端(Processing System)完成对AD9361初始化配置;二是利用PL端(Programmable Logic)实现具体功能逻辑的设计。在初始化阶段,需设置诸如采样率、中心频率等基本参数[^2]。 #### 初始化配置 为了使能AD9361正常工作,必须先对其进行一系列必要的初始化设定。这通常涉及到多个内部寄存器的操作,包括但不限于锁相环(PLL)参数调整、接收/发射通道增益控制以及数字上下变频器(DUC/DDC)配置等内容。这些操作可以通过编写Verilog代码来直接操控相应的SPI接口完成[^3]。 ```verilog module ad9361_config( input wire clk, output reg spi_cs_n, output reg spi_sclk, output reg spi_mosi, input wire spi_miso ); // SPI通信协议实现... endmodule ``` #### 功能模块设计 一旦完成了初步配置之后,则可以在PL区域构建更多复杂的应用场景下的处理单元。例如,在一个典型的软件定义无线电(SDR)项目里,可能会涉及基带信号生成、调制解调算法实现等功能块。这里给出一段简单的QPSK调制实例代码片段作为参考: ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity qpsk_modulator is Port ( ... -- QPSK调制过程的具体描述... end entity; architecture Behavioral of qpsk_modulator is begin process(...) variable phase : real := 0.0; -- 初始相位设为零度 begin if rising_edge(clk) then case symbol_in is when "00" => i_out <= '1'; q_out <= '1'; when "01" => i_out <= '-1'; q_out <= '1'; when "11" => i_out <= '-1'; q_out <= '-1'; when others=> i_out <= '1'; q_out <= '-1'; end case; phase := phase + freq_offset * period; end if; end process; end architecture; ``` #### 开发工具支持 在整个开发过程中,推荐使用Xilinx官方提供的Vivado集成开发环境版本号应不低于2019.1,因为该版本提供了更好的兼容性和更丰富的IP资源库用于加速开发进程[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值