私はある種のキャッシュを作成しており、std_logic_vectors で構成されるエンティティ内でいくつかのテーブル (大きなもの) を使用しており、Quartus 2 Web 版でそれを行っています。
シミュレーションではすべて正常に動作しますが、合成しようとすると、ラッチ、AND および OR コンポーネントでのみ実行されます。
これらの組み合わせ要素の代わりに、これらのテーブルにメモリ モジュールを使用するように Quartus を指定する方法はありますか? または、VHDL コード自体から何かを実行できるかもしれません。
library ieee;
use ieee.std_logic_1164.all;
package UTIL_PACK is
type matrix16x8 is array (0 to 15) of std_logic_vector(0 to 7);
type matrix2p4x8 is array (0 to 2**4) of matrix16x8;
end package;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.util_pack.all;
entity RAM16B is
port(
signal RD: in std_logic;
signal WR: in std_logic;
signal CLK: in std_logic;
signal A: in std_logic_vector(7 downto 0);
signal D: inout matrix16x8;
signal FC: out std_logic
);
end entity ;
architecture RAM16B_IMPL of RAM16B is
signal memory: matrix2p4x8 := ((others => (others => (others => 'Z'))));
begin
run:process(clk)is
variable slot:integer range 0 to 15 :=0;
begin
if(clk='1') then
slot := TO_INTEGER(unsigned(A)) rem 16;
if(rd = '1')then
FC<='0';
for i in 0 to 3 loop
D(i) <= memory(i)(slot);
end loop;
FC<='1';
elsif(wr = '1')then
FC<='0';
for i in 0 to 3 loop
memory(i)(slot) <= D(i);
end loop;
FC<='1';
else
FC <= 'Z';
D <= ( others => ( others => 'Z' ));
end if;
else
FC <= 'Z';
D <= ( others => ( others => 'Z' ));
end if;
end process;
end architecture RAM16B_IMPL;
RAM は 16 ブロックのメモリで構成され、各ブロックは 16 バイトです。より多くのデータを並行して読み込もうとしているので、1 サイクルあたり 16 バイトのデータを読み書きしています。スロットは、読み取り/書き込みが行われているブロックを定義します。