ここから本文です
趣味の電子工作備忘録

書庫全体表示

Verilogで簡単な回路を作成します。
2.1 仕様
・外部インタフェース
- タクトSWx1
- LEDx2
・動作
- タクトSWを押すと、LED1は消灯状態から点灯状態になる。
- もう一度タクトSWを押すと、LED1は点灯状態から消灯状態になる。
- LED2は、LED1が点灯状態のとき、約0.5秒周期で点滅する。
- LED1が消灯時は、LED2の状態は変化しない。
・その他
- クロックは内部OSC(約2.08MHz)を使う。
- タクト」スイッチは押下時にLowレベルとなる。
- LEDはHighレベルで点灯する。

2.2 モジュール構成
回路は、以下3つのモジュールから構成します。
- topdesign (topdesign.v)
最上位のモジュールで、LEDの制御を行います。また下位のモジュールとの接続も行います。

- toggle (toggle.bin)
タクトSWが押される度に、ON/OFFを切り替えます。

- debounce (debounce.bin)
入力スイッチのチャタリング除去を行います。

2.3 Verilogファイルをプロジェクトに追加
1) プロジェクトを作成した状態で、"Impl1"を右クリックし、表示されたメニューから"Add"→"New File..."の順番で選択します。

イメージ 1
新規ファイルの作成
2) ファイル種別から"Verilog Files"を選択し、ファイル名を入力します。この例では"topdesign"を指定しています。

イメージ 4
ファイル種別とファイル名の指定(指定前)

イメージ 2
ファイル種別とファイル名の指定(指定後)

3) 以上でプロジェクトにVerilogファイル"topdesign.v"が追加されます。

イメージ 3
Verilogファイル追加後のプロジェクト

同様に、toggle.vとdebounce.vを追加します。

2.4 ソースコード
先ほど追加したVerilogファイルの内容は以下の通りです。
1) topdesign.v
//
//
module topdesign(sw_in, leds);
    input  wire sw_in;
    output wire [1:0] leds;
    //
   
    wire osc_clk;

    // Internal Oscillator
    defparam OSCH1.NOM_FREQ = "2.08";        //  This is the default frequency
    OSCH OSCH1( .STDBY(1'b0),         // 0=Enabled, 1=Disabled also Disabled with Bandgap=OFF
                .OSC(osc_clk),
                .SEDSTDBY());        //  this signal is not required if not using SED - see TN1199 for more details.
    // debounce
    wire sw_out;
    wire valid;
    debounce debounce1( .clk(osc_clk),
                        .sw_in(sw_in),
                        .sw_out(sw_out),
                        .valid(valid));
    // toggle
    wire enabled;
    toggle toggle1( .clk(osc_clk),
                    .sw_in(sw_out),
                    .valid(valid),
                    .enabled_out(enabled));
    //
    reg [19:0] counter = 20'h00000;
    always @(posedge osc_clk) begin
        if (enabled)
            counter <= counter + 20'h00001;
    end
    assign leds[0] = enabled;
    assign leds[1] = counter[19];
endmodule


2) debounce.v
module debounce(clk, sw_in, sw_out, valid);
    input wire clk;
    input wire sw_in;
    output wire sw_out;
    output wire valid;
    //
    reg [15:0] counter = 16'h0000;
    reg sampling_clk = 1'b0;
   
    // generate sampling clock (100Hz)
    always @(posedge clk) begin
        if (counter == (16'd20080 - 16'd1)) begin
            counter <= counter + 16'h0000;           
            sampling_clk <= 1;
        end
        else begin
            counter <= counter + 16'h0001;
            sampling_clk <= 0;
        end
    end
    //
    reg [2:0] sw_status =3'b111;
    reg valid_int = 1'b0;
   
    assign sw_out = !sw_status[2];
    assign valid = valid_int;
    always @(posedge clk) begin
        if (sampling_clk == 1'b1) begin
            sw_status[2:0] <= {sw_status[1:0], sw_in};
            if ((&sw_status == 1'b1) || (|sw_status == 1'b0))
                valid_int <= 1'b1;
            else
                valid_int <= 1'b0;
        end
    end
endmodule


3) toggle.v
module toggle(clk, sw_in, valid, enabled_out);
    input wire clk;
    input wire sw_in;
    input wire valid;
    output enabled_out;
    //
    reg [1:0] sw_status = 2'b00;
    reg enabled = 1'b0;
    //
    always @(posedge clk) begin
        sw_status[1] <= sw_status[0];
        sw_status[0] <= valid ? sw_in : sw_status[0];
        if (!sw_status[1] && sw_status[0])
            enabled <= !enabled;
    end
    //
    assign enabled_out = enabled;
endmodule


2.5 最上位のモジュールを指定
"Project"メニューから"Active Implementation"→"Set Top-Level Unit..."の順番に選択します。
イメージ 7
メニュー選択

以下のダイアログが表示されます。赤枠内をクリックします。
イメージ 5
Project Propertyダイアログ(選択前)

選択すると以下のように表示が変わります。"OK"をクリックします。
イメージ 6
Project Propertyダイアログ(選択後)

次は論理合成を行います。


Zwerg
Zwerg
非公開 / 非公開
人気度
Yahoo!ブログヘルプ - ブログ人気度について

最新の画像つき記事一覧

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Yahoo!からのお知らせ

開​設日​: ​20​16​/7​/1​2(​火)​

よしもとブログランキング

もっと見る
本文はここまでですこのページの先頭へ
みんなの更新記事