上一節(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),。
基于正弦波的對(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 endcase end endmodule 1/4周期正弦波的波表代碼:
使用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
信號(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)使用,,比如: 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)的。 |
|