基于FPGA的DDS在Vivado中仿真以及在ZYNQ7020上板的实现(3)——2020版本的部分问题补充

在本系列第一篇文章中,DDS的设计代码在2020版本之后的Vivado中,综合时可能会出现这样的错误:

在这里插入图片描述
这是因为2020版本Vivado对时钟信号上升沿下降沿的要求十分严格,之前在2019版本Vivado上,为了适配ZYNQ-7020硬件,就把程序的高低电平触发调整了一下,2019版本没有问题,但在2020版本就会报错

在2020版本会报错代码举例如下:
在这里插入图片描述
只需要如下图把rst_n的下降沿有效改成上升沿有效即可
在这里插入图片描述

代码一共有三处类似地方,全部改过来即可

下面附上完整的2020版本之后的DDS代码

module DDS(
  input clk,
  input rst_n,
  input [1:0] Mode_Sel,
  input [1:0] fword_sel, 
  output DA_clk,
  output reg [11:0] Data

);
  reg [31:0] r_fword;
  reg [11:0] r_pword;
  reg [31:0] cnt;
  wire [11:0] rom_addr;
  wire[11:0]  rom_addr1;
  wire[11:0]  rom_addr2;
  wire[11:0]  rom_addr3;
  wire[11:0]  rom_addr4;
  

  always@(posedge clk or posedge rst_n)
  begin
    if(rst_n) begin
		  r_pword <= 0;
      end
    else begin
		  r_pword <= 2048;	 //这里时相位控制,单通道设计可以忽略
		end
  end

  
  always@(posedge clk or posedge rst_n)
     if(rst_n)
	    cnt <= 32'd0;
	   else
	    cnt <= cnt +r_fword;
	    	 
	assign rom_addr = cnt[31:20] + r_pword;
	assign rom_addr1 = cnt[31:20] + r_pword;
	assign rom_addr2 = cnt[31:20] + r_pword;
    assign rom_addr3 = cnt[31:20] + r_pword;
    assign rom_addr4 = cnt[31:20] + r_pword;   
    assign DA_clk=clk;
    
//例化不同的波形IP核
wire [11:0]Data_sin,Data_sin1,Data_square,Data_triangular,Data_sawtooth_wave;
	
sine_wave sine_DDS(
  .clka(clk),    // input wire clka
  .addra(rom_addr),  // input wire [11 : 0] addra
  .douta(Data_sin) // output wire [11 : 0] douta
);//正弦

triangular_wave triangular_DDS(
  .clka(clk),    // input wire clka
  .addra(rom_addr1),  // input wire [11 : 0] addra
  .douta(Data_triangular) // output wire [11 : 0] douta
);//三角
square_wave square_DDS(
  .clka(clk),    // input wire clka
  .addra(rom_addr2),  // input wire [11 : 0] addra
  .douta(Data_square) // output wire [11 : 0] douta
);//方波

sawtooth_wave sawtooth_wave_DDS(
  .clka(clk),    // input wire clka
  .addra(rom_addr3),  // input wire [11 : 0] addra
  .douta(Data_sawtooth_wave) // output wire [11 : 0] douta
);//锯齿
 sine1_DDS sine_DDS1(
  .clka(clk),    // input wire clka
  .addra(rom_addr4),  // input wire [11 : 0] addra
  .douta(Data_sin1) // output wire [11 : 0] douta
);//幅度改变的正弦


 //矩阵混合模块
wire signed [11:0] a11, a12, a21, a22;
    assign a11 = 12'h300; 
    assign a12 = 12'h600; 
    assign a21 = 12'h100; 
    assign a22 = 12'h800;  
reg signed [23:0] a11s1;
reg signed [23:0] a12s2;
reg signed [23:0] a21s1;
reg signed [23:0] a22s2;
always @(posedge clk or posedge rst_n)begin
    if(rst_n)begin
        a11s1 <= 'b0;
        a12s2 <= 'b0;
        a21s1 <= 'b0;
        a22s2 <= 'b0;
    end
    else begin//混合矩阵混合
        a11s1 <= a11 * Data_sin;
        a12s2 <= a12 * Data_square;
        a21s1 <= a21 * Data_sin;
        a22s2 <= a22 * Data_square;
    end
end

reg signed [11:0] wave1;
reg signed [11:0] wave2;
always@(posedge clk or posedge rst_n)begin
    if(rst_n)begin
        wave1 <= 'b0;
        wave2 <= 'b0;
    end
    else begin
        wave1 <= (a11s1 >>> 12) + (a12s2 >>> 12);
        wave2 <= (a21s1 >>> 12) - (a22s2 >>> 12);
    end
end
//频率的切换   
    always@(*)
        case(fword_sel)
            0:r_fword=8590;//250HZ
            1:r_fword=85899;//2500HZ
            2:r_fword=858993;//25KHZ
            3:r_fword=8589935;//250KHZ
            
        endcase 
//波形的切换
   always@(*)
        case(Mode_Sel)
            0:Data=Data_sin;//正弦波
            1:Data=Data_square;//方波
//          1:Data=Data_sin1;//与第一个正弦波相比幅度改变的正弦波
            2:Data=Data_triangular;//三角波
//          3:Data=Data_sawtooth_wave;//锯齿波
            3:Data=wave1;//正弦和方波进行一定比例混合的混合波
            
         endcase
         
  
endmodule


使用2020版本的读者只需要把这段DDS的设计代码换成这段即可,其余部分不用做改动。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Zynq 7020内部集成了一个FPGA(Field Programmable Gate Array),用于实现可编程逻辑(PL)部分FPGA是一种可编程逻辑器件,可以通过编程来实现各种数字电路功能。在Zynq 7020,PL部分可以与PS(Processing System)部分进行高效交互,通过AXI4协议来实现数据传输。开发人员可以使用Vivado软件进行FPGA的配置和调试。 Zynq 7020配套的开发板为Zybo Z7系列,该开发板上搭载了Zynq 7020芯片,并且具有相应的硬件配置。 总结来说,Zynq 7020内部集成了一个FPGA,可以通过Vivado进行配置和调试。在开发过程,可以使用Zybo Z7系列开发板进行硬件开发。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ZYNQ AX7020 PL读写PS端 DDR 数据 vivado](https://download.csdn.net/download/Calvin790704/87389599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [基于FPGADDSVivado仿真以及在ZYNQ7020上板实现(1)](https://blog.csdn.net/syyzuiqiang/article/details/118103211)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值