0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

數(shù)字混頻原理及程序設(shè)計(jì)

FPGA設(shè)計(jì)論壇 ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:FPGADesigner ? 2022-04-21 10:59 ? 次閱讀

混頻原理

混頻就是把兩個(gè)不同的頻率信號(hào)混合,得到第三個(gè)頻率。在模擬電路中經(jīng)常見(jiàn)到的就是把接收機(jī)接收到的高頻信號(hào),經(jīng)過(guò)混頻變成中頻信號(hào),再進(jìn)行中頻放大,以提高接收機(jī)的靈敏度。

數(shù)字電路中最簡(jiǎn)單的混頻便是兩個(gè)信號(hào)做乘法,可以得到它們的和頻信號(hào)與差頻信號(hào)。數(shù)字混頻在通信的調(diào)制、解調(diào)、DUC(數(shù)字上變頻)、DDC(數(shù)字下變頻)等系統(tǒng)中應(yīng)用廣泛。通常把其中一個(gè)信號(hào)稱(chēng)為本振信號(hào)(local oscillator),另一個(gè)信號(hào)稱(chēng)為混頻器的輸入信號(hào)。

程序設(shè)計(jì)

本文的程序設(shè)計(jì)參考自杜勇老師的書(shū)《數(shù)字濾波器MATLABFPGA實(shí)現(xiàn)-Altera/Verilog版》,對(duì)其中部分設(shè)計(jì)細(xì)節(jié)做了修改。杜勇老師的這個(gè)系列共有三本書(shū),很推薦大家購(gòu)買(mǎi)學(xué)習(xí)。不過(guò)可能由于篇幅有限,杜勇老師在書(shū)中對(duì)設(shè)計(jì)的一些細(xì)節(jié)和思想沒(méi)有做詳細(xì)介紹,博主在本文中和大家討論討論。

程序設(shè)計(jì)系統(tǒng)時(shí)鐘5MHz,625kHz的輸入信號(hào)與625kHz的本振信號(hào)做混頻,根據(jù)混頻原理會(huì)得到1.25MHz的和頻信號(hào)與0Hz(直流),將直流濾除掉得到1.25MHz的有效信號(hào)。

設(shè)計(jì)的頂層模塊接口如下所示:

module Mixer

(

input clk, //5MHz系統(tǒng)時(shí)鐘

input rst_n, //低電平有效復(fù)位信號(hào)

input [9:0] din, //輸入信號(hào)

output [9:0] s_oc, //本振信號(hào),625kHz

output out_valid, //NCO輸出有效信號(hào)

output [19:0] dout //混頻輸出信號(hào)

);

程序中首先生成本振信號(hào)。Quartus和Vivado中都提供了類(lèi)似功能的IP核:Vivado中叫DDS(Direct Digital Synthesizers)Compiler;Quartus中叫NCO(Numerically controlled oscillators)。下面以實(shí)例化NCO為例,具體的設(shè)計(jì)方法在下文講解。

wire [9:0] oc_sin;

oc oc

(

.phi_inc_i (16'd8192), //相位增量,對(duì)應(yīng)625kHz

.clk (clk),

.reset_n (rst_n),

.clken (1'b1), //時(shí)鐘允許信號(hào)

.fsin_o (oc_sin), //本振正弦信號(hào)

.out_valid (out_valid) //輸出有效標(biāo)志

);

接下來(lái)用乘法進(jìn)行混頻。我們都知道計(jì)算機(jī)中有帶符號(hào)數(shù)signed和無(wú)符號(hào)數(shù)unsigned,還知道計(jì)算機(jī)經(jīng)常以二進(jìn)制補(bǔ)碼的形式的表示帶符號(hào)數(shù)。

在FPGA設(shè)計(jì)中,不管是Altera還是Xilinx,它們的IP核幾乎都是采用二進(jìn)制補(bǔ)碼帶符號(hào)數(shù),也有很多的ADC、DAC芯片的數(shù)據(jù)接口也采用的是二進(jìn)制補(bǔ)碼。因此,在設(shè)計(jì)中,我們要清楚什么時(shí)候用什么數(shù)值表示法。

比如NCO的輸出為帶符號(hào)數(shù)二進(jìn)制補(bǔ)碼,假設(shè)混頻的輸入信號(hào)也是帶符號(hào)數(shù)二進(jìn)制補(bǔ)碼,則在整個(gè)混頻程序設(shè)計(jì)中都要保持這個(gè)數(shù)值表示方法,否則就會(huì)出錯(cuò)。

在下面的方法1中,再定義一個(gè)帶符號(hào)的寄存器將輸入信號(hào)轉(zhuǎn)換為帶符號(hào)數(shù)是很有必要的:“wire signed [9:0] din_s = din;”。如果不這樣做,直接使用乘法運(yùn)算符“*”,會(huì)被綜合為無(wú)符號(hào)數(shù)乘法,得到的就是錯(cuò)誤的結(jié)果。

當(dāng)然也可以用方法2,乘法器IP核可以選擇計(jì)算方式是“signed”還是“unsigned”,將乘法器設(shè)置為signed也可以完成正確的計(jì)算。

//----------------------------------------------------

// 乘法實(shí)現(xiàn)混頻,方法1,轉(zhuǎn)換為帶符號(hào)數(shù)后再相乘

//----------------------------------------------------

//reg signed [19:0] mult;

//wire signed [9:0] din_s = din;

//wire signed [9:0] oc_sin_s = oc_sin;

//

//always @(posedge clk or negedge rst_n)

// if (!rst_n) mult <= 20'd0;

// else mult <= din_s * oc_sin_s;

//----------------------------------------------------

// 乘法實(shí)現(xiàn)混頻,方法2,調(diào)用乘法器IP核,設(shè)置為signed

//----------------------------------------------------

wire signed [19:0] mult;

mult1 mult1_inst (

.clock ( clk ),

.dataa ( din ),

.datab ( oc_sin ),

.result ( mult )

);

接下來(lái)濾除混頻后的直流信號(hào)。由于乘法的運(yùn)算結(jié)果為帶符號(hào)數(shù),接下來(lái)的計(jì)算使用到的寄存器都應(yīng)申明為signed。

需要強(qiáng)調(diào)的是,signed和unsigned的申明只是告訴設(shè)計(jì)的運(yùn)算如何看待這個(gè)寄存器中的數(shù),并不能改變寄存器的值。比如“11”這個(gè)值,如果申明為signed,運(yùn)算將其視作-1,如果申明為unsigned,運(yùn)算將其視作3。因?yàn)橛蟹?hào)數(shù)和無(wú)符號(hào)數(shù)的運(yùn)算法則是不一樣的,所以錯(cuò)誤的申明會(huì)導(dǎo)致結(jié)果計(jì)算錯(cuò)誤。

reg signed [19:0] m1,m2,m3,m4,m5,m6,m7;

// 5MHz/625kHz=8; 緩存連續(xù)8個(gè)點(diǎn)的值

always @ (posedge clk or negedge rst_n)

if (!rst_n) begin

m1 <= 20'd0; m2 <= 20'd0; m3 <= 20'd0;

m4 <= 20'd0; m5 <= 20'd0; m6 <= 20'd0; m7 <= 20'd0;

end

else begin

m1 <= mult; m2 <= m1; m3 <= m2; m4 <= m3;?

m5 <= m4; m6 <= m5; m7 <= m6;

end

wire signed [22:0] madd = mult+m1+m2+m3+m4+m5+m6+m7; //一個(gè)周期

wire signed [19:0] mean = madd[22:3]; //舍掉低3bit,相當(dāng)于除8,得到

wire signed [19:0] mt = mult - mean; //濾除直流分量

assign dout = mt;

assign s_oc = oc_sin;

endmodule

上面濾除直流分量的方法并不通用,由于5Mhz的系統(tǒng)時(shí)鐘是625kHz信號(hào)的8倍,所以連續(xù)8個(gè)點(diǎn)的平均值便是直流分量。不過(guò)程序設(shè)計(jì)思路還是可以學(xué)習(xí),比如依次移位緩存數(shù)據(jù)、截高位做除法這些小技巧。

NCO IP核的使用

在Quartus中打開(kāi)該IP核,配置界面如下。后面的Quartus版本中將IP核集成到了qsys中,配置界面略有不同,但設(shè)置的參數(shù)之類(lèi)的基本一樣。

b8bf9420-c119-11ec-bce3-dac502259ad0.jpg

設(shè)定好相位累加器精度、角度分辨率、幅度精度、系統(tǒng)時(shí)鐘和輸出信號(hào)頻率,便可以得到一個(gè)相位增量值(phase increment value),在實(shí)例化NCO模塊時(shí)傳入的便是這個(gè)值。實(shí)際的輸出頻率和設(shè)定的頻率會(huì)存在一定誤差,下方便展示了輸出信號(hào)的頻域和時(shí)域圖形。總體來(lái)說(shuō)設(shè)置比較簡(jiǎn)單。

如果需要仿真,在生成IP核前一定要在“Set up simulation”中選中“Generate Simulation Model”和“Generate netlist”,如下圖所示。否則在導(dǎo)入ModelSim時(shí)會(huì)失敗,無(wú)法進(jìn)行仿真。

b8f14290-c119-11ec-bce3-dac502259ad0.jpg

DDS Compiler IP核的使用

基本配置

在Vivado中打開(kāi)DDS Compiler IP核,配置界面如下:

b9212956-c119-11ec-bce3-dac502259ad0.jpg

這個(gè)IP核的配置選項(xiàng)更豐富,提供的功能也更強(qiáng)大。我這里只介紹下本設(shè)計(jì)用到的功能,其余具體信息可以參考Xilinx官方文檔pg141。

同樣設(shè)定系統(tǒng)時(shí)鐘,Parameter Selection選擇“System Parameters”,這種設(shè)計(jì)方式可以直接設(shè)置無(wú)雜散動(dòng)態(tài)范圍、頻率分辨率、輸出頻率等系統(tǒng)級(jí)的參數(shù),和Quartus的NCO IP核很像。另外一種“Hardware Parameters”設(shè)計(jì)方式需要自己設(shè)定輸出數(shù)據(jù)和相移的位寬,輸出頻率、相位偏移等值需要自己計(jì)算對(duì)應(yīng)的二進(jìn)制數(shù)值。這兩種設(shè)計(jì)方式向不同需求的設(shè)計(jì)者提供。

pg141中給出了總線(xiàn)位寬與系統(tǒng)參數(shù)之間的轉(zhuǎn)換關(guān)系公式。

b937137e-c119-11ec-bce3-dac502259ad0.jpg

相位增量和相位偏移都可以設(shè)置為可編程的“Programmable”和“Streaming”方式,本設(shè)計(jì)只需要產(chǎn)生625kHz固定頻率的本振信號(hào),設(shè)置為“Fixed”即可(所需資源少)。在“Summary”中可以看到整個(gè)DDS系統(tǒng)的詳細(xì)信息。

位寬問(wèn)題

需要提醒的是系統(tǒng)最終的實(shí)際信號(hào)位寬和總線(xiàn)接口位寬并不一致。IP核的位寬只會(huì)是8的倍數(shù),多余的位數(shù)會(huì)移符號(hào)為填充,如下圖所示。

b95fcefe-c119-11ec-bce3-dac502259ad0.jpg

更直觀的感受,看一個(gè)DDS Compiler IP核的仿真:

b973b6d0-c119-11ec-bce3-dac502259ad0.jpg

可以看到相移雖然有16bit的位寬,但是有效的只有低10bit,高位都是符號(hào)為。為了更好的觀察相位值,新建一個(gè)“virtual bus“,將低10bit加到bus中,如下圖所示:

b9a58674-c119-11ec-bce3-dac502259ad0.jpg

可以清楚的看到相位和幅度之間的關(guān)系。

產(chǎn)生sin與cos信號(hào)

很多系統(tǒng)中需要sin和cos信號(hào)(如解調(diào)系統(tǒng)中的本振信號(hào)),在DDS中設(shè)置為“Sine and Cosine”輸出時(shí),sin和cos信號(hào)會(huì)共用數(shù)據(jù)總線(xiàn),sin使用高字節(jié),cos使用低字節(jié),格式如下:

b9bc26ae-c119-11ec-bce3-dac502259ad0.jpg

產(chǎn)生帶有相位偏移的信號(hào)

如果需要生成帶有可調(diào)初始相位(也叫相位偏移Phase Offset)的信號(hào),在DDS中將“Phase Offset Programmability”設(shè)置為“Streaming”,IP核端口會(huì)增加一個(gè)PHASE輸入通道,該通道數(shù)據(jù)總線(xiàn)的有效位寬與設(shè)置的頻率分辨率(Frequency Resolution)有關(guān),可以在Summary界面中看到位寬(Phase Width)。該數(shù)據(jù)總線(xiàn)與360°相位之間線(xiàn)性對(duì)應(yīng)。比如Phase Width為16Bits,則0對(duì)應(yīng)0°,F(xiàn)FFF對(duì)應(yīng)360°,7FFF對(duì)應(yīng)180°,以此類(lèi)推。

NCO和DDS是經(jīng)常用到的IP核,在后面的“FPGA數(shù)字信號(hào)處理“系列介紹的其它系統(tǒng)中,也會(huì)經(jīng)常出現(xiàn),因此需要熟悉掌握這兩個(gè)IP核的使用。

原文標(biāo)題:FPGA學(xué)習(xí)-數(shù)字信號(hào)處理數(shù)字混頻

文章出處:【微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1624

    文章

    21538

    瀏覽量

    600465
  • 程序設(shè)計(jì)
    +關(guān)注

    關(guān)注

    3

    文章

    261

    瀏覽量

    30339
  • 數(shù)字混頻
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    7457

原文標(biāo)題:FPGA學(xué)習(xí)-數(shù)字信號(hào)處理數(shù)字混頻

文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FPGA數(shù)字信號(hào)處理--數(shù)字混頻

    以簡(jiǎn)單的數(shù)字混頻為例,介紹在FPGA程序設(shè)計(jì)中很重要的二進(jìn)制原碼、補(bǔ)碼;有符號(hào)數(shù)、無(wú)符號(hào)數(shù)的問(wèn)題。本文不是像課本那樣介紹這些基礎(chǔ)概念,而是介紹很實(shí)際的設(shè)計(jì)方法。
    發(fā)表于 09-25 09:42

    介紹在FPGA程序設(shè)計(jì)中很重要的二進(jìn)制原碼

    這是數(shù)字信號(hào)處理系列的第一篇,以簡(jiǎn)單的數(shù)字混頻為例,介紹在FPGA程序設(shè)計(jì)中很重要的二進(jìn)制原碼、補(bǔ)碼;有符號(hào)數(shù)、無(wú)符號(hào)數(shù)的問(wèn)題。本文不是像課本那樣介紹這些基礎(chǔ)概念,而是介紹很實(shí)際的設(shè)計(jì)
    發(fā)表于 07-23 06:38

    C#程序設(shè)計(jì)與案例教程

    C#程序設(shè)計(jì)與案例教程全書(shū)共分九章,按C#知識(shí)的系統(tǒng)性,由淺入深安排內(nèi)容,全面介紹了C# 語(yǔ)言基礎(chǔ),面向?qū)ο?b class='flag-5'>程序設(shè)計(jì),GUI程序設(shè)計(jì),圖形、圖像與多媒體,數(shù)據(jù)庫(kù)程序設(shè)計(jì),
    發(fā)表于 10-22 11:05 ?158次下載
    C#<b class='flag-5'>程序設(shè)計(jì)</b>與案例教程

    JAVA程序設(shè)計(jì)之教程

    JAVA程序設(shè)計(jì)之教程
    發(fā)表于 04-10 14:46 ?0次下載
    JAVA<b class='flag-5'>程序設(shè)計(jì)</b>之教程

    DSP程序設(shè)計(jì)

    DSP程序設(shè)計(jì):(1)DSP C語(yǔ)言程序設(shè)計(jì)(2)C語(yǔ)言與匯編語(yǔ)言混合編程(3)DSP程序燒寫(xiě)13.1 DSP C語(yǔ)言程序設(shè)計(jì)DSP支持使用ANCI C進(jìn)行
    發(fā)表于 10-27 14:11 ?67次下載

    Matlab使用方法和程序設(shè)計(jì)

    Matlab使用方法和程序設(shè)計(jì) 實(shí)驗(yàn)一 Matlab使用方法和程序設(shè)計(jì)一、
    發(fā)表于 10-17 00:18 ?5352次閱讀
    Matlab使用方法和<b class='flag-5'>程序設(shè)計(jì)</b>

    數(shù)字電位器AD8402與8031的接口電路及程序設(shè)計(jì)

    數(shù)字電位器AD8402與8031的接口電路及程序設(shè)計(jì) 文介紹數(shù)字電位器AD8402與8031的接口電路及程序設(shè)計(jì)和使用注意事項(xiàng)。
    發(fā)表于 03-14 15:17 ?2068次閱讀
    <b class='flag-5'>數(shù)字</b>電位器AD8402與8031的接口電路及<b class='flag-5'>程序設(shè)計(jì)</b>

    最簡(jiǎn)單的C程序設(shè)計(jì)_ 順序程序設(shè)計(jì)

    最簡(jiǎn)單的c語(yǔ)言程序設(shè)計(jì),提供ppt教程,簡(jiǎn)單易懂
    發(fā)表于 12-02 09:37 ?0次下載

    音頻信號(hào)數(shù)字化光纖通信實(shí)驗(yàn)系統(tǒng)的程序設(shè)計(jì)與實(shí)現(xiàn)

    音頻信號(hào)數(shù)字化光纖通信實(shí)驗(yàn)系統(tǒng)的程序設(shè)計(jì)與實(shí)現(xiàn)
    發(fā)表于 01-04 17:13 ?22次下載

    msp430延時(shí)程序設(shè)計(jì)

    msp430延時(shí)程序設(shè)計(jì)msp430延時(shí)程序設(shè)計(jì)msp430延時(shí)程序設(shè)計(jì)
    發(fā)表于 04-29 14:40 ?0次下載

    Java并發(fā)程序設(shè)計(jì)教程

    Java并發(fā)程序設(shè)計(jì)教程
    發(fā)表于 03-19 11:23 ?2次下載

    面向?qū)ο蟮?b class='flag-5'>程序設(shè)計(jì)總結(jié)與過(guò)程化程序設(shè)計(jì)有什么區(qū)別?

    面向?qū)ο?b class='flag-5'>程序設(shè)計(jì)(簡(jiǎn)稱(chēng)OOP)技術(shù)最近幾年在計(jì)算機(jī)領(lǐng)域得到了迅猛發(fā)展,它是程序設(shè)計(jì)方法的一場(chǎng)革命。與傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)(面向過(guò)程程序設(shè)計(jì))相比,它具有許多優(yōu)點(diǎn),其中最主要的是,面向?qū)?/div>
    發(fā)表于 09-19 14:12 ?0次下載
    面向?qū)ο蟮?b class='flag-5'>程序設(shè)計(jì)</b>總結(jié)與過(guò)程化<b class='flag-5'>程序設(shè)計(jì)</b>有什么區(qū)別?

    簡(jiǎn)單的C程序設(shè)計(jì)教程之順序程序設(shè)計(jì)的資料概述

    本文檔的主要內(nèi)容詳細(xì)介紹的是簡(jiǎn)單的C程序設(shè)計(jì)教程之順序程序設(shè)計(jì)的資料概述。
    發(fā)表于 11-16 16:17 ?4次下載
    簡(jiǎn)單的C<b class='flag-5'>程序設(shè)計(jì)</b>教程之順序<b class='flag-5'>程序設(shè)計(jì)</b>的資料概述

    VB程序設(shè)計(jì)電子教程之圖形程序設(shè)計(jì)的詳細(xì)資料說(shuō)明

    本文檔的詳細(xì)介紹的是VB程序設(shè)計(jì)電子教程之圖形程序設(shè)計(jì)的詳細(xì)資料說(shuō)明主要內(nèi)容包括了:1.圖形程序設(shè)計(jì)基礎(chǔ),2.常用畫(huà)圖方法,3.動(dòng)畫(huà)程序設(shè)計(jì)初步
    發(fā)表于 03-01 11:01 ?13次下載
    VB<b class='flag-5'>程序設(shè)計(jì)</b>電子教程之圖形<b class='flag-5'>程序設(shè)計(jì)</b>的詳細(xì)資料說(shuō)明

    JAVA程序設(shè)計(jì)教程之JSP程序設(shè)計(jì)實(shí)驗(yàn)

    本文檔的主要內(nèi)容詳細(xì)介紹的是JAVA程序設(shè)計(jì)教程之JSP程序設(shè)計(jì)實(shí)驗(yàn)。
    發(fā)表于 11-05 15:34 ?6次下載
    JAVA<b class='flag-5'>程序設(shè)計(jì)</b>教程之JSP<b class='flag-5'>程序設(shè)計(jì)</b>實(shí)驗(yàn)