↓これ。トレーニングボードです。(EDA-002。お値段は結構する)
手始めに組んで見ようと思ったのが、1秒間に何回スイッチが押されたか表示するプログラム。
スピンドルに付ければ回転数が表示出来る、的なもの。
一応、秒間1~9回の認識が出来るようになりました、が。
何でマイコンならすぐに出来るものを、いちいちFPGAで6時間かけて作らなけらばならなかったのか…?
(ノA`)これそういうデバイスじゃねぇから!!
覚書用メモ
Cみたいだから楽勝とか思っていたら概念が全然違いました。('A`)
並列処理で適当な時間ウェイト設けようと思ったらクロックやフラグ設けたり面倒な事になった。
(´・ω・`)やり方がいけないんだ、たぶん。作っててパッとしないソースになったから。
■変数の宣言
signal flag : Integer := 0;
signal:信号の種類
flag:変数の名前
Integer:変数の型
= 0:入する数値(省略可能)
■if文
process (PSW_A) begin
if (PSW_A 'event) and (PSW_A='0') then
if (f_log = BBB) then
upc<=upc+1;
else
f_log <= BBB;
log<=upc;
upc<=1;
end if;
end if;
end process;
processで挟まないと怒られる。
しかもprocess内で変更している関数を、別のprocess内で変更しても怒られる。この条件がマジで勘弁してほしい。('A`)
(変数など)(スペース)'event と書くと、関数の中身が変わった時に実行されるIF文になる。
マイコンの割り込みみたいなものか?
入力端子とかを割り振ると、立ち上がり立下りで反応するので、そのあとで
and (変数='0')とすると、立ち上がり立下り後、信号がLOWの時に反応する条件文になるので、立下りを認識する。
■代入
A=B
とか書いていたのが、
A<=Bになる。
矢印のつもりか!! 条件文みたいになってんぞ、ふざけんな!!
■実行するプログラム
何回もくりかえし処理する場合、Cだと
for(;;){
繰り返すプログラム
}
とかしてたのが、ループがない。
設定した式や条件文を常に実行しているような形になる。
begin以降がメインのようなので、begin以降に条件を書く。
一応ソースをはって置くけど、とても扱える人には見せられない。(:ノω`)
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity test is
port(
CLK:in std_logic;
PSW_A:in std_logic;
PSW_B:in std_logic;
PSW_C:in std_logic;
LED_C:out std_logic;
LCD1_PWR:out std_logic;
LCD2_PWR:out std_logic;
LCD3_PWR:out std_logic;
LCD4_PWR:out std_logic;
LCD_A:out std_logic;
LCD_B:out std_logic;
LCD_C:out std_logic;
LCD_D:out std_logic;
LCD_E:out std_logic;
LCD_F:out std_logic;
LCD_G:out std_logic;
LCD_DOT:out std_logic);
end test;
architecture RTL of test is
signal BBB : Integer := 0;
signal cnt1 : Integer := 0;
signal cnt2 : Integer := 0;
signal upc : Integer := 0;
signal flag : Integer := 0;
signal f_log : Integer := 0;
signal vol : Integer := 0;
signal log : Integer := 0;
begin
process (PSW_A) begin
if (PSW_A 'event) and (PSW_A='0') then
if (f_log = BBB) then
upc<=upc+1;
else
f_log <= BBB;
log<=upc;
upc<=1;
end if;
end if;
end process;
process (CLK) begin
if (CLK 'event) and (CLK='0') then
cnt1<=cnt1+1;
end if;
if (cnt1>100000) then
cnt1<=0;
cnt2<=cnt2+1;
end if;
if (cnt2>70)then
cnt2<=0;
BBB<=BBB+1;
if (BBB < 9)then
BBB<=BBB+1;
elsif (BBB > 8)then
BBB<=0;
end if;
end if;
end process;
process (log) begin
if(log = 0) then
LCD_A<='0';
LCD_B<='0';
LCD_C<='0';
LCD_D<='0';
LCD_E<='0';
LCD_F<='0';
LCD_G<='1';
elsif(log = 1) then
LCD_A<='1';
LCD_B<='0';
LCD_C<='0';
LCD_D<='1';
LCD_E<='1';
LCD_F<='1';
LCD_G<='1';
elsif(log = 2) then
LCD_A<='0';
LCD_B<='0';
LCD_C<='1';
LCD_D<='0';
LCD_E<='0';
LCD_F<='1';
LCD_G<='0';
elsif(log = 3) then
LCD_A<='0';
LCD_B<='0';
LCD_C<='0';
LCD_D<='0';
LCD_E<='1';
LCD_F<='1';
LCD_G<='0';
elsif(log = 4) then
LCD_A<='1';
LCD_B<='0';
LCD_C<='0';
LCD_D<='1';
LCD_E<='1';
LCD_F<='0';
LCD_G<='0';
elsif(log = 5) then
LCD_A<='0';
LCD_B<='1';
LCD_C<='0';
LCD_D<='0';
LCD_E<='1';
LCD_F<='0';
LCD_G<='0';
elsif(log = 6) then
LCD_A<='0';
LCD_B<='1';
LCD_C<='0';
LCD_D<='0';
LCD_E<='0';
LCD_F<='0';
LCD_G<='0';
elsif(log = 7) then
LCD_A<='0';
LCD_B<='0';
LCD_C<='0';
LCD_D<='1';
LCD_E<='1';
LCD_F<='0';
LCD_G<='1';
elsif(log = 8) then
LCD_A<='0';
LCD_B<='0';
LCD_C<='0';
LCD_D<='0';
LCD_E<='0';
LCD_F<='0';
LCD_G<='0';
else
LCD_A<='0';
LCD_B<='0';
LCD_C<='0';
LCD_D<='0';
LCD_E<='1';
LCD_F<='0';
LCD_G<='0';
end if;
end process;
end RTL;