デジタルIC手引きコード-XX社筆記試験問題(パルス密度変調)

 序文:

        このコラムは、デジタル フロントエンドの秋採用者向けに、頻繁に行われるペン インタビューの手引きコード質問を記録することを目的としており、このコラムのすべての記事には原理分析、コードと波形が提供されており、すべてのコードは私自身によって検証されています。

ディレクトリは次のとおりです。

1. デジタルICハンドティアコード分周器(任意の偶数分周)

2. デジタル IC ハンドティアコード分周器 (任意の奇数分周)

3. デジタル IC ハンドティアコード分周器 (任意の 10 進分周)

4.デジタルICハンドティアリングコード - 非同期リセットと同期リリース

5.デジタルICハンドティアコード - エッジ検出(立ち上がりエッジ、立ち下がりエッジ、ダブルエッジ)

6. デジタルICハンドティアリングコード列検出(ステートマシン書き込み方式)

7. デジタルICハンドティアリングコード列検出(シフトレジスタ書き込み方式)

8. デジタルICティアリングコード - 半加算器、全加算器

9. デジタル IC ハンド ティアリング コード - シリアルからパラレル、パラレルからシリアル

10.デジタルICハンドティアリングコード-データビット幅変換器(幅-狭幅、狭幅変換)

11. デジタル IC ハンド ティアリング コード - 有限状態マシン FSM - 飲料マシン

12.デジタルICハンドティアコード - ハンドシェイク信号(READY-VALID)

13. デジタル IC ハンド ティアリング コード - 水ハンドシェイク (ハンドシェイクを使用してパイプラインの中断と背圧の問題を解決します)

14. デジタル IC ハンド テアリング コード - Telink マイクロ筆記試験問題

15. デジタル IC 手引きコード - Pingtouge 技術最終面手引き本当の質問

16.デジタルICマニュアルティアリングコード-Zhaoyiイノベーション筆記試験実際の質問

17. デジタル IC ハンド ティアリング コード - Espressif Technology 筆記試験実際の問題 (4 回の頻度)

18. デジタル IC ティアリング コード - デュアルポート RAM (デュアルポート RAM)

        ...継続的に更新

 ハンドテアリング コードに関するその他の質問については、 デジタル IC ハンドテアリング コード - 質問バンクにアクセスしてください。


目次

トピックの説明

ソリューション

コード

テストベンチ

出力波形 


トピックの説明

         HDL を使用してパルス密度変調 (PDM) を実現します。つまり、入力 12 ビット pdm_in に従って、次の要件に従って異なるデューティ比を持つ方形波を出力します。

        ① pdm_in>10 の場合、pdm_out は出力波形のデューティ サイクルが 4/pdm_in であることを意味します。

        ② pdm_in<=10 の場合、pdm_out は反転せず固定値を出力します。

その入力および出力インターフェイスは次のとおりです。

input clk;
input [11:0]pdm_in;
input reset;
output pdm_out;

ソリューション

        パルス密度変調 (PDM) は、波形のデューティ サイクルを調整することでパルス密度を変更します。信号論理がHighの時間T_hignを周期T_cycleで割った比率をデューティサイクルと呼びます。

        最初の要件を達成するために、pdm_in>10 の場合、新しい信号は 4 clk サイクルで High になり、(pdm_in-4) clk サイクルで Low になり、デューティ サイクル 4 /pdm_in の pdm_in 分周が実現します。

        2 番目の要件は、pdm_in<=10 の場合、pdm_out は反転させず、分周を実現するカウンタをクリアさせることです。 


コード

module pdm(
    input           clk     ,
    input   [11:0]  pdm_in  ,
    input           reset   ,
    output          pdm_out
);

reg pdm_processed;
reg [11:0] count;

always @(posedge clk)begin
    if(reset)begin
        pdm_processed <= 1'd0;
    end
    else if(pdm_in > 10)begin
        if(count <= 3)
            pdm_processed <= 1'b1;
        else if(count < pdm_in -1)
            pdm_processed <= 1'b0;
        else if(count == pdm_in-1)
            pdm_processed <= 1'b0;
    end
    else begin // pdm_in <= 10
        pdm_processed <= pdm_processed;  //stay 
    end
end

always @(posedge clk)begin
    if(reset)begin
        count <= 12'd0;
    end
    else begin
        if(pdm_in > 10 && count < pdm_in-1)begin
            count <= count + 1'b1;
        end
        else if(pdm_in > 10 && count == pdm_in-1)begin  // one pdm_out cycle finish
            count <= 12'd0;  
        end
        else begin // pdm_in <= 10
            count <= 12'd0;
        end
    end
end

assign pdm_out = pdm_processed;

endmodule

テストベンチ

module pdm_tb();

reg clk,reset;
wire pdm_out;

always #5 clk = ~clk;
reg [11:0] pdm_in;

initial begin
    clk     <=  1'b0;
    reset   <=  1'b1;
    pdm_in  <=  12'd0;
    #20
    reset   <=  1'b0;
    #20
    pdm_in  <=  12'd20;
    #400
    pdm_in  <=  12'd12;
    #240
    pdm_in  <=  12'd5;
    #50
    pdm_in  <=  12'd12;
    #30
    pdm_in  <=  12'd5;
    #200
    $finish();
end

//dump fsdb 
initial begin 
    $fsdbDumpfile("pdm.fsdb");
    $fsdbDumpvars(0);
end 

pdm u_pdm(
    .clk    (clk)   ,
    .pdm_in (pdm_in),
    .reset  (reset) ,
    .pdm_out(pdm_out)
);

endmodule

出力波形 

        波形を見ると、pdm_in = 20 に設定し、pdm_out は考えたとおりで、出力はデューティ比 4/20 の方形波であることがわかります。pdm_in = 12 に設定すると、pdm_out 出力はデューティ サイクル 4/12 の方形波になります。pdm_in < 10 に設定すると、dpm_out は変更されません。


 ハンドテアリング コードに関するその他の質問については、 デジタル IC ハンドテアリング コード - 質問バンクにアクセスしてください。

おすすめ

転載: blog.csdn.net/qq_57502075/article/details/127831568