在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<abbr id="27omo"></abbr>

<menu id="27omo"><dl id="27omo"></dl></menu>
    • <label id="27omo"><tt id="27omo"></tt></label>

      新聞中心

      EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > DDS直接數(shù)字合成2 - 任意信號(hào)

      DDS直接數(shù)字合成2 - 任意信號(hào)

      作者: 時(shí)間:2024-01-16 來(lái)源:EEPW編譯 收藏

      為了生成任意信號(hào), 依賴于兩個(gè)主要技巧。

      本文引用地址:http://www.biyoush.com/article/202401/454848.htm

      第一個(gè) 技巧是 (查找表)。 是一個(gè)表格,用于保存我們想要生成的模擬信號(hào)的形狀。

      中,LUT是作為blockram實(shí)現(xiàn)的。 在上圖中,我們使用了 512x10 位 LUT,它通常適合一個(gè)或兩個(gè)物理 模塊。

      正弦波

      最常產(chǎn)生的信號(hào)形狀是正弦波。 它很特別,因?yàn)樗袃蓚€(gè)對(duì)稱性,可以很容易地利用它們來(lái)使 LUT 看起來(lái)更大。

      在正弦波中,第一個(gè)對(duì)稱性是sin(α)=sin(π-α)。
      假設(shè)我們的 “my__LUT” blockram 是這樣實(shí)例化的

      wire [9:0] LUT_output;

      blockram512x10bit_2clklatency my_DDS_LUT(.rdclock(clk), .rdaddress(cnt[8:0]), .q(LUT_output));

      我們只需要在半個(gè)周期后以相反的方向訪問 LUT 即可利用第一個(gè)對(duì)稱性。

      blockram512x10bit_2clklatency my_DDS_LUT(.rdclock(clk), .rdaddress(cnt[9] ? ~cnt[8:0] : cnt[8:0]), .q(LUT_output));

      因此,現(xiàn)在我們只將一半的波存儲(chǔ)在模塊中,但其內(nèi)容在輸出信號(hào)的每個(gè)周期中使用兩次。 從某種意義上說,LUT 顯示為 1024x10 位(使用第二種對(duì)稱性,我們得到 2048x10 位)。

      請(qǐng)注意,我們使用一個(gè)塊“blockram512x10bit_2clklatency”,它提供具有兩個(gè)時(shí)鐘延遲的數(shù)據(jù)(因?yàn)橐粋€(gè)時(shí)鐘延遲塊框速度較慢)。 如何做到這一點(diǎn)取決于供應(yīng)商(Altera將使用LPM,而Xilinx將使用原語(yǔ))。

      讓我們將 LUT 重寫為一個(gè)單獨(dú)的模塊,利用兩個(gè)正弦對(duì)稱性。

      // sine lookup value module using two symmetries
      // appears like a 2048x10bit LUT even if it uses a 512x10bit internally
      // 3 clock latencymodule sine_lookup(input clk, input [10:0] addr, output reg [16:0] value);
      wire [15:0] sine_1sym;  // sine with 1 symmetry
      blockram512x16bit_2clklatency my_quarter_sine_LUT(     // the LUT contains only one quarter of the sine wave
         .rdclock(clk),
         .rdaddress(addr[9] ? ~addr[8:0] : addr[8:0]),   // first symmetry
         .q(sine_1sym)
      );

      // now for the second symmetry, we need to use addr[10]
      // but since our blockram has 2 clock latencies on reads
      // we need a two-clock delayed version of addr[10]
      reg addr10_delay1;
      always @(posedge clk) addr10_delay1 <= addr[10];
      reg addr10_delay2; always @(posedge clk) addr10_delay2 <= addr10_delay1;
      wire [15:0] sine_2sym = addr10_delay2 ? {1'b0,-sine_1sym} : {1'b1,sine_1sym};  // second symmetry

      // add a third latency to the module output for best performance
      always @(posedge clk) value <= sine_2sym;
      endmodule

      請(qǐng)注意,sine_lookup模塊總共有 3 個(gè)時(shí)鐘延遲(兩個(gè)來(lái)自模塊,一個(gè)來(lái)自末尾的注冊(cè)輸出)。
      時(shí)鐘延遲的好處是可以流水線操作,并從FPGA中獲得最大可能的性能。 不要忘記,這需要運(yùn)行至少 100MHz。

      此外,我們還將 blockram 的輸出寬度從 10 位增加到 16 位(如果在我們的特定 FPGA 模塊中未使用,則 6 位會(huì)丟失,因此我們不妨實(shí)現(xiàn)它們)。 我們將在第 4 部分中充分利用多余的部分。

      為了有效地使用我們新制作的“sine_lookup模塊”,我們可以簡(jiǎn)單地編寫

      reg [10:0] cnt;
      always @(posedge clk) cnt <= cnt + 11'h1;
      wire [16:0] sine_lookup_output;
      sine_lookup my_sine(.clk(clk), .addr(cnt), .value(sine_lookup_output));
      wire [9:0] DAC_data = sine_lookup_output[16:7];   // for now, we drop the LSBs to feed our DAC
                                                       // (since it takes only 10 bits)

      我們從DAC得到一個(gè)很好的正弦波。

      上一篇:DDS直接數(shù)字合成1 - 簡(jiǎn)介

      下一篇:DDS直接數(shù)字合成3 - 相位累加器



      關(guān)鍵詞: FPGA DDS LUT

      評(píng)論


      相關(guān)推薦

      技術(shù)專區(qū)

      關(guān)閉