1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FPGA内部の短いトリガをLEDで目視できるように引き延ばすRTL

Posted at

概要

FPGA内部のOneShotトリガの発生状況をLEDで目視したい場合、トリガ信号をLED出力ピンに接続したとしてもパルス幅が短すぎてLEDの発光を目視確認できません。

入力パルスを規定幅以上に引き延ばすモジュールを作っておいて、このモジュールを通してLED出力に接続することで目視確認しやすくなります。

注意事項

本モジュールはFPGA内部にあるクロック同期しているトリガを入力することを前提としています。
ピンから直接入ってくる(同期化していない)パルス入力信号を引き延ばしたい場合は、本モジュールの前段で同期化してエッジ検出する必要があります。

動作概要

  • 入力がアサートされると指定カウントをロード
  • カウンタはダウンカウント動作で、ゼロ到達でホールド
  • 出力パルスはダウンカント中アサートする
  • ダウンカウント中に入力が再アサートされた場合も指定カウントをロード(出力は途切れずに延長させる)

ポイント

引き延ばすクロックサイクル数の指定カウントをパラメータ化しています。
論理合成時は500msなど実際に目視できる長さにしますが、シミュレーションの500msは長すぎるのでシミュレーション時のみ10サイクルとか適当な長さにすることができます。

VHDLソース

------------------------------------------------------------------
--入力パルスを規定幅以上に引き延ばすモジュール
------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity PULSE_EXTENDER is
    generic(
    EXTEND_CYCLE    :integer := 50000000--引き延ばすクロックサイクル数(50MHzで0.5s)
    );    
    port (
    i_CLK           :in  std_logic;--クロック入力
    i_RST_p         :in  std_logic;
    i_SOURCE_PULSE_p:in  std_logic;--元のパルス
    o_EXTEND_PULSE_p:out std_logic--引き延ばしたパルス
    );
end entity;

architecture RTL of PULSE_EXTENDER is
    signal pulse_count  :integer range 0 to EXTEND_CYCLE-1;
    signal pulse_ext    :std_logic;
begin

process(i_CLK,i_RST_p)begin
    if(i_RST_p='1')then
        pulse_count <= 0;
        pulse_ext   <= '0';
    elsif(rising_edge(i_CLK))then
        if(i_SOURCE_PULSE_p='1')then
            pulse_count <= EXTEND_CYCLE-1;--カウントをロード
            pulse_ext   <= '1';
        else
            --ダウンカウントさせて0まで到達したら止める
            if(pulse_count = 0)then
                pulse_count <= 0;
                pulse_ext   <='0';
            else
                pulse_count <= pulse_count - 1;
                pulse_ext   <='1';
            end if;
        end if;
    end if;
end process;

o_EXTEND_PULSE_p <= pulse_ext;--出力パルス

end architecture;

テストベンチ

`timescale 1ns / 1ps
module PULSE_EXTENDER_tb();

reg  i_CLK           =0;
reg  i_RST_p         =1;
reg  i_SOURCE_PULSE_p=0;
wire o_EXTEND_PULSE_p;

PULSE_EXTENDER #(
    .EXTEND_CYCLE(20) // 新しいクロックサイクル数を指定
) PULSE_EXTENDER (
.i_CLK           (i_CLK           ),
.i_RST_p         (i_RST_p         ),
.i_SOURCE_PULSE_p(i_SOURCE_PULSE_p),
.o_EXTEND_PULSE_p(o_EXTEND_PULSE_p)
);
//パルス入力
task TASK_TRIGGER;
  begin
    @(posedge i_CLK);
    i_SOURCE_PULSE_p = 1;
    @(posedge i_CLK);
    i_SOURCE_PULSE_p = 0;
  end
endtask
//クロック50MHz
always #20 i_CLK = ~i_CLK;

initial begin
    #200;
    i_RST_p = 0;//リセット解除
    #500;
    TASK_TRIGGER();
    #1200;
    //アサート中に入力させる
    TASK_TRIGGER();
    #400;
    TASK_TRIGGER();
    #500;
    TASK_TRIGGER();
end

endmodule

シミュレーション

シミュレーションでは延長設定を20サイクル
に短縮しています。
1発目の入力は20サイクル(カウント19~0)に引き延ばされ、2~4発目ぱ延長した動作になります。

image.png

その他応用

パルスの発生状況をレジスタリードでモニタしたい場合にも応用できます。
リード周期より長めに引き延ばしておけばパルスが来ているか否かをモニタしやすくなります。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?