久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

DDS生成任意波形的方法及Verilog代碼實(shí)例(3) - 任意“波形”的實(shí)現(xiàn)

 青山代碼yyf 2022-06-02 發(fā)布于廣西

上一節(jié)我們用簡(jiǎn)單的數(shù)字邏輯實(shí)現(xiàn)了幾種常見(jiàn)的波形 - 方波,、鋸齒波和三角波,這幾種波形都是可以用簡(jiǎn)單的邏輯表達(dá)式來(lái)生成的,。但對(duì)于相對(duì)復(fù)雜的波形,,無(wú)法用邏輯表達(dá)式來(lái)生成的波形,,如何產(chǎn)生呢?這一節(jié)就以正弦波為例講述一下通過(guò)FPGA的數(shù)字邏輯實(shí)現(xiàn)查找表的方法生成任意波形的機(jī)制,,用這種機(jī)制,,可以生成任意一種形狀的波形。


為了產(chǎn)生任意波形,,DDS依賴的第一個(gè)技巧就是LUT - Lookup Table(查找表) - 把“任意形狀”的波形樣點(diǎn)保存在一個(gè)LUT(查找表,,類似組織有序的倉(cāng)庫(kù))中,通過(guò)查找表格的方式來(lái)實(shí)現(xiàn),。


圖片
基于查找表的波表合成

用這種方法可以實(shí)現(xiàn)任何一種形狀的波形,,比如下面的心型波形,,就是通過(guò)DDS的方式產(chǎn)生并在示波器上觀察到的實(shí)際電信號(hào),。

圖片
用查找表的方式生成的心型模擬信號(hào)波形

基于正弦波的對(duì)稱性,在波表中我們只保存了1/4個(gè)周期的波形,,其它3個(gè)1/4周期的波形可以基于對(duì)稱性來(lái)實(shí)現(xiàn),,周期的選擇采用地址的高兩位 - 示例中的phase[7:6]。

module lookup_tables(phase, sin_out);input [7:0] phase;output [9:0] sin_out;
wire [9:0] sin_out;reg [5:0] address;wire [1:0] sel;wire [8:0] sine_table_out;reg [9:0] sine_onecycle_amp; assign sin_out = sine_onecycle_amp[9:0];assign sel = phase[7:6]; sin_table u_sin_table(address,sine_table_out);always @(sel or sine_table_out)begin case(sel) 2'b00: begin sine_onecycle_amp = 9'h1ff + sine_table_out[8:0]; address = phase[5:0]; end 2'b01: begin sine_onecycle_amp = 9'h1ff + sine_table_out[8:0]; address = ~phase[5:0]; end 2'b10: begin sine_onecycle_amp = 9'h1ff - sine_table_out[8:0]; address = phase[5:0]; end 2'b11: begin sine_onecycle_amp = 9'h1ff - sine_table_out[8:0]; address = ~ phase[5:0]; end endcaseend endmodule

1/4周期正弦波的波表代碼:

module sin_table(address,sin);output [8:0] sin;         //實(shí)際波形表為9位分辨率(1/4周期)input  [5:0] address;     //64個(gè)點(diǎn)來(lái)生成1/4個(gè)周期的波形,,完整的一個(gè)周期為256個(gè)點(diǎn) reg    [8:0] sin; always @(address)    begin                  case(address)                          6'h0: sin=9'h0;                      6'h1: sin=9'hC;                      6'h2: sin=9'h19;                      6'h3: sin=9'h25;                      6'h4: sin=9'h32;                      6'h5: sin=9'h3E;                      6'h6: sin=9'h4B;                      6'h7: sin=9'h57;                      6'h8: sin=9'h63;                      6'h9: sin=9'h70;                      6'ha: sin=9'h7C;                      6'hb: sin=9'h88;                      6'hc: sin=9'h94;                      6'hd: sin=9'hA0;                      6'he: sin=9'hAC;                      6'hf: sin=9'hB8;                      6'h10: sin=9'hC3;                      6'h11: sin=9'hCF;                      6'h12: sin=9'hDA;                      6'h13: sin=9'hE6;                      6'h14: sin=9'hF1;                      6'h15: sin=9'hFC;                      6'h16: sin=9'h107;                      6'h17: sin=9'h111;                      6'h18: sin=9'h11C;                      6'h19: sin=9'h126;                      6'h1a: sin=9'h130;                      6'h1b: sin=9'h13A;                      6'h1c: sin=9'h144;                      6'h1d: sin=9'h14E;                      6'h1e: sin=9'h157;                      6'h1f: sin=9'h161;                      6'h20: sin=9'h16A;                      6'h21: sin=9'h172;                      6'h22: sin=9'h17B;                      6'h23: sin=9'h183;                      6'h24: sin=9'h18B;                      6'h25: sin=9'h193;                      6'h26: sin=9'h19B;                      6'h27: sin=9'h1A2;                      6'h28: sin=9'h1A9;                      6'h29: sin=9'h1B0;                      6'h2a: sin=9'h1B7;                      6'h2b: sin=9'h1BD;                      6'h2c: sin=9'h1C3;                      6'h2d: sin=9'h1C9;                      6'h2e: sin=9'h1CE;                      6'h2f: sin=9'h1D4;                      6'h30: sin=9'h1D9;                      6'h31: sin=9'h1DD;                      6'h32: sin=9'h1E2;                      6'h33: sin=9'h1E6;                      6'h34: sin=9'h1E9;                      6'h35: sin=9'h1ED;                      6'h36: sin=9'h1F0;                      6'h37: sin=9'h1F3;                      6'h38: sin=9'h1F6;                      6'h39: sin=9'h1F8;                      6'h3a: sin=9'h1FA;                      6'h3b: sin=9'h1FC;                      6'h3c: sin=9'h1FD;                      6'h3d: sin=9'h1FE;                      6'h3e: sin=9'h1FF;                      6'h3f: sin=9'h1FF;                   endcase              endendmodule

使用cnt[7:0]作為查找表的地址,,可以得到同上述方波一樣周期(頻率為46.875KHz)的正弦波,因?yàn)閏nt[7:0]遍歷一個(gè)周期,,也就正好輸出一個(gè)周期的正弦波出來(lái),。

lookup_tables u_lookup_table(.phase(cnt[7:0]), .sin_out(dac_data));

這樣我們就可以在DAC輸出端獲得一個(gè)非常漂亮的正弦波信號(hào):

圖片通過(guò)M2K的示波器功能觀察到的46.875KHz的正弦波信號(hào)

在上面的示例中我們采用了地址長(zhǎng)度為8bit(一個(gè)周期的波形共256個(gè)點(diǎn))、幅度量化分辨率為10位的波表,,這兩個(gè)參數(shù)究竟如何選取呢,?可以參見(jiàn)關(guān)于DDS的技術(shù)文章匯總 - DDS的原理、技術(shù)文章及常用器件 - https://www./doc/detail/47

在這里不再贅述,,只用兩幅圖來(lái)直觀顯示一下:

圖片
時(shí)間軸的量化精度對(duì)波形的影響

圖片

信號(hào)幅度的量化精度對(duì)波形的影響

在一個(gè)FPGA里面,,LUT可以使用組合邏輯資源來(lái)實(shí)現(xiàn),也可以通過(guò)其內(nèi)部的BlockRAM(成塊的RAM)來(lái)存儲(chǔ),。在我們的幾款小腳丫FPGA平臺(tái)中,,用到Lattice XO2-4000HC系列和Intel的MAX10M02/MAX10M08系列,這些器件內(nèi)部的BlockRAM都足夠保存很大容量的波形數(shù)據(jù),。
圖片

 Lattice XO2 FPGA內(nèi)部的資源,,小腳丫用的是XO2-4000HC系列,內(nèi)部有92kbit的BlockRam

圖片

Intel的MAX10 FPGA內(nèi)部的資源,,小腳丫用的是MAX10M02和MAX10M08,,內(nèi)部分別有108Kbit和378Kbits的BlockRam

FPGA的廠商在其工具中也都提供了用于產(chǎn)生正弦波表的IP核,可以直接調(diào)用來(lái)使用,,比如:

1 Lattice在其Diamond中的Sin-Cos table

圖片

 Lattice的工具Diamond中帶的正弦波,、余弦波生成IP

2 Intel/Altera在其Quartus_prime中的NCO(數(shù)字控制振蕩器)

圖片

Intel/Altera的工具Quartus帶的NCO生成IP

其它形狀的波形,乃至調(diào)制波形都可以通過(guò)一些工具(比如Matlab等)來(lái)生成數(shù)據(jù),在編譯的時(shí)候存儲(chǔ)在例化好的ROM中,,當(dāng)成一個(gè)波形庫(kù)來(lái)使用,。

我們會(huì)在下一次的文章中講述 - “任意頻率”是如何實(shí)現(xiàn)的。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多