Moin zusammen,
habe ein Implementierungsproblem in VHDL.
Device: Xilinx XC95144XL
Entw.umgebung: ISE 14.7
Ich möchte feststellen, ob die am CPLD anliegende Adresse bzw. der obere
Teil davon mit einem zuvor gespeicherten Teil übereintimmt. Dadurch will
ich erkennen, ob die CPU auf die gerade aktivierte Page im RAM zugreift
oder ich diese schließen und eine andere Page öffnen muss.
1 | entity RAM is
|
2 | port(
|
3 | -- CPUST side
|
4 | CLK32 : in std_logic;
|
5 | CPU_RESET : in std_logic;
|
6 | CPU_ADDR : in std_logic_vector(23 downto 1);
|
7 | (..)
|
8 | );
|
9 | end entity;
|
10 |
|
11 | architecture Behaviour of RAM is
|
12 | (..)
|
13 | signal RAM_PAGE_ACTIVE : std_logic_vector(23 downto 10);
|
14 | (..)
|
15 | process(CLK32) begin
|
16 | if rising_edge(CLK32) then
|
17 | case FSMState is
|
18 | (..)
|
19 | when PAGE_ACTIVATE =>
|
20 | RAM_PAGE_ACTIVE <= CPU_ADDR(23 downto 10);
|
21 | (..)
|
22 | when BANK_IS_ACTIVE =>
|
23 | if (CPU_ADDR(23 downto 10) = RAM_PAGE_ACTIVE) then -- um diesen Vergleich geht es
|
24 | (..)
|
25 | end if;
|
26 | end case;
|
27 | end if;
|
28 | end process;
|
29 | end architecture;
|
In einem Process wird meine FSM an jeder steigenden CLK32 Flanke
aufgerufen. Im Zustand PAGE_ACTIVATE merke ich mir die zu öffnende Page,
damit ich im Zustand BANK_IS_ACTIVE diese mit der gerade an den CPLD
Pins anliegenden Adresse vergleichen kann (d.h. die Bits 23..10).
Nun ist mir aufgefallen, daß dieser Vergleich extrem viele ProductTerms
wegfrisst: 50 je zu vergleichendem Bit! Und im 95144 habe ich "nur" 720!
An anderer Stelle vergleiche ich die CPU_ADDR mit konstanten Werten, um
zu sehen, ob auf mein RAM zugegriffen werden soll. Also ein
address-range-check!
1 | if (CPU_ADDR(23 downto 20) = "1100") then -- Zugriff auf $Cxxxxx
|
2 | (..)
|
3 | end if;
|
Das geht sehr billig, aber der Kosten für einen Vergleich mit einem sich
zur Laufzeit änderbarem Wert gehen durch die Decke.
Bin mir sicher, daß ich etwas falsch mache. Aber was?
Danke.