| ||||||||
| ||||||||
|
もどる
○ 一番簡単な方法は、
メインの例えば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発来たら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