Hallo,
Ich habe ein Code für ein 4-Bit Register in einem alten
Digitaltechnik-Buch gefunden. Ich denke es handelt sich dabei um einen
strukturellen
1
libraryieee;
2
useieee.std_logic_1164.all;
3
4
entityreg_testisport(
5
CLK:instd_logic;
6
CE:instd_logic;
7
CLR:instd_logic;
8
D:instd_logic_vector(3downto0);
9
Q:outstd_logic_vector(3downto0));
10
endreg_test;
11
12
architectureregtest_archofreg_testis
13
componentFDCE_Aport(
14
CLK:instd_logic;
15
CE:instd_logic;
16
CLR:instd_logic;
17
D:instd_logic;
18
Q:outstd_logic);
19
endcomponent;
20
begin
21
--------Component Instances--------
22
fdc_1a:FDCE_Aportmap(--D-Flip-Flop 1 mit CE
23
D=>D(0),
24
CLK=>CLK,
25
CE=>CE,
26
CLR=>CLR,
27
Q=>Q(0));
28
29
fdc_2a:FDCE_Aportmap(--D-Flip-Flop 2 mit CE
30
D=>D(1),
31
CLK=>CLK,
32
CE=>CE,
33
CLR=>CLR,
34
Q=>Q(1));
35
36
fdc_3a:FDCE_Aportmap(--D-Flip Flop 3 mit CE
37
D=>D(2),
38
CLK=>CLK,
39
CE=>CE,
40
CLR=>CLR,
41
Q=>Q(2));
42
43
fdc_4a:FDCE_Aportmap(--D-Flip-Flop 3 mit CE
44
D=>D(3),
45
CLK=>CLK,
46
CE=>CE,
47
CLR=>CLR,
48
Q=>Q(3));
49
endregtest_arch;
Meine Frage:
Muss ich, damit das Design funktioniert, noch VHDL-Code für die
einzelnen Flip-Flops seperat erstellen oder ist das Design so
funktionsfähig?
Der Sythesizer meint wohl ersteres:
Error (12006): Node instance "fdc_1a" instantiates undefined entity
"FDCE_A". Ensure that required library paths are specified correctly,
define the specified entity, or change the instantiation. If this entity
represents Intel FPGA or third-party IP, generate the synthesis files
for the IP.
Phill schrieb:> ein 4-Bit Register in einem alten> Digitaltechnik-Buch gefunden
Das kann nicht so dolle sein, das Buch.
FDCE_A ist von Xilinx und heißt inzwischen FDCE.
Wenn Du die passende Bibliothek einbindest, sollte der Code
funktionieren:
1
LibraryUNISIM;
2
useUNISIM.vcomponents.FDCE;
Ich würde das ganze Konstrukt generisch schreiben (und auf asynchrone
Signale verzichten):
Für mich ist Verilog einfacher zu lesen.
Aber VHDL ist irgendwie einfach schöner und strukturierter.
Duke Scarring schrieb:> if CLR = '1' then> Q <= (others => '1');
Auf die Gefahr hin, dass meine Frage dumm erscheint …
… bitte was genau bedeutet:
Q <= (others => '1');
Der rest ist sonnenklar, aber diese Zeile … ???
Eine Zuweisung zu Q, soweit klar.
Aber was ist "other" und was bedeutet "=>" in Richtung der '1'?
Thomas W. schrieb:> Eine Zuweisung zu Q, soweit klar.> Aber was ist "other" und was bedeutet "=>" in Richtung der '1'?
Das bedeutet, dass alle übrigen Bits von Q (also alle) auf '1' gesetzt
werden.
Samuel C. schrieb:> Das bedeutet, dass alle übrigen Bits von Q (also alle) auf '1' gesetzt> werden.
ah, danke. :-)
Vielleicht sollte ich doch mal VHDL näher anschauen …
Kein Wunder, daß es Leute gibt, die VHDL für ausschweifend und
geschwätzig halten. Wenn ich schon unbedingt ein 4-Bit Register aus vier
FFs zusammensetzen muss (warum eigentlich?), dann mach' ich das
wenigstens mit generate:
1
libraryieee;
2
useieee.std_logic_1164.all;
3
4
entityreg_testis
5
generic
6
(
7
REG_WIDTH:natural:=4
8
);
9
port
10
(
11
CLK:instd_logic;
12
CE:instd_logic;
13
CLR:instd_logic;
14
D:instd_logic_vector(REG_WIDTH-1downto0);
15
Q:outstd_logic_vector(REG_WIDTH-1downto0)
16
);
17
endreg_test;
18
19
architectureregtest_archofreg_testis
20
componentFDCE_Ais
21
port
22
(
23
CLK:instd_logic;
24
CE:instd_logic;
25
CLR:instd_logic;
26
D:instd_logic;
27
Q:outstd_logic
28
);
29
endcomponent;
30
begin
31
--------Component Instances--------
32
gen:foriin0toREG_WIDTH-1generate
33
fdc:FDCE_A
34
portmap
35
(--D-Flip-Flop 1 mit CE
36
D=>D(i),
37
CLK=>CLK,
38
CE=>CE,
39
CLR=>CLR,
40
Q=>Q(i)
41
);
42
endgenerate;
43
endarchitectureregtest_arch;
Dann lässt sich das auch für beliebige Registerbreiten wiederverwenden
Markus F. schrieb:> Wenn ich schon unbedingt ein 4-Bit Register aus vier> FFs zusammensetzen muss (warum eigentlich?)
Ich habe wie gesagt diesen Code in einem Buch gefunden und es hat mich
nur interessiert. Mir ist ebenfalls bewusst, dass ich ein 4-Bit-Register
einfacher erstellen kann.
Phill schrieb:> Nur das die Entity dann eben fdc_1a und nicht dflip_flop heißt.
Das Schöne an VHDL ist, dass deine Idee nicht zwingend ist.
Du darfst eine Configuration schreiben die festlegt, welche
entity/architecture/(configuration) verwendet wird für eine bestimmte
Instanz. Das überschreibt dann default namebinding.
Bei großen Designs mit mehreren IPs wird es hilfreich sich nicht auf
Name binding zu verlassen. Die Idee eine entity z.b. rx_if zu nennen
haben erstaunliche viele IPs.
configuration my_config of regtest is
for regtest_arch
for fdc_1a: FDCE_A
use entity mylib.dflip_flop(dflip_flop_ARCH);
end for
for fdc_2a: FDCE_A
use entity unisim.FDCE(FDCE_V);
end for