mikrocontroller.net

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.
Autor: Phill (Gast)
Datum:

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.

Autor: Phill (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
*strukturellen Entwurf

Autor: Duke Scarring (Gast)
Datum:

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

Autor: Phill (Gast)
Datum:

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.

Autor: Phill (Gast)
Datum:

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

Autor: Thomas W. (diddl)
Datum:

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

Autor: Samuel C. (neoexacun)
Datum:

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.

Autor: Thomas W. (diddl)
Datum:

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 …

Autor: Habemus google (Gast)
Datum:

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.

Autor: Markus F. (mfro)
Datum:

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

Autor: Phill (Gast)
Datum:

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;

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

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
Autor: Ale (Gast)
Datum:

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

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

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.

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