设计risc处理器的家庭作业。我有这样的16位PC
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源的Mux是
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乘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);
现在的问题是我如何端口映射mem组件,因为pc是16位且地址是8位
rom: mem port map(address=>???, clock=>clk, q=>instr_din);
答案 0 :(得分: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);
你完成了。