0

设计RISC处理器的作业。我有这样的 16 位电脑

signal pc_din, PC, pc_rel, pc_dir, pc_inc : std_logic_vector(15 downto 0); -- pc datapath
pc_inc <= pc + 1;
pc_dir <= pc(15 downto 13) &  ADD;
pc_rel <=  pc_inc + ext(15 downto 0);

用于 PC 源的多路复用器是

with PCSrc select
pc_din <= A when from_A,
pc_rel when from_pcrel,
pc_dir when from_pcdir,
pc_inc when from_pcinc,
(others=>'-') when others;

我有 LPM 为指令存储器生成 16 x 256 单端口 ROM

component mem
PORT(
address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
clock   : IN STD_LOGIC ;
q   : OUT STD_LOGIC_VECTOR (15 DOWNTO 0)
);
end component;

PC寄存器端口映射为

pc_reg: reg Port map (clk=>clk, rst=>rst, D=>pc_din, Q=>PC, we=>ldPC);

现在的问题是我如何端口映射内存组件,因为 pc 是 16 位,地址是 8 位

rom: mem port map(address=>???, clock=>clk, q=>instr_din);
4

1 回答 1

0

可用内存小于 CPU 可以访问的内存空间是正常的。

这只是意味着您需要为您的处理器设计一个内存映射并实现它。是否有任何已知的限制可以提供帮助?

例如,某些处理器在复位时将 PC 设置为 16#FFFE#,而其他处理器设置为 0。这意味着您需要在内存空间的顶部或底部的程序存储器页面。

您还需要考虑该 PC 是字节地址还是字地址;以及(如果它是字节地址)它是否会是奇数(在这种情况下,您需要支持未对齐的地址)。既然您说它是 RISC CPU,我将假设您不需要支持未对齐的地址,但这应该在某处指定。

如果是字节寻址,则需要将字节地址转换为 ROM 的正确字地址 - 仅支持对齐访问,这很容易;只需删除 LSB。

当您设计好内存映射后,您可以设计一个仅在高位地址位为正确值时才选择程序 ROM 的解码器。有时可以通过将 ROM 映射到多个地址(将某些地址位视为无关紧要)来简化此解码,但这并不总是一个好主意,因为它可能会导致以后扩展内存时出现问题。

因此,假设字节寻址,仅对齐访问,并且您知道内存映射的样子:

ROM_Address <= PC(8 downto 1);
ROM_Enable  <= some expression involving PC(15 downto 9);

你就完成了。

于 2012-12-29T11:13:11.457 回答