先週の金曜日からprocess文の中の4行のエラーがいくら頑張っても全く取れなかった
プロセス文を消したり、『:=』を『<=』に書き換えたり色々頑張っても
ERROR:HDLParsers:800 - "C:/Xilinx/projects/lab/MultiCycleProcessor/mem.vhd" Line 45. Type of mem_op_out is incompatible with type of op_arry.
とか
ERROR:HDLParsers:409 - "C:/Xilinx/projects/lab/MultiCycleProcessor/mem.vhd" Line 47. Signal 'mem_op_out' mem_op_out is at left hand side of variable assignment statement.
とか修正する度にエラー内容が変わって全く分からない。
ちなみにソースは↓な感じ。やりたいこととしてはVHDLで配列を使ったマルチサイクル方式の命令メモリを試しに作ろうとしていた。

----------------------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity mem is
Port ( CLK : in STD_LOGIC;
mem_ad_in : in STD_LOGIC_VECTOR (9 downto 0);
mem_op_out : out STD_LOGIC_VECTOR (31 downto 0));
end mem;
architecture Behavioral of mem is

type mem_arry is array(0 to 1023) of bit_vector(7 downto 0);
signal op_arry : mem_arry :=("00000000","01000011",・・・略・・・);

begin
process(CLK)
begin
mem_op_out(31 downto 24) := op_arry(conv_integer(mem_ad_in));
mem_op_out(23 downto 16) := op_arry(conv_integer(mem_ad_in(9 downto 0) + "0000000001"));
mem_op_out(15 downto 8) := op_arry(conv_integer(mem_ad_in(9 downto 0) + "0000000010"));
mem_op_out(7 downto 0) := op_arry(conv_integer(mem_ad_in(9 downto 0) + "0000000011"));
end process;
end Behavioral;
----------------------------------------------------------------------------------------------

で、色々悩んでたどり着いた原因がソースの赤文字の部分。まず配列の定義で『bit_vector』にしたのがまずかった。正しくは『STD_LOGIC_VECTOR』。あと『:=』はやっぱり『<=』だった。

bit_vectorとstd_logic_vectorの違いは、
bit_vectorは「0」と「1」しか使えないのに対して
std_logic_vectorは「0」「1」以外に[X,L,H,W,Z,U,-]を指定でき[ストロング、弱L、弱H、不定値、ハイインピーダンス、初期化しない、ドントケア項]になっている。

でも今回のコードは「0」「1」以外使ってないので一見するとbit_vectorでも問題なさそう。
じゃあなんでだろう?と思って、なんとなく本をペラペラ見てたらふと気がついた。

conv_integer()』のカッコの中ってbit_vector使えたっけ??

という訳で、conv_integerは何でも整数に変換できる訳では無く、std_logic_vectorの信号を整数に変換するものなので、bit_vectorは使えないというオチでした。

まさかこんな短いコードでバグが出て3日も苦しめられると思わなかったけど、いい経験になったと思って先に進みます。