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