Hallo.
Ich lerne weiter die FPGA-"Programmierung".
Hier ist mein Werk:
1 | ENTITY U2 IS
|
2 | PORT(
|
3 | CLK : IN STD_LOGIC;
|
4 | Din :IN STD_LOGIC_VECTOR(7 downto 0);
|
5 | ADDR: IN INTEGER RANGE 0 to 511;
|
6 | Dout : OUT STD_LOGIC_VECTOR(7 downto 0)
|
7 | );
|
8 | END U2;
|
9 |
|
10 | ARCHITECTURE RD OF U2 IS
|
11 |
|
12 |
|
13 | BEGIN
|
14 | PROCESS(CLK)
|
15 | TYPE PIC IS ARRAY (0 to 511) OF STD_LOGIC_VECTOR (7 downto 0);
|
16 | VARIABLE DATA:PIC;
|
17 | VARIABLE i: INTEGER RANGE 0 to 511;
|
18 | BEGIN
|
19 |
|
20 | IF (CLK'EVENT AND CLK='1') THEN
|
21 | DATA(i) := Din;
|
22 | i:= i+1;
|
23 | IF (i>511) THEN
|
24 | i:=0;
|
25 | END IF;
|
26 | Dout <= DATA(ADDR);
|
27 |
|
28 | END IF;
|
29 |
|
30 | END PROCESS;
|
31 | END RD;
|
Wie man schon erahnen kann, ist es so ein 512x8 Bit RAM.
Quartus erkennt das auch, und verwendet für die oben beschriebene
Programm interne Memory Bits.
SO.
Aber schreibe ich jetzt es einwenig anders, und zwar:
1 | IF (CLK'EVENT AND CLK='1') THEN
|
2 | DATA(i) := Din;
|
3 | i:= i+1;
|
4 | IF (i>511) THEN
|
5 | i:=0;
|
6 | END IF;
|
7 | END IF;
|
8 | Dout <= DATA(ADDR);
|
Dann verwenden Quartus die LE, und zwar über 7000 stück, und keine
Momery Bits.
Ich neheme an, die erste Methode ist schlauer, da man damit wichtige
Resourcen sparen kann.
Meine Frage ist aber, wieso macht es so einen Unterschiend, ob
Dout <= DATA(ADDR);
in IF statement oder außerhalb liegt?
Kann mir das bitte jemand erklären, damit ich in der Zukunft sowas
berücksichtigen kann.
Danke