FPGA产生频率可控的正弦波
?
參看原文:
FPGA學(xué)習(xí)(一)——產(chǎn)生頻率可控的正弦波 - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/p/36929424
?
2018.5.17更新如下
作為小透明,沒想到隨手一寫的學(xué)習(xí)過程也能被看見,看到有人點(diǎn)贊也還是很高興的,希望能以后自己忘了,還能來看懂,如果對大家能有所幫助,那就再好不過了。
?
對于輸出的正弦波周期有兩種算法,在這里記錄一下。
因?yàn)楹妥蛱焓褂玫牟皇峭粋€(gè)文件,所以名稱會和昨天的不一樣,不過原理一樣。
另外,在仿真的時(shí)候可以不用添加約束文件,只需要仿真時(shí)可以直接跳過,如果需要下載進(jìn)板子的話就必須要寫了。下一篇會介紹。
?
1.使用DDS輸出的最高位去計(jì)算,具體操作如圖
步驟1.2.3,注意黃線的位置和數(shù)值
?
點(diǎn)擊兩次上圖3的圖標(biāo)
根據(jù)兩次的數(shù)值就能算出輸出正弦波的周期
?
可能會覺得頻率控制字可以控制輸出波形的頻率,而輸出位寬又可以計(jì)算輸出波形周期,那改變輸出波形會影響什么呢?會影響輸出波形周期嗎?答案是不會。
具體看圖,我將輸出位寬改為10位的仿真結(jié)果。
圈圈圈
?
輸出位寬影響的是輸出波形的幅度\(0^◇^0)/
了解DDS的原理就明白了。
?
2.第二種就是昨天解釋原理時(shí)用頻率控制字控制輸出頻率時(shí),fre_word取1的值。
具體算法見原答案。
?
兩種區(qū)別就是一個(gè)取最高位,一個(gè)取最低位,剛開始容易理不清。
原答案如下
信號調(diào)制和解調(diào)功能。寫下其中過程當(dāng)做自己的學(xué)習(xí)記錄吧。本篇講的是如何產(chǎn)生一個(gè)正弦波。
1.原理說明
采用的是自帶DDS IP核,DDS直接數(shù)字式頻率合成器(Direct Digital Synthesizer),相信所有人看到這個(gè)名字就覺得不會陌生。
?
DDS由頻率控制字(Frequency Control Word)寄存器、相位累加器(Phase Accumulator)和正余弦查找表(Sine/Cosine LUT)三部分組成,通過控制相位累加器的位寬和查找表的位寬,可以實(shí)現(xiàn)不同頻率和動態(tài)范圍的正弦信號的產(chǎn)生。
?
關(guān)于DDS是如何產(chǎn)生我們需要的波形信號可以查看這篇文章:
用FPGA實(shí)現(xiàn)DDS任意波形發(fā)生器 | 電子創(chuàng)新網(wǎng)賽靈思中文社區(qū)?xilinx.eetrend.com
而我們現(xiàn)在不用關(guān)心太多原理,經(jīng)過實(shí)驗(yàn)的過程,自然就能明白其工作原理。
我們只需要知道如何控制其輸出頻率就行了,首先記住兩個(gè)術(shù)語(jargon):
?
a. 相位累加器:Phase = Phase + fre_word,可以暫且理解為i = i + 1一樣的東西。
b. 頻率控制字:fre_word,這個(gè)東西的值直接影響輸出信號的頻率。
我們的輸出頻率就是由fre_word來控制。
具體怎么算的呢?
?
DDS核頻率分辨率計(jì)算公式如下:
其中Δθ就是我們的頻率控制字取值后文用fre_word表示,Bθ(n)是相位累加器位寬后文用B表示,fclk為DDS工作時(shí)鐘。
頻率分辨率就是當(dāng)Δθ=1時(shí)的fout。
?
先假如我們需要的信號頻率范圍:1M-10MHz,分辨率0.01MHz。
取Δθ=1,fout=0.01MHz,B=10bit,我們可得DDS工作時(shí)鐘fclk=10.24MHz。
?
到這里我們就知道,產(chǎn)生一個(gè)正弦波信號需要2部分即可:
2.具體操作過程
打開vivado,新建工程
給工程命名,路徑不能出現(xiàn)中文
如圖勾選,我們后面自己建源文件
選擇板卡(這個(gè)板卡需要在安裝后自己添加了才會有),點(diǎn)擊接下來的next,finish。
添加源文件
取名
現(xiàn)在不用添加管腳,點(diǎn)擊ok,yes即可
添加IP 核,找到DDS,藍(lán)色的都是一樣的,隨便選一個(gè)雙擊
命名,選擇dds工作時(shí)鐘10.24MHz,選擇使用硬件參數(shù),位寬根據(jù)前面計(jì)算的結(jié)果填寫(相位位寬就是我們的頻率控制字位寬,而輸出位寬影響ROM表深度 (大小為?表示輸出的正弦波一個(gè)周期的采樣值,因?yàn)镈DS是數(shù)字信號經(jīng)DA輸出模擬信號))。
選擇可編程(因?yàn)橛蒮re_word控制),輸出sine,不需要觀測相位輸出
因?yàn)槭?0位,改為0000000001
查看summary,可知最小頻率為0.01MHz,點(diǎn)擊ok
點(diǎn)擊生成
用時(shí)鐘管理核生成時(shí)鐘分頻模塊,步驟如圖,不再描述
?
?
?
?
咦,,,,好像點(diǎn)擊圖片可以直接描述,第一次用知乎寫,還不會。。。。后面的圖片描述在圖片下方的描述區(qū)。。。
接下來就是例化IP核,首先是時(shí)鐘分頻模塊,雙擊.veo文件,因?yàn)槭荲erilog語言寫的
接下來就是例化IP核,首先是時(shí)鐘分頻模塊,雙擊.veo文件(因?yàn)槭荲erilog語言寫的),將程序復(fù)制到主程序中去
同樣的方式例化DDS模塊,修改例化模塊的名字,2.3步
?
建立頂層約束文件
?
?
添加代碼,涉及到時(shí)序,說起來太麻煩,具體語句就不解釋了,最后會附代碼,復(fù)制就行
?
添加仿真文件
?
注意名稱
?
?
?
編寫仿真代碼
?
重點(diǎn)重點(diǎn)!!!!名字一定要一樣,否則會有驚喜的。mmp被坑慘了
運(yùn)行仿真
?
右鍵將需要觀測的假如波形窗口
?
選中,右鍵,修改為有符號數(shù)10進(jìn)制表示,波形選擇為模擬波形
?
周期為100us,我們運(yùn)行200us查看波形
?
?
3.代碼只要所建名字一樣,可以直接復(fù)制使用
主程序 `timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2018/05/16 18:44:03 // Design Name: // Module Name: ZXB // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // //module ZXB(input sysclk,input [9:0] fw_z//用vio就注釋這一句);wire CLK_10240K;ZXB_CLK ZXB_CLKinst(// Clock out ports.clk_out1(CLK_10240K), // output clk_out1// Clock in ports.clk_in1(sysclk));// wire [9:0] fw_z; //用仿真就注釋這一句wire [9:0] fre_word;wire fre_word_en;assign fre_word = fw_z;assign fre_word_en = 1'b1;wire [7:0] dds_out;ZXB_DDS ZXB_DDSinst (.aclk(CLK_10240K), // input wire aclk.s_axis_config_tvalid(fre_word_en), // input wire s_axis_config_tvalid.s_axis_config_tdata(fre_word), // input wire [15 : 0] s_axis_config_tdata.m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid.m_axis_data_tdata(dds_out) // output wire [7 : 0] m_axis_data_tdata); endmodule頂層約束文件
set_property -dict {PACKAGE_PIN R4 IOSTANDARD LVCMOS33} [get_ports sysclk] ############################ #https://mp.weixin.qq.com/s/3WoAO4aHYTqTWLTnF56zMA關(guān)于時(shí)序約束# ############################ create_clock -period 10.000 -name sysclk -waveform {0.000 5.000} [get_ports sysclk]仿真文件
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2018/05/16 19:29:18 // Design Name: // Module Name: ZXB_tb // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // //module ZXB_tb();reg clk; // wire [7:0] data;reg [9:0] fw_z;ZXB dut(.sysclk(clk),.fw_z(fw_z),// .led(data) );// 初始化 initialbeginclk = 0;fw_z = 10'b0000000001;end//產(chǎn)生100MHz時(shí)鐘信號alwaysbegin#5 clk = ~clk;end endmodule4.本來應(yīng)該添上VIO和ILA的,不過沒有板子在,寫了也用不了,就不寫了,大概和這個(gè)差不多,主要區(qū)別就是VIO是外部板子給信號,而仿真就是軟件假裝的,所以在主程序中會有所不同。會Verilog就懂了。
?
?
5.第一次寫,很簡單的一個(gè)功能,居然寫了這么多,說明理解還不是很到位,表達(dá)也不是很簡潔明了,ε=(′ο`*)))唉溜了溜了
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的FPGA产生频率可控的正弦波的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: max无法创建新的堆栈防护页面_交互设计
- 下一篇: mybatisplus批量插入原理_【学