【Xilinx DDS】Vivado代码实现FPGA DDS
目錄
?
實驗目的
一、調用ROM IP核
二、生成頂層模塊
三、仿真文件的編寫
四、進行仿真驗證
?
實驗目的
本實驗工程目的是實現輸出數據位寬為16的正弦波形。
一、調用ROM IP核
打開vivado,創建實驗工程,點擊左側菜單欄的IP Catalog,搜索Block,就可以看到block memory generator,雙擊打開進行配置。
首先在basic選項卡中將memory type配置成單端口的ROM,因為我們會事先將數據存入ROM中,只需要對它的地址空間進行讀取即可,同時也可以將這個IP定義成自己想要的名稱,方便辨別。其余保持默認。
?在port A options選項卡中,將數據位寬配置成16,深度配置成65536,也可以根據自己的需求改變參數,但在之后的代碼需要進行位寬的更改。其余保持默認。?
在other option的選項卡中,加載所需要的coe文件,我用的是小梅哥的coe文件生成器,同樣的也是將數據位寬配置成16,深度配置成65536.最后將所生成的coe文件加載其中即可。?配置完成點擊ok。
二、生成頂層模塊
點擊sources中的加號鍵,選擇添加設計文件,一路點擊確定。
再進行頂層模塊的代碼編寫,這里的代碼主要包括對端口的申明以及對ROM?IP核的例化。
同時,也定義讀取地址的方式,這里定義的步進為1,也就是依次對ROM的地址內的數據進行讀取,也可以根據自己的需要進行更改,但是更改的同時也會改變輸出波形的頻率。
關于DDS的理論知識,可以看下另一篇博客,博客中詳細介紹了DDS的原理以及相關參數的含義。
`timescale 1ns / 1psmodule dds_top(input clk,input rst,input ena,output [15:0] data);reg [15:0] addr;parameter fword = 1; //addr always @(posedge clk or posedge rst) beginif (rst) beginaddr <= 'd0;endelse if (ena == 1'b1) beginaddr <= addr + fword;endelse beginaddr <= 'd0;end end //例化sinrom IP sinrom sinrom_inst (.clka(clk), // input wire clka.ena(ena), // input wire ena.addra(addr), // input wire [15 : 0] addra.douta(data) // output wire [15 : 0] douta ); endmodule三、仿真文件的編寫
同第二步的操作,點擊加號添加仿真文件,測試代碼如下。
`timescale 1ns / 1psmodule tb_sinrom();reg clk;reg rst;reg ena;wire [15:0] data;initial beginclk = 1'b0;endalways #10 clk = ~clk;initial beginrst = 1'b1;ena = 1'b1;#200rst = 1'b0;enddds_top inst_dds_top (.clk(clk), .rst(rst), .ena(ena), .data(data)); endmodule保存就可以看到測試文件已經將頂層和ROM IP核包含了。
四、進行仿真驗證
點擊左側菜單欄中的 run simulation,即可看到仿真波形。
?將輸出數據data的值設置為無符號的十進制以及波形形式設置為模擬波形,即可看到正弦波,如果只看到一點波形,可以多跑10ms。
?下面是之前寫的博客,里面介紹DDS的相關原理以及參數設定含義,并實現兩路波形的混頻操作。
【Vivado DDS IP核】Vivado的DDS IP核使用以及混頻操作_m0_61298445的博客-CSDN博客https://blog.csdn.net/m0_61298445/article/details/122442678?spm=1001.2014.3001.5501
?
總結
以上是生活随笔為你收集整理的【Xilinx DDS】Vivado代码实现FPGA DDS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LOL无限火力一键连招源码
- 下一篇: 22考研每日必背长难句1