Forum: FPGA, VHDL & Co. 4-Bit-Register in VHDL


von Phill (Gast)


Lesenswert?

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
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity reg_test is port (
5
  CLK  :  in  std_logic;
6
  CE    :  in  std_logic;
7
  CLR  :  in  std_logic;
8
  D    :  in  std_logic_vector(3 downto 0);
9
  Q    :  out  std_logic_vector(3 downto 0));
10
end reg_test;
11
12
architecture regtest_arch of reg_test is
13
component FDCE_A port(
14
  CLK  :  in  std_logic;
15
  CE    :  in  std_logic;
16
  CLR  :  in  std_logic;
17
  D    :  in  std_logic;
18
  Q    :  out  std_logic);
19
  end component;
20
  begin
21
  --------Component Instances--------
22
  fdc_1a:  FDCE_A port map(    --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_A port map(    --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_A port map(    --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_A port map(    --D-Flip-Flop 3 mit CE
44
  D => D(3),
45
  CLK => CLK,
46
  CE => CE,
47
  CLR => CLR,
48
  Q => Q(3));
49
end regtest_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.

von Phill (Gast)


Lesenswert?

*strukturellen Entwurf

von Duke Scarring (Gast)


Lesenswert?

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
Library UNISIM;
2
use UNISIM.vcomponents.FDCE;

Ich würde das ganze Konstrukt generisch schreiben (und auf asynchrone 
Signale verzichten):
1
entity reg_test is port 
2
(
3
  CLK  :  in   std_logic;
4
  CE   :  in   std_logic;
5
  CLR  :  in   std_logic;
6
  D    :  in   std_logic_vector(3 downto 0);
7
  Q    :  out  std_logic_vector(3 downto 0)
8
);
9
end entity reg_test;
10
11
architecture generic of reg_test is
12
13
begin
14
  
15
  process( CLK, CE, CLR)
16
  begin
17
    if CLR = '1' then
18
      Q <= (others => '1');
19
    elsif rising_edge( CLK) and CE = '1' then
20
      Q <= D;
21
    end if;
22
  end process;
23
24
end architecture reg_test;

Duke

von Phill (Gast)


Lesenswert?

Okay, danke für deine Antwort. Ist es nicht möglich, für jedes Flip-Flop 
noch ein extra Design zu erstellen, in etwa so?
1
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity dflip_flop is port (
5
  CLK  :  in    std_logic;
6
  CLR  :  in    std_logic;
7
  CE   :  in     std_logic;
8
  D  :       in    std_logic;
9
  Q  :  out           std_logic);
10
end  dflip_flop ;
11
12
architecture dflip_flop_ARCH of dflip_flop is
13
begin
14
15
d1:  process( CLK, CLR)
16
begin
17
  if CLR = '1' then
18
    Q <= '0';
19
  elsif (CLK'event and CLK = '1') then  
20
  if CE = '1' then
21
    Q <= D;
22
  end if;
23
  end if;
24
end process d1;
25
26
end dflip_flop_ARCH ;
Klar, wäre natürlich viel aufwendiger als eine Verhaltensbeschreibung, 
aber wäre es möglich für jedes der 4 Flip-Flops solch ein Modul zu 
erstellen.

von Phill (Gast)


Lesenswert?

Nur das die Entity dann eben fdc_1a und nicht dflip_flop heißt.

von Thomas W. (diddl)


Lesenswert?

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'?

von Samuel C. (neoexacun)


Lesenswert?

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.

von Thomas W. (diddl)


Lesenswert?

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 …

von Habemus google (Gast)


Lesenswert?

Samuel C. schrieb:
> Das bedeutet, dass alle übrigen Bits von Q (also alle) auf '1' gesetzt
> werden.

Thomas W. schrieb:
> Auf die Gefahr hin, dass meine Frage dumm erscheint …
> … bitte was genau bedeutet:
>
>  Q <= (others => '1');
>
> Der rest ist sonnenklar, aber diese Zeile … ???

Google: VHDL others
https://www.uni-ulm.de/fileadmin/website_uni_ulm/iui.inst.050/vorlesungen/sose09/lrob/Crashkurs_VHDL.pdf
auf seite 8 wird es sogar auf deutsch erklärt.

Genaueres auf english unter "positional assignment array"

https://www.ics.uci.edu/~jmoorkan/vhdlref/aggregat.html

BTW: IMHO sollte CLR auf '0' und nicht auf '1' setzen.

von Markus F. (mfro)


Lesenswert?

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
library ieee;
2
use ieee.std_logic_1164.all;
3
4
entity reg_test is
5
    generic
6
    (
7
        REG_WIDTH    : natural := 4
8
    );
9
    port
10
    (
11
        CLK  :  in  std_logic;
12
        CE   :  in  std_logic;
13
        CLR  :  in  std_logic;
14
        D    :  in  std_logic_vector(REG_WIDTH - 1 downto 0);
15
        Q    :  out  std_logic_vector(REG_WIDTH - 1 downto 0)
16
    );
17
end reg_test;
18
19
architecture regtest_arch of reg_test is
20
    component FDCE_A is
21
        port
22
        (
23
            CLK   :  in  std_logic;
24
            CE    :  in  std_logic;
25
            CLR   :  in  std_logic;
26
            D     :  in  std_logic;
27
            Q     :  out  std_logic
28
        );
29
    end component;
30
begin
31
    --------Component Instances--------
32
    gen: for i in 0 to REG_WIDTH - 1 generate
33
        fdc:  FDCE_A
34
            port map
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
    end generate;
43
end architecture regtest_arch;

Dann lässt sich das auch für beliebige Registerbreiten wiederverwenden

von Phill (Gast)


Lesenswert?

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.
1
d1:process(CLR,CLK)
2
begin
3
  if CLR = '1' then
4
    Q <= '0000';
5
  elsif(CLK'event and CLK = '1') then
6
                if CE = '1' then
7
    Q <= D;
8
                end if;
9
  end if;
10
end process p1;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Warum so ausschweifend?
Das geht doch auch als Einzeiler ohne diese Herumprozessiererei ;-)
1
Q <= (others=>'0') when CLR = '1'  else
2
        D when rising_edge(CLK) and CE = '1';

: Bearbeitet durch Moderator
von Ale (Gast)


Lesenswert?

> Q <= '0000';

du meinst bestimmt
1
Q <= "0000";
:)

von Thomas0815 (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.