複数信号を束ねる
今回のお題は、std_logic_vector()を使って複数の信号線を束ねるもの。
ボタン押下回数を表現
その1から使っているOdyssey MAX10 FPGA Eval Kitの7つのLED(LED0-LED7)を用いて、ボタン押下の回数を表現する。例えば、5回押した場合、LED0とLED2とを点灯させる(00000101)。7セグメントディスプレイの方がふさわしいが、手元になかったため、ボード上のLEDを用いた。
コード
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all; -- ①
entity Vector is
port (BTN: in std_logic;
LED0, LED1, LED2, LED3, LED4, LED5, LED6, LED7: out std_logic);
end Vector;
architecture RTL of Vector is
signal NUM: integer := 0;
signal LED: std_logic_vector(7 downto 0) := "00000000"; -- ②
begin
LED0 <= not LED(0); LED1 <= not LED(1); -- ③
LED2 <= not LED(2); LED3 <= not LED(3);
LED4 <= not LED(4); LED5 <= not LED(5);
LED6 <= not LED(6); LED7 <= not LED(7);
process (BTN)
begin
if (BTN'event and BTN='0') then
NUM <= NUM+1; -- ④
LED <= conv_std_logic_vector(NUM+1,8); -- ⑤
end if;
end process;
end RTL;
①後述するconv_std_logic_vector()を使うには、「ieee.std_logic_arith.all」が必要であった。
②std_logic_vectorを用いた内部信号LEDの定義(MSBがbit 7)。
③本ボードでは負論理
④ボタン押下時、内部信号NUMをインクリメント
⑤「conv_std_logic_vector()」を用いて、Integer型からstd_logic_vector型であるLEDへ変換。なお、内部信号は次のProcess文が呼ばれる時に更新されるため、「NUM+1」を変換対象としている。
ピンアサイン
Pin Plannerを用いて、上記のようにアサイン。ピン情報などは、その1を参照。
実験
成功。