🙆‍♀️

Tang nano 9Kを使いたい(2)

2024/04/18に公開

目的

Tang nano 9Kを使ってPWM信号を複数の端子から出力したい.

前提

  • Gowin FPGA programmerをインストール,ライセンスが通っている
  • Tang nano 9KでLチカくらいはできるようになっている(Lチカについての記事はこちら)
  • PWMが何かわかってる

手順

今回は,30kHz,duty比50%の出力と反転させた出力を出す.基本的な手順はLチカと変わらない.

  • projectの作成
  • コードの作成
  • 論理合成,ピンアサイン
  • ボード書き込み

Lチカと作業的に変わるところは,コードを書くところと,ピンアサインくらい.

コードについて

今回作成したコードは以下

module pwm_generate (
    input sys_clk,          // System clock input
    input sys_rst_n,        // System reset (active low)
    output reg pwm_signal,  // PWM output signal
    output reg inverse_pwm_signal // Inverse PWM signal
);

reg [10:0] time_counter = 0;
parameter ton = 450;
parameter tperiod = 900;

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n) begin
        time_counter <= 0;
        pwm_signal <= 0;
        inverse_pwm_signal <= 1;
    end else begin
        if (time_counter < ton) begin
            pwm_signal <= 1;
            inverse_pwm_signal <= 0;
        end else begin
            pwm_signal <= 0;
            inverse_pwm_signal <= 1;
        end
        if (time_counter >= tperiod - 1)
            time_counter <= 0;
        else
            time_counter <= time_counter + 1;
    end
end

endmodule

Tang Nano 9Kの動作周波数は27MHzなので1クロックにかかる時間は
\frac{1}{27M}[s],30kHz分のクロックサイクルは

\frac{1/(30k)}{1/(27M)}=\frac{27}{30}\times 10^3=900\;\text{[クロックサイクル]}

Duty比50%だとその半分のクロックサイクル中ONになっていればよく,450クロックサイクルを基準にすればよい.

ピンアサインについて

Tang Nano 9Kの回路図(ここからDL出来ます)を見ながらpinを設定すればいい.

参考程度にボードから生えてるpinはこんなかんじ(bottom viewなんで注意)

実際にやってみた

実際に出した出力波形は以下.このときは,コードに追加して,Duty比を10,20,50%の波形を出力させた.

Discussion