序文:
このコラムは、デジタル フロントエンドの秋採用者向けに、頻繁に行われるペン インタビューの手引きコード質問を記録することを目的としており、このコラムのすべての記事には原理分析、コードと波形が提供されており、すべてのコードは私自身によって検証されています。
ディレクトリは次のとおりです。
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 ハンドテアリング コード - 質問バンクにアクセスしてください。