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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Phill (Gast)


Bewertung
0 lesenswert
nicht 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
library ieee;
use ieee.std_logic_1164.all;

entity reg_test is port (
  CLK  :  in  std_logic;
  CE    :  in  std_logic;
  CLR  :  in  std_logic;
  D    :  in  std_logic_vector(3 downto 0);
  Q    :  out  std_logic_vector(3 downto 0));
end reg_test;

architecture regtest_arch of reg_test is
component FDCE_A port(
  CLK  :  in  std_logic;
  CE    :  in  std_logic;
  CLR  :  in  std_logic;
  D    :  in  std_logic;
  Q    :  out  std_logic);
  end component;
  begin
  --------Component Instances--------
  fdc_1a:  FDCE_A port map(    --D-Flip-Flop 1 mit CE
  D => D(0),
  CLK => CLK,
  CE => CE,
  CLR => CLR,
  Q => Q(0));
  
  fdc_2a:  FDCE_A port map(    --D-Flip-Flop 2 mit CE
  D => D(1),
  CLK => CLK,
  CE => CE,
  CLR => CLR,
  Q => Q(1));
  
  fdc_3a:  FDCE_A port map(    --D-Flip Flop 3 mit CE
  D => D(2),
  CLK => CLK,
  CE => CE,
  CLR => CLR,
  Q => Q(2));
  
  fdc_4a:  FDCE_A port map(    --D-Flip-Flop 3 mit CE
  D => D(3),
  CLK => CLK,
  CE => CE,
  CLR => CLR,
  Q => Q(3));
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)


Bewertung
0 lesenswert
nicht lesenswert
*strukturellen Entwurf

von Duke Scarring (Gast)


Bewertung
0 lesenswert
nicht 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:
Library UNISIM;
use UNISIM.vcomponents.FDCE;

Ich würde das ganze Konstrukt generisch schreiben (und auf asynchrone 
Signale verzichten):
entity reg_test is port 
(
  CLK  :  in   std_logic;
  CE   :  in   std_logic;
  CLR  :  in   std_logic;
  D    :  in   std_logic_vector(3 downto 0);
  Q    :  out  std_logic_vector(3 downto 0)
);
end entity reg_test;

architecture generic of reg_test is

begin
  
  process( CLK, CE, CLR)
  begin
    if CLR = '1' then
      Q <= (others => '1');
    elsif rising_edge( CLK) and CE = '1' then
      Q <= D;
    end if;
  end process;

end architecture reg_test;

Duke

von Phill (Gast)


Bewertung
0 lesenswert
nicht 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?
library ieee;
use ieee.std_logic_1164.all;

entity dflip_flop is port (
  CLK  :  in    std_logic;
  CLR  :  in    std_logic;
  CE   :  in     std_logic;
  D  :       in    std_logic;
  Q  :  out           std_logic);
end  dflip_flop ;

architecture dflip_flop_ARCH of dflip_flop is
begin

d1:  process( CLK, CLR)
begin
  if CLR = '1' then
    Q <= '0';
  elsif (CLK'event and CLK = '1') then  
  if CE = '1' then
    Q <= D;
  end if;
  end if;
end process d1;

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)


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

von Thomas W. (diddl)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:
library ieee;
use ieee.std_logic_1164.all;

entity reg_test is
    generic
    (
        REG_WIDTH    : natural := 4
    );
    port
    (
        CLK  :  in  std_logic;
        CE   :  in  std_logic;
        CLR  :  in  std_logic;
        D    :  in  std_logic_vector(REG_WIDTH - 1 downto 0);
        Q    :  out  std_logic_vector(REG_WIDTH - 1 downto 0)
    );
end reg_test;

architecture regtest_arch of reg_test is
    component FDCE_A is
        port
        (
            CLK   :  in  std_logic;
            CE    :  in  std_logic;
            CLR   :  in  std_logic;
            D     :  in  std_logic;
            Q     :  out  std_logic
        );
    end component;
begin
    --------Component Instances--------
    gen: for i in 0 to REG_WIDTH - 1 generate
        fdc:  FDCE_A
            port map
            (    --D-Flip-Flop 1 mit CE
                D => D(i),
                CLK => CLK,
                CE => CE,
                CLR => CLR,
                Q => Q(i)
            );
    end generate;
end architecture regtest_arch;

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

von Phill (Gast)


Bewertung
0 lesenswert
nicht 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.
d1:process(CLR,CLK)
begin
  if CLR = '1' then
    Q <= '0000';
  elsif(CLK'event and CLK = '1') then
                if CE = '1' then
    Q <= D;
                end if;
  end if;
end process p1;

von Lothar M. (lkmiller) (Moderator) Benutzerseite


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

: Bearbeitet durch Moderator
von Ale (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Q <= '0000';

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

von Thomas0815 (Gast)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.