0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ずっとFPGA初心者(その4:複数信号を束ねる)

Posted at

複数信号を束ねる

今回のお題は、std_logic_vector()を使って複数の信号線を束ねるもの。

ボタン押下回数を表現

その1から使っているOdyssey MAX10 FPGA Eval Kitの7つのLED(LED0-LED7)を用いて、ボタン押下の回数を表現する。例えば、5回押した場合、LED0とLED2とを点灯させる(00000101)。7セグメントディスプレイの方がふさわしいが、手元になかったため、ボード上のLEDを用いた。

コード

Vector.vhd
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」を変換対象としている。

ピンアサイン

PinPlanner.png
Pin Plannerを用いて、上記のようにアサイン。ピン情報などは、その1を参照。

実験

成功。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?