|
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..."の順番で選択します。 新規ファイルの作成
2) ファイル種別から"Verilog Files"を選択し、ファイル名を入力します。この例では"topdesign"を指定しています。3) 以上でプロジェクトにVerilogファイル"topdesign.v"が追加されます。 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..."の順番に選択します。 以下のダイアログが表示されます。赤枠内をクリックします。 Project Propertyダイアログ(選択前)
選択すると以下のように表示が変わります。"OK"をクリックします。 Project Propertyダイアログ(選択後)
次は論理合成を行います。 |
>
- コンピュータとインターネット
>
- コンピュータ
>
- 周辺機器