0

我有一个任务是用 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 定义为无符号或整数,但结果是一样的。我究竟做错了什么?

4

2 回答 2

2

由于您将指令 t 定义为数组(255 到 0),因此初始化数组的顺序可能与您预期的相反。

(LOAD & x"07")将分配给 ROM(255),(ADD & x"05")将分配给 ROM(254),等等。

将类型定义instruction_t为 anarray (0 to 255)以避免此问题。

于 2013-06-03T10:13:20.443 回答
2

解决问题的另一种方法是将您的指令绑定到您想要的特定地址,而不是仅仅期望它发生:为此,使用命名关联并编写

constant ROM :
instruction_t :=
(
   0 => (LOAD & x"07"),
   1 => (ADD & x"05"),
   -- some more code goes here
   others => x"0000"
);
于 2013-06-03T13:19:39.123 回答