我有一个在VHDL中创建一个简单微处理器的任务。我的代码看起来像这样
architecture Behavioral of uc is
type instruction_t is array (255 downto 0) of std_logic_vector (15 downto 0);
constant LOAD : std_logic_vector(7 downto 0) :=x"01";
--some more instruction codes defined
signal PC : std_logic_vector (7 downto 0); -- program counter
signal cur_inst : std_logic_vector (15 downto 0);
constant ROM :
instruction_t :=
(
(LOAD & x"07"),
(ADD & x"05"),
-- some more code goes here
others => x"0000"
);
begin
process (CLK, RESET) is
begin
if RESET = '1' then
-- do stuff
elsif rising_edge(CLK) then
cur_inst <= ROM(conv_integer(PC));
PC <= PC + 1;
-- some other stuff
end if;
end process;
end Behavioral;
我遇到的问题是这部分:
cur_inst <= ROM(conv_integer(PC));
因为没有任何反应 - cur_inst总是为零。我尝试使用
cur_inst <= ROM(to_integer(unsigned(PC));
但结果是一样的 - 我一无所获。 PC正常递增,但我无法从ROM阵列中读取任何内容。我也尝试将PC定义为无符号或整数,但结果是相同的。我做错了什么?
答案 0 :(得分:2)
由于您将instruction_t定义为数组(255 downto 0),因此可能会按照您想要的相反顺序初始化数组。
(LOAD & x"07")
将被分配给ROM(255),(ADD & x"05")
将被分配给ROM(254)等。
将instruction_t
类型定义为array (0 to 255)
以避免此问题。
答案 1 :(得分:2)
解决问题的另一种方法是将指令绑定到您想要的特定地址,而不仅仅是期望它发生:为此,使用命名关联并写入
constant ROM :
instruction_t :=
(
0 => (LOAD & x"07"),
1 => (ADD & x"05"),
-- some more code goes here
others => x"0000"
);