• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > DDS直接數字合成3 - 相位累加器

    DDS直接數字合成3 - 相位累加器

    作者: 時間:2024-01-16 來源:EEPW編譯 收藏

    的第二個技巧是長。 它允許來自輸出的信號頻率非常靈活。

    本文引用地址:http://www.czjhyjcfj.com/article/202401/454851.htm

    我們將通過一個示例了解它是如何工作的。 讓我們從這個簡單的代碼開始。

    reg [10:0] cnt;   // 11bit counter
    always @(posedge clk) cnt <= cnt + 11'h1;

    sine_lookup my_sine(.clk(clk), .addr(cnt), .value(sine_lookup_output));

    計數器實際上是一個“”。 那是因為它每次遞增,它都會將正弦波移動 360°/2048=0.175°

    因此,讓我們將計數器重命名為更好的名稱。

    reg [10:0] phase_acc;   // 11bit
    always @(posedge clk) phase_acc <= phase_acc + 11'h1;

    sine_lookup my_sine(.clk(clk), .addr(phase_acc), .value(sine_lookup_output));

    現在,如果我們想將正弦輸出的頻率提高一倍,我們將增加 2 而不是 1。

    always @(posedge clk) phase_acc <= phase_acc + 11'h2;

    但是,如果我們想將頻率減半呢?我們運氣不好,因為我們不能將相位累加器增加 0.5(Verilog 僅支持整數)。 我們需要的是相位累加器的更高分辨率。

    讓我們看看如何通過向相位累加器添加更多位來完成它,但現在以提供與 11 位相位累加器相同的輸出的方式完成。

    reg [14:0] phase_acc;   // 4 more bits, for a total of 15 bits
    always @(posedge clk) phase_acc <= phase_acc + 15'd16;   // increment by 16 instead of 1

    sine_lookup my_sine(.clk(clk), .addr(phase_acc[14:4]), .value(sine_lookup_output));   // shifted lookup address

    由于我們將計數器遞增 16 并在查找地址中使用 phase_acc[14:4],因此我們沒有更改輸出。 但是多四個位為我們提供了一個具有更好分辨率的相位累加器。 現在,我們當然可以將輸出頻率減半(通過將相位累加器增加 8 而不是 16)。

    將相位累加器分辨率提高 16 后,我們可以以 1/16 步長獲得原始正弦頻率的任意倍數。 我們當然可以在相位累加器上增加四個以上的位。 典型的實現使用非常長的位相位累加器,以在可用的輸出頻率中具有極高的精度和分辨率。

    例如,使用32位相位累加器和100MHz時鐘,輸出的頻率分辨率為0.023Hz!
    這是一個 32 位相位累加器,用于從 440MHz 時鐘生成 100Hz 信號。

    reg [31:0] phase_acc;   // 32bit phase accumulator
    always @(posedge clk) phase_acc <= phase_acc + 18898;   // 440Hz output when clocked at 100MHz

    sine_lookup my_sine(.clk(clk), .addr(phase_acc[31:21]), .value(sine_lookup_output));

    雖然 440Hz 相當慢,但使用上述代碼可以實現高達 50MHz(或接近 <>MHz)的輸出頻率。 只需修改相位累加器增量即可。

    上一篇:DDS直接數字合成2 - 任意信號

    下一篇:DDS直接數字合成4 - 插值



    關鍵詞: FPGA DDS 相位累加器

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 九寨沟县| 东城区| 红安县| 建湖县| 聂拉木县| 内江市| 海宁市| 台州市| 武宁县| 湖北省| 宁海县| 孟连| 溧水县| 泸定县| 长宁区| 松潘县| 新巴尔虎左旗| 南雄市| 比如县| 阳西县| 扶绥县| 哈巴河县| 翁源县| 陆川县| 朔州市| 托里县| 万荣县| 屯昌县| 宜黄县| 泊头市| 北川| 靖西县| 和龙市| 旬阳县| 江都市| 沅陵县| 黄山市| 泗水县| 奉化市| 巴彦淖尔市| 公安县|