0

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;

命令メモリ用に16x256のシングルポートROMを生成したLPMがあります

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ビットであるため、memコンポーネントをどのようにポートマップできるかということです。

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 に答える