The BAQ/Data Acquisition/DAQ Module/LUPO/NIM入力をLEDで表示する

Japanese English
Nuclear Physics Data Acquisition Orchestra Gallery Memo Diary Link Home
DAQ System DAQ Module Pulse Shape Analysis RTLinux Linux Device Driver Home

もどる

○ 一番簡単な方法は、

メインの例えばCLUPOLED.vhdに

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity CLUPOLED is
  port (
    LED      : out STD_LOGIC_VECTOR (7 downto 0);
    IP       : in  STD_LOGIC_VECTOR (3 downto 0));
end CLUPOLED;

architecture Behavioral of CLUPOLED is

begin

LED(3 downto 0) <= IP;

end Behavioral;

CLUPO.ucfに

NET "IP[0]"  LOC = "P202" | IOSTANDARD = LVTTL ; 
NET "IP[1]"  LOC = "P203" | IOSTANDARD = LVTTL ; 
NET "IP[2]"  LOC = "P204" | IOSTANDARD = LVTTL ; 
NET "IP[3]"  LOC = "P205" | IOSTANDARD = LVTTL ; 
NET "LED[0]"  LOC = "P189" | IOSTANDARD = LVTTL ; 
NET "LED[1]"  LOC = "P190" | IOSTANDARD = LVTTL ; 
NET "LED[2]"  LOC = "P192" | IOSTANDARD = LVTTL ; 
NET "LED[3]"  LOC = "P193" | IOSTANDARD = LVTTL ; 
NET "LED[4]"  LOC = "P196" | IOSTANDARD = LVTTL ; 
NET "LED[5]"  LOC = "P197" | IOSTANDARD = LVTTL ; 
NET "LED[6]"  LOC = "P199" | IOSTANDARD = LVTTL ; 
NET "LED[7]"  LOC = "P200" | IOSTANDARD = LVTTL ; 

と書けば、Input 0〜3をLED 0〜3につなげてくれる。
NIM入力にLevel信号のように幅の長いパルスを入れればLEDの光を見ることができる。
が、実用的には短い信号でも1発入ったら目で見れるようにしたいので、内蔵CLOCKを使ってストレッチしてあげる。
ちなみに、ucfに使っていないポートが書いてあるとエラーになるので、上記のようにシンプルにしたい場合はucfから余計なものを除いてあげる必要がある。

○ 1/1000000のモジュール

短いパルスが1発来たら1発来たと目で判断できるようにするために、短くともLEDを20ms光らせる機構を作る。
内蔵クロックは50MHz=20ns周期なので、これをリセット時からクロックが10^6動いた間だけ'1'を返すモジュールを作ってあげればよい。
で、CLOCKなども使うのでucfやらポートの設定やらは汎用のものを使う。

手順は、[New Source]とやって、モジュール名をDIV1Mとつけて、下記のように記述すればよい。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity DIV1M is
    Port ( clk : in  STD_LOGIC;
           rst : in  STD_LOGIC;
           q   : out STD_LOGIC);
end DIV1M;

architecture Behavioral of DIV1M is

signal cnt : std_logic_vector(19 downto 0) := x"00000";
signal iq : std_logic := '0';

begin

q <= iq;

  process(clk, rst)
  begin
    if(rst = '1') then
      cnt <= (others => '0');
      iq <= '1';
    elsif(clk'event and clk = '1') then
      if(cnt = 999999) then
        cnt <= (others => '0');
        iq <= '0';
      else
        cnt <= cnt + '1';
      end if;
    end if;
  end process;

end Behavioral;

cnt=カウンタを作るためにvectorを用意してあげる。1000000をカウントするためには20bit=2^20を用意してあげればよい。

このファイルはこちら。
DIV1M.vhd


○ メインの部分からDIV1Mを使う。

実際に入力とDIV1MとLEDをつなげる。
clkにCLOCK、rstにIP、qにLEDをport mapでつなげればよい。
IRQ <= '0'やクロックプロセスもとりあえず記述しておく。

architecture Behavioral of CLUPOIORegister is

component DIV1M
  port ( clk : in  STD_LOGIC;
         rst : in  STD_LOGIC;
         q : out  STD_LOGIC);
end component;

begin
DIV1M_MAPgene : for i in 0 to 3 generate
DIV1M_MAP : DIV1M
  port map (
    clk => CLOCK,
    rst => IP(i),
    q => LED(i));
end generate;

IRQ <= '0';

clk_proc : process(CLOCK)
  begin
    if(CLOCK'event and CLOCK = '1')then
    end if;
  end process clk_proc;

end Behavioral;

Last Update: 2009/9/24
Hidetada Baba
baba ribf.riken.jp