Forum: FPGA, VHDL & Co. prozesse Verbinden


von Markus (Gast)


Lesenswert?

Hallo!

ich habe eine Frage wie ich 2 Prozesse verbinde. Ich habe konkret einen 
um aus einem quadratur Signal clk und dir zu machen:

entity quadrature_encoder is
    Port ( isl_clk : in  STD_LOGIC;
           isl_a : in  STD_LOGIC;
           isl_b : in  STD_LOGIC;
           osl_cout_en : out  STD_LOGIC;
           osl_count_dir : out  STD_LOGIC);
end quadrature_encoder;


Wenn ich damit nun einen Counting Prozess takten möchte, wie mache ich 
das dann mit dem isl_clk. Würde der Counter auch als Eingang den 
Systemtakt haben und mit wait until rising_edge synchron gemacht, oder 
kann ich mit dem count_en und dir direkt zählen?

Ich bin wie ihr merkt gerade etwas verwirrt. Ich habe Sorge, dass 
unnötige clocks in der Sensitivitätsliste mir alles 'verranzen'

Ich bedanke mich schon mal.

von berndl (Gast)


Lesenswert?

haeh!?!?

du weisst aber schon in etwa wie HW funktioniert?

Deine Entity/Komponente hat einen Takt-Eingang (isl_clk), was du in der 
Komponente damit machst ist dann erstmal dein Problem.

Und was du mit den Outputs deiner Komponente (innerhalb der Komponente) 
so alles anstellst, woher sollen wir das wissen?

Und
> Würde der Counter auch als Eingang den
> Systemtakt haben und mit wait until rising_edge synchron gemacht, oder
> kann ich mit dem count_en und dir direkt zählen?

??? Woher sollen wir das wissen? Und ehrlich gesagt habe ich deine Frage 
noch nichtmal verstanden...

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


Lesenswert?

Markus schrieb:
> Ich habe Sorge, dass unnötige clocks in der Sensitivitätsliste mir
> alles 'verranzen'
Dem Synthesizer ist die Sensitivliste eh' vollkommen schnurz, und die 
Simulation stört sich nicht an zu vielen Signalen. Sie ist nur dann 
flasch, wenn relevante signale fehlen.

Aber idR. ist es vollkommen simpel: in einem getakteten Prozess ist nur 
ein einziger Takt (nämlich der, der zumindest in Anfängerprojekten in 
ALLEN anderen Prozessen auch drin steht) und schlimmstenfalls noch ein 
asynchroner Reset. Das wars. Wenn da mehr drin steht, dann ist das in 
99,99% aller Fälle ein Fehler.

> Ich habe konkret einen um aus einem quadratur Signal clk und dir zu
> machen:
> entity quadrature_encoder is
Das ist KEIN Prozess, sondern ein Modul, das du als Komponente 
irgendwo einbinden kannst.

Mein Tipp: fang mal ganz klein an. Mit einem BLinklicht, dann mit einem 
Lauflicht. Und immer vorher simulieren!
http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html

: Bearbeitet durch Moderator
von Markus (Gast)


Lesenswert?

Hallo!

Danke erst mal und tschuldigung, dass ich jetzt erst von mir hören 
lasse. War krank und bin einige Tage durchgecheckt worden.

Ja, da ist mir einiges begrifflich durcheinander gekommen. :-( Lothar 
Miller hat es richtig gestellt. Meinte ich allerdings auch. An berndl 
kann man sehen wie ein Thread schon wegen solcher Fehler einen miesen 
Start bekommt und zum scheitern verurteilt ist.

Also meine Frage ist, wie ich sinnig mit dem Modul zum Encoder einen 
Zähler laufen lassen würde:
1
----------------------------------------------------------
2
--pkg_bin2bcd
3
----------------------------------------------------------
4
--PACKAGE
5
----------------------------------------------------------
6
LIBRARY IEEE;
7
USE IEEE.STD_LOGIC_1164.ALL;
8
USE IEEE.NUMERIC_STD.ALL;
9
10
package pkg_quadrature_encoder is
11
  component quadrature_encoder is
12
    Port ( isl_clk : in  STD_LOGIC;
13
           isl_a : in  STD_LOGIC;
14
           isl_b : in  STD_LOGIC;
15
           osl_cout_en : out  STD_LOGIC;
16
           osl_count_dir : out  STD_LOGIC);
17
  end component quadrature_encoder;
18
end pkg_quadrature_encoder;
19
----------------------------------------------------------
20
--pkg_bin2bcd
21
----------------------------------------------------------
22
--ENTITY
23
----------------------------------------------------------
24
LIBRARY IEEE;
25
USE IEEE.STD_LOGIC_1164.ALL;
26
USE IEEE.NUMERIC_STD.ALL;
27
USE pkg_quadrature_encoder.all;
28
29
entity quadrature_encoder is
30
    Port ( isl_clk : in  STD_LOGIC;
31
           isl_a : in  STD_LOGIC;
32
           isl_b : in  STD_LOGIC;
33
           osl_cout_en : out  STD_LOGIC;
34
           osl_count_dir : out  STD_LOGIC);
35
end quadrature_encoder;
36
37
architecture Behavioral of quadrature_encoder is
38
signal slv_a_reg : std_logic_vector(2 downto 0);
39
signal slv_b_reg : std_logic_vector(2 downto 0);
40
begin
41
42
process begin
43
  wait until rising_edge(isl_clk);
44
  slv_a_reg(2 downto 1) <= slv_a_reg(1 downto 0);
45
  slv_b_reg(2 downto 1) <= slv_b_reg(1 downto 0);
46
  slv_a_reg(0) <= isl_a;
47
  slv_b_reg(0) <= isl_b;
48
end process;
49
50
osl_cout_en   <= (slv_a_reg(2) xor slv_a_reg(1)) xor (slv_b_reg(2) xor slv_b_reg(1));
51
osl_count_dir <= slv_a_reg(1) xor slv_b_reg(2);
52
53
end Behavioral;


Version a)
Bekommt ein Counter dann sinnvollerweise z.B. osl_cout_en und 
osl_cout_dir als Eingangssignale und fragt die ala
1
process begin
2
 if rising_edge(osl_cout_en) then
3
  if osl_cout_dir = '1' then
4
   counter_value <= counter_value + 1;
5
  else
6
   counter_value <= counter_value - 1;
7
  end if;
8
 end if;
9
end process;

oder
Version b) isl_clk ist auch ein Eingangssignal und ich mache
1
process begin
2
  wait until rising_edge(isl_clk);
3
4
  if osl_cout_en = 1 and osl_cout_dir = 1 then
5
    counter_value <= counter_value + 1;
6
  else if osl_cout_en = 1 and osl_cout_dir = 1 then
7
    counter_value <= counter_value - 1;
8
  end if;
9
end process;

Bei dieser Version habe ich eine gravierende Verständnishürde! Bei einem 
Takt erzeugt das Modul für die quadratur-dekodierung als Kombinatorik 
die Signale osl_cout_en und osl_cout_dir. Aber bei dem selben Takt soll 
dann das Ergebnis schon bei einem anderen Prozess in dem anderen Modul 
counter ausgewertet werden können....aber das geht doch gar nicht. Bei 
dem Takt müssen doch erst Gatter laufen und das Signal über Leitungen 
flitzen!?

Ich HOFFE sehr ihr lest noch mal meinen korrigierten Thread und könnt 
mir helfen!


Allerherzlichen Dank

von Achim S. (Gast)


Lesenswert?

Markus schrieb:
> Bei dieser Version habe ich eine gravierende Verständnishürde! Bei einem
> Takt erzeugt das Modul für die quadratur-dekodierung als Kombinatorik
> die Signale osl_cout_en und osl_cout_dir. Aber bei dem selben Takt soll
> dann das Ergebnis schon bei einem anderen Prozess in dem anderen Modul
> counter ausgewertet werden können....aber das geht doch gar nicht. Bei
> dem Takt müs

Die Steuersignale werden im Takt n erzeugt und im Takt n+1 ausgewertet. 
Wenn cout_en auf 1 geht, dann wird genau 1 Takt später der Zähler 
hochgezählt (oder runtergezählt). So läuft das immer bei getakteter 
Logik.

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


Angehängte Dateien:

Lesenswert?

Markus schrieb:
> if rising_edge(osl_cout_en)
Was war denn an dem Satz "nur 1 Takt im gesamten Design!" unverständlich 
formuliert?

Markus schrieb:
> Aber bei dem selben Takt soll dann das Ergebnis schon bei einem anderen
> Prozess in dem anderen Modul counter ausgewertet werden können....
Warum muss diese Verarbeitung im selben Takt sein? Reicht es nicht 
aus, wenn der Zähler mit 20ns Verzögerung (bei 50MHz Taktfrequenz) 
reagiert?

EDIT:
Ich habe mir das nochmal angeschaut und komme nach entfernen einiger 
Syntax-Fehler (die den Verdacht naheliegen, dass du diesen Code noch nie 
getestet hast) und einer kleinen Strukturumstelleung (wozu den Decoder 
in ein Package packen) zu angehängtem Ergebnis: sieht brauchbar aus. 
Sieh dir einfach mal die Wavefrom der Testbench an...

: Bearbeitet durch Moderator
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.