Forum: FPGA, VHDL & Co. VHDL Code Aufgabe, HILFE! :/


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 Toni Z. (toni_zdr)


Angehängte Dateien:

Bewertung
lesenswert
nicht lesenswert
Im Anhang ist die Aufgabe, die ich bis 7.6.2021 abgeben muss. Ich bitte 
um einen Ehrenmann der mir von dieser Aufgabe nur b) & c) lösen kann, 
das würde mir schon sehr viel helfen!

Ich bedanke mich schon im Voraus bei jeglicher Art von Hilfe.

von Achim M. (minifloat)


Bewertung
lesenswert
nicht lesenswert
Toni Z. schrieb:
> Im Anhang ist die Aufgabe, die ich bis 7.6.2021 abgeben muss

Ich bitte dich als Ehrenmann dich selbst in den Kram einzuarbeiten. Wo 
hakt es denn genau? Wo bleibst du hängen?

Bis 7.6. ist noch eine Menge Zeit. Bis dahin hast du den Pete Ashenden 
"the student's guide to vhdl" mehrmals durchgelesen und vielleicht sogar 
verstanden ;)

mfg mf

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
lesenswert
nicht lesenswert
Toni Z. schrieb:
> Ich bitte um einen Ehrenmann
> der mir von dieser Aufgabe nur b) & c) lösen kann
Ein Gedicht!
Aber ich schlage vor, dass du einfach mal anfängst und dann wieder 
fragst, wenn du nicht mehr weiter kommst und konkrete Probleme 
auftreten.

> Ich bitte um einen Ehrenmann
Das hilft dir nichts. Denn solche "Ehrenmänner" musst du im späteren 
Leben auch dauernd suchen, wenn du schon aufgibst, vor du angefangen 
hast. Und sei dir sicher: irgendwann wirst du auch dem ehrenhaftesten 
Ehrenmann lästig.

Achim M. schrieb:
> Bis 7.6. ist noch eine Menge Zeit. Bis dahin
... solltest du mal ganz von vorn anfangen und einen simplen Zähler 
simulieren. Dann einen Blinker, der auf einem Zähler basiert, und dann 
einen Blinker, der sich mit den DIP-Schaltern einstellen lässt, und dann 
hast du die Aufgabe schon gelöst.
Die Aufgabe an sich ist so einfach, dass ich zweimal schauen musste, ob 
da nicht irgendwo ein Haken ist. Aber nein: im Grunde reicht 1 
rücksetzbarer Zähler, bei 0 den SOP ausgibt und dann beim Erreichen des 
Endwerts (eingestellt durch die DIP-Schalter) den EOP ausgibt und 
gleichzeitig den Zähler wieder zurücksetzt.
Wenn der gesamte HDL-Code nicht mehr auf 1 Bildschirmseite passt, dann 
ist er zu umständlich...

: Bearbeitet durch Moderator
von Lotta (Gast)


Bewertung
lesenswert
nicht lesenswert
ooch, die Aufgabe ist absolut geil und ich darf nicht proggen! :-(((((

@toni:
Was soll das dann werden? Ein Protokoll-Parser?

mfg

von Gustl B. (-gb-)


Bewertung
lesenswert
nicht lesenswert
Lotta schrieb:
> ooch, die Aufgabe ist absolut geil und ich darf nicht proggen! :-(((((

Wieso darfst du das denn nicht?

Lotta schrieb:
> Was soll das dann werden? Ein Protokoll-Parser?

Das ist sehr wahrscheinlich schlicht eine übliche Übungsaufgabe wie man 
sie an einer Hochschule den Studierenden vorsetzt.

von Kastanie mit Arsenglasur (Gast)


Bewertung
lesenswert
nicht lesenswert
Toni Z. schrieb:
> Ich bitte
> um einen Ehrenmann der mir von dieser Aufgabe nur b) & c) lösen kann,
> das würde mir schon sehr viel helfen!

Dann studier doch was anderes!
Du hast jetzt 2 Monate Zeit, genug also um sich in VHDL einzulernen und 
die Aufgabe zu lösen.
Ist doch eh eine schöne, nicht zu schwere Aufgabe.
Das macht man über ein verlängertes Wochenende.
Anfangen muss man halt.

von Lotta (Gast)


Bewertung
lesenswert
nicht lesenswert
@Toni
Es gibt 2 Möglichkeiten:

Mit nem Zähler der mit nem Wert vorbelegt wird und dann rückwärts
zählt, oder mit nem Schieberegister, das wie ein Lauflicht 
funktioniert...
Ein paar Gatter verknüpfen die sache dann.
Das würd ich probieren.

Gustel meinte:
> Wieso darfst du das denn nicht?
Weil ich hier im Interat nichts zum Programmieren
auf dem Tablet haben darf. ;-D
Auch nicht Quartus.
Die trauen einfach ner kleinen Hexe nicht. :-(

mfg

von Fpgakuechle K. (fpgakuechle) Benutzerseite


Bewertung
lesenswert
nicht lesenswert
Lotta schrieb:

> Gustel meinte:
>> Wieso darfst du das denn nicht?
> Weil ich hier im Interat nichts zum Programmieren
> auf dem Tablet haben darf. ;-D
> Auch nicht Quartus.

Zum Programmieren reicht Papier und Stift, mit kariertem Papier hat man 
schon ne Luxusvariante. So entstand jedenfalls die erste Apple Firmware 
(und bei den anderen wohl ähnlich):

http://www.duxburysystems.org/downloads/library/texas/apple/history/museum/computers_apple1/woz6502code.html

Und Logik-entwurf ist kein Programmieren.


PS:
>Die trauen einfach ner kleinen Hexe nicht.
Aha, auch heute noch, 329 Jahre nach Salem, werden psychotische Schübe 
mit 'Hexerei' erklärt?! SCNR

: Bearbeitet durch User
von Weltbester FPGA-Pongo (Gast)


Bewertung
lesenswert
nicht lesenswert
Gustl B. schrieb:
> Das ist sehr wahrscheinlich schlicht eine übliche Übungsaufgabe wie man
> sie an einer Hochschule den Studierenden vorsetzt.

Komische beschrieben! Wenn ich das richtig interpretiere, dann braucht 
er nur einen Zähler, der bis Schalterstellungende zählt, sobald der SOP 
gekommen ist. um selber den EOP zu senden. Dann noch ein bissl 
einsynchen wegen Schaltereffekten und globalem Timing, sowie dem 
richtigen Weiterreichen der Eingangsdaten.

Da gibt es praktisch nichts zu Codieren. Das ist eher das Level "Duale 
Hochschule".

von Gustl B. (-gb-)


Bewertung
lesenswert
nicht lesenswert
Weltbester FPGA-Pongo schrieb im Beitrag #6642633:
> Komische beschrieben! Wenn ich das richtig interpretiere, dann braucht
> er nur einen Zähler, der bis Schalterstellungende zählt, sobald der SOP
> gekommen ist. um selber den EOP zu senden.

Sehe ich genauso.

Weltbester FPGA-Pongo schrieb im Beitrag #6642633:
> Dann noch ein bissl
> einsynchen wegen Schaltereffekten und globalem Timing, sowie dem
> richtigen Weiterreichen der Eingangsdaten.

Da das nur simuliert wird ist das nicht Teil der Aufgabe.

Weltbester FPGA-Pongo schrieb im Beitrag #6642633:
> Da gibt es praktisch nichts zu Codieren. Das ist eher das Level "Duale
> Hochschule".

Ja, tatsächlich eher sehr einfach. Und sehr viel Zeit.

von Markus F. (markf)


Bewertung
lesenswert
nicht lesenswert
Hallo Toni,

Du hat Aufgabe a) wohl schon gelöst? Falls es bereits daran gescheitert 
ist:
https://www.edaplayground.com/

Was ist mit d)-g)?

von Weltbester FPGA-Pongo (Gast)


Bewertung
lesenswert
nicht lesenswert
Gustl B. schrieb:
> Weltbester FPGA-Pongo schrieb im Beitrag #6642633:
>> Dann noch ein bissl
>> einsynchen wegen Schaltereffekten und globalem Timing, sowie dem
>> richtigen Weiterreichen der Eingangsdaten.
>
> Da das nur simuliert wird ist das nicht Teil der Aufgabe.

Nun, auch in der SIM muss das Timing stimmen. Wenn er die 
Schalterstellung analysiert und den Zähler vergleicht, entstehen 
Taktverzögerungen von 2-3CCs. um das muss auch der Einang gepuffert 
werden, wenn er die Daten sinn- und zeitgerecht weiterleiten will.

Das klassische Einsynchen ist dann nochmals ein Thema. Allerdings eines, 
dass Studenten vor allem lernen sollten. Die Signale von aussen kommen 
irgendwann und irgendwie. Das sollte in ein Modell und in die SIM. 
Inklusive Schalterprellen und Entprellen.

So krigen die Studenten nur den Eindruck, dass alles so einfach ist, 
weil sie den Zähler hinbekommen haben ...

.. der aber nicht einmal 10% der eigentlich vollständigen Lösung ist.

von Gustl B. (-gb-)


Bewertung
lesenswert
nicht lesenswert
Weltbester FPGA-Pongo schrieb im Beitrag #6643186:
> So krigen die Studenten nur den Eindruck, dass alles so einfach ist,
> weil sie den Zähler hinbekommen haben ...

Danach sieht diese Aufgabenstellung leider aus. Schöner wäre es, wenn da 
eine Testbench vorgegeben wäre die prellende Schalter beinhaltet.

von Toni Z. (toni_zdr)


Angehängte Dateien:

Bewertung
lesenswert
nicht lesenswert
> Die Aufgabe an sich ist so einfach, dass ich zweimal schauen musste, ob
> da nicht irgendwo ein Haken ist. Aber nein: im Grunde reicht 1
> rücksetzbarer Zähler, bei 0 den SOP ausgibt und dann beim Erreichen des
> Endwerts (eingestellt durch die DIP-Schalter) den EOP ausgibt und
> gleichzeitig den Zähler wieder zurücksetzt.
> Wenn der gesamte HDL-Code nicht mehr auf 1 Bildschirmseite passt, dann
> ist er zu umständlich...
Dein Kommentar hat mir schon sehr viel geholfen, vielen Dank :)

Ich hab im Grunde einen rücksetzbaren Zähler (8-Bit) erstellt, der bei 
00000000 eine steigende Flanke ausgibt von mein SOP-Signal und dann 
beim Erreichen des Endwerts 11111111 den EOP ausgibt.

Mein Problem ist "Dann beim Erreichen des Endwerts, eingestellt durch 
die DIP-Schalter, den EOP ausgibt und gleichzeitig den Zähler wieder 
zurücksetzt", ich weiß leider überhaupt nicht wie ich das realisieren 
soll.

Hier ist mein Programm, ich weiß das es ziemlich schlecht geschrieben 
ist aber besser hab ich es nicht hinbekommen:

HAUPTPROGRAMM:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity SOURCE is
    Port ( CLK,RST, EOP, SOP : in  STD_LOGIC;
           COUNT : inout  STD_LOGIC_VECTOR (7 downto 0));
end SOURCE;

architecture Behavioral of SOURCE is

begin
process (CLK,RST)
begin

if (RST = '1')then
COUNT <= "00000000";
elsif(rising_edge(CLK))then
COUNT <= COUNT+1;

end if;
end process;

end Behavioral;

TESTBENCH:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity sync_upcounter_tb is
end entity;

architecture tb of sync_upcounter_tb is
component SOURCE is
Port ( CLK,RST,SOP, EOP : in STD_LOGIC;
COUNT : inout STD_LOGIC_VECTOR (7 downto 0));
end component;

signal CLK,RST,SOP : STD_LOGIC := '1';
signal EOP : STD_LOGIC := '0';
signal COUNT : STD_LOGIC_VECTOR(7 downto 0);

begin
uut: SOURCE port map(
CLK => CLK,
SOP => SOP,
EOP => EOP,
RST => RST,
COUNT => COUNT);

clock: process
begin
RST <= '0';
SOP <= '0';
EOP <= '0';

CLK <= '0';
wait for 20 ns;
CLK <= '1';
wait for 20 ns;
  if (COUNT = "00000001") then
  SOP <= '1';
  wait for 20 ns;
  SOP <= '0';
  elsif (COUNT /= "00000001") then
  SOP <= '0';
  end if;

  if (COUNT = "11111111") then
  EOP <= '1';
  wait for 20 ns;
  EOP <= '0';
  elsif (COUNT /= "11111111") then
  EOP <= '0';
  end if;

end process;
end tb;

von Gustl B. (-gb-)


Bewertung
lesenswert
nicht lesenswert
Ähm ... du machst das alles in der Testbench wenn ich das korrekt sehe. 
Du solltest das aber in deiner Komponente SOURCE machen. Ich schreibe 
dir mal eine Testbench ... dauert aber etwas.

Ausserdem solltest du Quelltexte als Datei anhängen. Direkt als .vhd wie 
du sie schon hast.

: Bearbeitet durch User
von Toni Z. (toni_zdr)


Angehängte Dateien:

Bewertung
lesenswert
nicht lesenswert
> Ich bitte dich als Ehrenmann dich selbst in den Kram einzuarbeiten. Wo
> hakt es denn genau? Wo bleibst du hängen?

Ich bin leider selbst nicht der beste Programmierer und VHDL ist für 
mich eine Komplett neue Sprache.


> Bis 7.6. ist noch eine Menge Zeit. Bis dahin hast du den Pete Ashenden
> "the student's guide to vhdl" mehrmals durchgelesen und vielleicht sogar
> verstanden ;)

Ich habe mich beim Datum verschrieben, es war nicht bis 7.6 sondern bis 
7.4 aber ich hab noch bis nächste Woche Zeit dafür bekommen 14.4 dank 
COVID-19

Ich hab im Grunde einen rücksetzbaren Zähler (8-Bit) erstellt, der bei 
00000000 eine steigende Flanke ausgibt von mein SOP-Signal und dann 
beim Erreichen des Endwerts 11111111 soll bei EOP eine steigende 
Flanke ausgegeben werden.

Mein Problem ist das die steigende Flanke von EOP eingestellt werden 
soll durch DIP-Schaltern und dann gleichzeitig wieder den Zähler 
zurücksetzt, ich weiß leider überhaupt nicht wie ich das realisieren 
soll.

Mein Programm, ich weiß das es ziemlich schlecht geschrieben ist aber 
besser hab ich es nicht hinbekommen:

HAUPTPROGRAMM:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity SOURCE is
    Port ( CLK,RST, EOP, SOP : in  STD_LOGIC;
           COUNT : inout  STD_LOGIC_VECTOR (7 downto 0));
end SOURCE;

architecture Behavioral of SOURCE is

begin
process (CLK,RST)
begin

if (RST = '1')then
COUNT <= "00000000";
elsif(rising_edge(CLK))then
COUNT <= COUNT+1;

end if;
end process;

end Behavioral;

TESTBENCH:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity sync_upcounter_tb is
end entity;

architecture tb of sync_upcounter_tb is
component SOURCE is
Port ( CLK,RST,SOP, EOP : in STD_LOGIC;
COUNT : inout STD_LOGIC_VECTOR (7 downto 0));
end component;

signal CLK,RST,SOP : STD_LOGIC := '1';
signal EOP : STD_LOGIC := '0';
signal COUNT : STD_LOGIC_VECTOR(7 downto 0);

begin
uut: SOURCE port map(
CLK => CLK,
SOP => SOP,
EOP => EOP,
RST => RST,
COUNT => COUNT);

clock: process
begin
RST <= '0';
SOP <= '0';
EOP <= '0';

CLK <= '0';
wait for 20 ns;
CLK <= '1';
wait for 20 ns;
  if (COUNT = "00000001") then
  SOP <= '1';
  wait for 20 ns;
  SOP <= '0';
  elsif (COUNT /= "00000001") then
  SOP <= '0';
  end if;

  if (COUNT = "11111111") then
  EOP <= '1';
  wait for 20 ns;
  EOP <= '0';
  elsif (COUNT /= "11111111") then
  EOP <= '0';
  end if;

end process;
end tb;

: Bearbeitet durch User
von Toni Z. (toni_zdr)


Bewertung
lesenswert
nicht lesenswert
Lotta schrieb:
> ooch, die Aufgabe ist absolut geil und ich darf nicht proggen! :-(((((
>
> @toni:
> Was soll das dann werden? Ein Protokoll-Parser?
>
> mfg

Ich soll ein Passendes Programm dazu beschreiben und dann Dokumentieren 
wie mein Programm Funktioniert und was ich mir dabei gedacht habe.

von Toni Z. (toni_zdr)


Bewertung
lesenswert
nicht lesenswert
>Kastanie mit Arsenglasur schrieb:

> Dann studier doch was anderes!
Ich bin noch nicht am studieren, dass ist meine Kolloquium Aufgabe die 
in einem Fach bekommen habe.

> Du hast jetzt 2 Monate Zeit, genug also um sich in VHDL einzulernen und
> die Aufgabe zu lösen.
Ich habe mich wie schon erwähnt leider beim Datum verschrieben, es war 
nicht bis 7.6 sondern bis
7.4 aber ich hab noch bis nächste Woche Zeit dafür bekommen also bis 
14.4 dank
COVID-19 (Neue LOCKDOWN)


> Ist doch eh eine schöne, nicht zu schwere Aufgabe.
> Das macht man über ein verlängertes Wochenende.
> Anfangen muss man halt.

Leider ist VHDL für mich eine komplett neue Sprache und ich hab ja von 
Null aus bekommen

von Toni Z. (toni_zdr)


Bewertung
lesenswert
nicht lesenswert
Markus F. schrieb:
> Hallo Toni,
>
> Du hat Aufgabe a) wohl schon gelöst? Falls es bereits daran gescheitert
> ist:
> https://www.edaplayground.com/
>
> Was ist mit d)-g)?

Vielen Danke, Aufgabe a) hab ich schon gelöst. :)

von Tobias N. (technick2)


Bewertung
lesenswert
nicht lesenswert
Achim M. schrieb:
> Ich bitte dich als Ehrenmann dich selbst in den Kram einzuarbeiten. Wo
> hakt es denn genau? Wo bleibst du hängen?

Der TO fragt auch in anderen Forum heftigst um Hilfe. Ob das zielführend 
ist? Sollte man nicht den Betreuer fragen, wie man es löst? Damit der 
Mensch ein feedback bekommt, dass seine Aufgaben zu schwer sind?

von Toni Z. (toni_zdr)


Bewertung
lesenswert
nicht lesenswert
Gustl B. schrieb:
> Ähm ... du machst das alles in der Testbench wenn ich das korrekt sehe.
> Du solltest das aber in deiner Komponente SOURCE machen. Ich schreibe
> dir mal eine Testbench ... dauert aber etwas.
>
> Ausserdem solltest du Quelltexte als Datei anhängen. Direkt als .vhd wie
> du sie schon hast.


Herr @Gustl B. das würde mich wirklich sehr freuen, ich bedanke mich 
schonmal in voraus für deine Hilfe und deine schnelle Antwort. :D

von Gustl B. (-gb-)


Angehängte Dateien:

Bewertung
lesenswert
nicht lesenswert
Kann es sein, dass du versuchst die Aufgabe in der Testbench zu lösen 
und nicht in der Komponente SOURCE? Mach das dort und verwende keine 
wait Statements bis vielleicht auf die Clock.

Ausserdem:

Toni Z. schrieb:
> Port ( CLK,RST, EOP, SOP : in  STD_LOGIC;
>            COUNT : inout  STD_LOGIC_VECTOR (7 downto 0));

1. RST ist nicht verlangt.
2. COUNT hat bei den Ports nix verloren, das kommt weder von außen rein 
noch soll es raus.
3. Daten sollen rein und auch wieder rein, du brauchst also einen Daten 
Ein- und Ausgang. Aber glaube nicht, dass dafür ein einziger inout geht.
4. Meide inouts.
5. Die 10 Schalter müssen irgendwie rein in deine Komponente, die 
fehlen.

Ich habe mal eine Testbench und die Komponente angehängt. Die Testbench 
ist großflächig neu und macht alles was du brauchst, die muss nicht 
angefasst werden.
In deiner Komponente "SOURCE" hast du diese Schnittstellen:

CLK      : in  STD_LOGIC;
SOP      : out STD_LOGIC;
EOP      : out STD_LOGIC;
DATA_IN  : in  STD_LOGIC_VECTOR(7 downto 0);
DATA_OUT : out STD_LOGIC_VECTOR(7 downto 0);
SCHALTER : in  STD_LOGIC_VECTOR(9 downto 0)

CLK ist der Takt, der kommt von der Testbench rein.
SOP und EOP sollst du erzeugen, das ist deine eigentliche Aufgabe. Das 
sind beides Ausgänge.
DATA_IN sind die Daten die reinkommen, aber die brauchst du nur 
durchzuschleifen an DATA_OUT, da gehen die wieder raus. Aber: Wie in der 
Aufgabenstellung geschrieben sollen die getaktet durchgeschliffen 
werden.
SCHALTER ist der 10 Bit Eingang der dir den Wert vorgibt wie lang ein 
Paket seien soll. In der Abhängigkeit vom Wert von SCHALTER sollst du 
SOP und EOP erzeugen.
SCHALTER habe ich in der Testbench fest auf den Wert 13 gelegt weil für 
den Anfang ein fester Wert völlig ausreicht.

Brich die Aufgabe in kleinere Teile runter:

1. Baue einen Zähler der so viele Takte hochzählt wie der WERT von 
SCHALTER ist und der danach direkt wieder auf Null zurückgeht.
2. Erzeuge SOP so, dass es den Wert '1' hat wenn der Zähler den 
Zählerstand 0 hat.
3. Erzeuge EOP so, dass es den Wert '1' hat wenn der Zähler sein Maximum 
erreicht hat.

Was für mich noch unklar ist, ob man hier auch den Inhalt der Daten 
erzeugen soll. Laut Aufgabenstellung nein, aber trotzdem stehen in den 
Daten Werte von 0 bis zum Maximum drinnen und wiederholen sich und 
passen auch zu SOP und EOP. Unklar, kannst du ja den Lehrer mal fragen.

von Toni Z. (toni_zdr)


Bewertung
lesenswert
nicht lesenswert
@Gustl B. schrieb:
> Kann es sein, dass du versuchst die Aufgabe in der Testbench zu lösen
> und nicht in der Komponente SOURCE? Mach das dort und verwende keine
> wait Statements bis vielleicht auf die Clock.

Ich hab es tatsächlich versucht in der Testbech zu lösen, gut ich 
versuche es in Soure zu machen, ok ich probier mal weiter rum, ohne wait 
Statements. Ich bin mir zwar nicht sicher warum ich keine wait 
Statements benutzen darf aber das wird schon seine Gründe haben.

> Ausserdem:
>
> Toni Z. schrieb:
>> Port ( CLK,RST, EOP, SOP : in  STD_LOGIC;
>>            COUNT : inout  STD_LOGIC_VECTOR (7 downto 0));
>
> 1. RST ist nicht verlangt.

Stimmt, Sie haben recht es ist wirklich nicht verlangt.

> 2. COUNT hat bei den Ports nix verloren, das kommt weder von außen rein
> noch soll es raus.

Vielen Danke dies wusste ich ebenfalls nicht.

> 3. Daten sollen rein und auch wieder rein, du brauchst also einen Daten
> Ein- und Ausgang. Aber glaube nicht, dass dafür ein einziger inout geht.
> 4. Meide inouts.
> 5. Die 10 Schalter müssen irgendwie rein in deine Komponente, die
> fehlen.

Das mit den Schaltern wusste ich halt überhaupt nicht wie das machen 
soll.

> Ich habe mal eine Testbench und die Komponente angehängt. Die Testbench
> ist großflächig neu und macht alles was du brauchst, die muss nicht
> angefasst werden.

OMG VIELEN LIEBEN DANK!

> In deiner Komponente "SOURCE" hast du diese Schnittstellen:
> CLK      : in  STD_LOGIC;
> SOP      : out STD_LOGIC;
> EOP      : out STD_LOGIC;
> DATA_IN  : in  STD_LOGIC_VECTOR(7 downto 0);
> DATA_OUT : out STD_LOGIC_VECTOR(7 downto 0);
> SCHALTER : in  STD_LOGIC_VECTOR(9 downto 0)
>
> CLK ist der Takt, der kommt von der Testbench rein.
> SOP und EOP sollst du erzeugen, das ist deine eigentliche Aufgabe. Das
> sind beides Ausgänge.


> DATA_IN sind die Daten die reinkommen, aber die brauchst du nur
> durchzuschleifen an DATA_OUT, da gehen die wieder raus. Aber: Wie in der
> Aufgabenstellung geschrieben sollen die getaktet durchgeschliffen
> werden.

Ich komm mir vor wie der größte trottel aber was ist mit 
"durchzuschleifen an DATA_OUT" gemeint ?

> SCHALTER ist der 10 Bit Eingang der dir den Wert vorgibt wie lang ein
> Paket seien soll. In der Abhängigkeit vom Wert von SCHALTER sollst du
> SOP und EOP erzeugen.

Asoo je nachdem wie die Schalter geschalten sind, erst dann sollen SOP 
und EOP erzeugt werden. Ich glaub mir wird erst jetzt wirklich bewusst 
was ich überhaupt machen sollte. :D


> SCHALTER habe ich in der Testbench fest auf den Wert 13 gelegt weil für
> den Anfang ein fester Wert völlig ausreicht.

signal paketlaenge : integer range 0 to 1023:=*13*;
Diese 13 heißt also das die jetzige Schalterstellung auf 13 ist, richtig 
?


> Brich die Aufgabe in kleinere Teile runter:
>
> 1. Baue einen Zähler der so viele Takte hochzählt wie der WERT von
> SCHALTER ist und der danach direkt wieder auf Null zurückgeht.
> 2. Erzeuge SOP so, dass es den Wert '1' hat wenn der Zähler den
> Zählerstand 0 hat.
> 3. Erzeuge EOP so, dass es den Wert '1' hat wenn der Zähler sein Maximum
> erreicht hat.

Ich versuche mal die Nummer 1. zu machen :)
Ich melde mich wieder wenn ich das geschafft habe.

> Was für mich noch unklar ist, ob man hier auch den Inhalt der Daten
> erzeugen soll. Laut Aufgabenstellung nein, aber trotzdem stehen in den

Ich glaube ebenfalls nicht, dass dies verlangt wird

> Daten Werte von 0 bis zum Maximum drinnen und wiederholen sich und
> passen auch zu SOP und EOP. Unklar, kannst du ja den Lehrer mal fragen.

Mein Lehrer antwortet mir nicht mal und selbst wenn sagt er mir ich 
Zitiere " Das haben wir irgendwann mal im Unterricht besprochen" oder 
"Das solltest du schon selber wissen" :/

*NOCHMALS VIELEN DANK FÜR DEINE HILFE!*
Ich weiß das so etwas nicht selbstverständlich ist

von Gustl B. (-gb-)


Bewertung
lesenswert
nicht lesenswert
Toni Z. schrieb:
> Ich hab es tatsächlich versucht in der Testbech zu lösen, gut ich
> versuche es in Soure zu machen, ok ich probier mal weiter rum, ohne wait
> Statements. Ich bin mir zwar nicht sicher warum ich keine wait
> Statements benutzen darf aber das wird schon seine Gründe haben.

Der Grund ist, dass es das in Hardware im FPGA nicht gibt. Der FPGA 
kennt keine Zeit. Wenn du im FPGA z. B. 1 us lang warten willst, dann 
musst du einen Takt verwenden. Wenn du beispielsweise einen 100 MHz Takt 
hast, dann ist eine Taktperiode 10 ns lang. Du musst mit diesem Takt 
also von 0 bis 99 zählen, dann hast du 1 us lang gewartet.

Das was in der Testbench steht kommt später nicht ins FPGA, da darfst du 
dich austoben und auch Beschreibungen nutzen die man nicht ins FPGA 
einbauen kann.

Toni Z. schrieb:
> Stimmt, Sie haben recht es ist wirklich nicht verlangt.

Wir duzen uns hier glaube ich ... (-:

Toni Z. schrieb:
> Ich komm mir vor wie der größte trottel aber was ist mit
> "durchzuschleifen an DATA_OUT" gemeint ?

Gute Frage. Du bekommst von außen, also von der Testbench in dem Fall, 
Daten rein, die brauchen dich nicht weiter zu interessieren, aber du 
musst sie auch wieder ausgeben. Daher habe ich die den Dateneingang 
DATA_IN und den Datenausgang DATA_OUT eingebaut.
Im einfachsten Fall kannst du die miteinander verbinden:

DATA_OUT <= DATA_IN;

Aber es ist gefordert, dass das getaktet passiert damit eben die Daten 
auch um einen Takt verzögert werden. Warum auch immer. Jedenfalls mach 
diese Zuweisung, also die Verbindung von DATA_OUT und DATA_IN in einem 
getakteten Prozess.

Toni Z. schrieb:
> Asoo je nachdem wie die Schalter geschalten sind, erst dann sollen SOP
> und EOP erzeugt werden. Ich glaub mir wird erst jetzt wirklich bewusst
> was ich überhaupt machen sollte. :D

Kein Ding, ging mir auch oft so.
Ja, die 10 Schalter sind ein 10-Bit Wert. Und Der Abatsnt von SOP bis 
EOP soll so viele Takte lang sein wie der Wert der Schalter aktuell ist.

Und auf ein EOP folgt im nächsten Takt immer das nächste SOP.

Toni Z. schrieb:
> Diese 13 heißt also das die jetzige Schalterstellung auf 13 ist, richtig
> ?

Jap. Das ist natürlich einstatischer Wert in der Testbench, aber für den 
Anfang reicht das. Wenn das bei dir funktioniert, also SOP und EOP 13 
Takte auseinander sind[*], dann können wir das umbauen und die 
Schalterwerte zur Laufzeit verändern.

[*] Genauer:
Wenn jetzt 13 eingestellt ist, dann soll dein Zähler von 0 bis 12 zählen 
und dann wieder bei 0 anfangen.
Wenn der Zähler den Wert 0 hat ist SOP 1 und sonst 0.
Wenn der Zähler den Wert 12 hat ist EOP 1 und sonst 0.

Toni Z. schrieb:
> *NOCHMALS VIELEN DANK FÜR DEINE HILFE!*
> Ich weiß das so etwas nicht selbstverständlich ist

Ich war selber mal Lehrer und helfe immer gerne. Viel Erfolg!

Beitrag #6648157 wurde von einem Moderator gelöscht.
von Toni Z. (toni_zdr)


Angehängte Dateien:

Bewertung
lesenswert
nicht lesenswert
@Gustl B.

> Mach das dort und verwende keine wait Statements bis vielleicht auf die Clock.

> Brich die Aufgabe in kleinere Teile runter:
> 1. Baue einen Zähler der so viele Takte hochzählt wie der WERT von
> SCHALTER ist und der danach direkt wieder auf Null zurückgeht.
> 2. Erzeuge SOP so, dass es den Wert '1' hat wenn der Zähler den
> Zählerstand 0 hat.
> 3. Erzeuge EOP so, dass es den Wert '1' hat wenn der Zähler sein Maximum
> erreicht hat.

Ich hab die 3 Punkte dir du mir als Aufgabe gegeben hast, versucht zu 
lösen so gut wie ich nur konnte. Ich hab die Testbench wie du mir gesagt 
hast nicht angefasst und alles in Source gemacht.
Ebenfalls hab ich versucht keine  wait Statements zu benutzen.

Ich hab 3 Fehler in mein Programm, ich weiß aber leider nicht wo das 
Problem ist. Könntest du dir, dass was ich bis jetzt gemacht habe, mal 
anschauen und mir vielleicht sagen, was ich falsch gemacht habe?

Könntest du mir ebenso sagen ob ich diese 3 Punkte ansatzweise richtig 
gemacht habe.

Foto und Code ist im Anhang :)

von Fpgakuechle K. (fpgakuechle) Benutzerseite


Bewertung
lesenswert
nicht lesenswert
Toni Z. schrieb:



conditional assignments  (Zeilen 33,34) darf man nicht innerhalb eines 
Prozesses verwenden.

von Toni Z. (toni_zdr)


Bewertung
lesenswert
nicht lesenswert
@Fpgakuechle K. schrieb:
> Toni Z. schrieb:
>
>
>
> conditional assignments  (Zeilen 33,34) darf man nicht innerhalb eines
> Prozesses verwenden.

Tatsächlich hab die beiden Zeilen außerhalb des Prozesses eingefügt und 
es zeigt keine Fehler mehr an.

Vielen Dank.

von Fpgakuechle K. (fpgakuechle) Benutzerseite


Bewertung
lesenswert
nicht lesenswert

von Gustl B. (-gb-)


Bewertung
lesenswert
nicht lesenswert
Toni Z. schrieb:
> Ich hab die 3 Punkte dir du mir als Aufgabe gegeben hast, versucht zu
> lösen so gut wie ich nur konnte.

Ja, aber nicht ganz.
SCHALTER_GRENZE solltest du nicht fest auf einen Wert legen, sondern von 
dem Eingang SCHALTER übernehmen. Dann muss SCHALTER_GRENZE ebenfalls 10 
Bits lang sein.
Ausserdem hast du jetzt ein COUNT und ein COUNT_SCHALTER. Du brauchst 
nur eines der Beiden. Da aber SCHALTER 10 Bits lang ist sollte auch dein 
Zähler 10 Bits lang werden.

Wenn du in die Testbench noch

process begin
  wait for 10 us;
  paketlaenge <= 5;
  wait for 10 us;
  paketlaenge <= 95;
  wait for 10 us;
  paketlaenge <= 866;
  wait for 10 us;
  paketlaenge <= 61;
  wait;
end process;

einfügst ändert sich der Wert von deinem Eingang SCHALTER.

von Toni Z. (toni_zdr)


Bewertung
lesenswert
nicht lesenswert
@Gustl B.


> Ja, aber nicht ganz.
> SCHALTER_GRENZE solltest du nicht fest auf einen Wert legen, sondern von
> dem Eingang SCHALTER übernehmen. Dann muss SCHALTER_GRENZE ebenfalls 10
> Bits lang sein.
> Ausserdem hast du jetzt ein COUNT und ein COUNT_SCHALTER. Du brauchst
> nur eines der Beiden. Da aber SCHALTER 10 Bits lang ist sollte auch dein
> Zähler 10 Bits lang werden.
>
> Wenn du in die Testbench noch
>
> process begin
>   wait for 10 us;
>   paketlaenge <= 5;
>   wait for 10 us;
>   paketlaenge <= 95;
>   wait for 10 us;
>   paketlaenge <= 866;
>   wait for 10 us;
>   paketlaenge <= 61;
>   wait;
> end process;
>
> einfügst ändert sich der Wert von deinem Eingang SCHALTER.


Ok, ich versuch das mal zu Verbessern und das in der Testbench 
einzufügen.
Danke :)

von Toni Z. (toni_zdr)


Angehängte Dateien:

Bewertung
lesenswert
nicht lesenswert
@Gustl B.

> Ja, aber nicht ganz.
> SCHALTER_GRENZE solltest du nicht fest auf einen Wert legen, sondern von
> dem Eingang SCHALTER übernehmen. Dann muss SCHALTER_GRENZE >ebenfalls 10 Bits 
lang sein.

Ich hab SCHALTER_GRENZE jetzt auf 10 Bit umgeschrieben.
Aber ich weiß leider nicht wie ich SCHALTER_GRENZE den Wert vom Schalter 
Eingang geben kann.



> Ausserdem hast du jetzt ein COUNT und ein COUNT_SCHALTER.
> Du brauchst nur eines der Beiden. Da aber SCHALTER 10 Bits lang ist
> sollte auch dein Zähler 10 Bits lang werden.


Ich hab dies ebenfalls umgeschrieben und verwende jetzt nur Counter als 
mein Zähler.

Weiß aber trotzdem nicht wie das Problem mit SCHALTER_GRENZE machen soll 
?

von Gustl B. (-gb-)


Bewertung
lesenswert
nicht lesenswert
1.
Toni Z. schrieb:
> Aber ich weiß leider nicht wie ich SCHALTER_GRENZE den Wert vom Schalter
> Eingang geben kann.

Dafür gibt es Zuweisungen.

SCHALTER_GRENZE <= SCHALTER;

Weil das aber noch unterschiedliche Typen sind musst du SCHALTER noch 
nach unsigned wandeln.

2.
Du kannst hier problemlos .vhd Dateien anhängen.

3.
Du zählst COUNT an zwei Stellen hoch. An der ersten Stelle in jedem Takt 
und an der zweiten Stelle nur wenn die Bedingung zutrifft. Das Ergebnis 
ist also, dass er in jedem Takt hochgezählt wird.

4.
Simuliere deinen Code! Dann hättest du das selbst gemerkt, dass der 
weiter zählt also SCHALTER_GRENZE.

von Toni Z. (toni_zdr)


Angehängte Dateien:

Bewertung
lesenswert
nicht lesenswert
@Gustl B.

> Dafür gibt es Zuweisungen.
>
> SCHALTER_GRENZE <= SCHALTER;
>
> Weil das aber noch unterschiedliche Typen sind musst du SCHALTER noch
> nach unsigned wandeln.

Hab ich gemacht.


> 2. Du kannst hier problemlos .vhd Dateien anhängen.
> 3. Du zählst COUNT an zwei Stellen hoch.An der ersten Stelle in jedem Takt
> und an der zweiten Stelle nur wenn die Bedingung zutrifft. Das Ergebnis
> ist also, dass er in jedem Takt hochgezählt wird.

Hab ich beseitigt.

Aber irgendwie bekomme ich viel zu viele SOP & EOPS beim Simulieren.
Meinen Neuen Code und das Bild von der Simulation ist im Anhang.
Hab jetzt wieder keine Ahnung warum es so ausschaut.

Danke für die Antwort um diese späte Uhrzeit :)

von Gustl B. (-gb-)


Angehängte Dateien:

Bewertung
lesenswert
nicht lesenswert
Toni Z. schrieb:
> Hab ich gemacht.

Jap, ist auch korrekt, du musst aber keine Integer nehmen sondern kannst 
unsigned verwenden.

Toni Z. schrieb:
> Hab ich beseitigt.

Passt auch.

Toni Z. schrieb:
> Aber irgendwie bekomme ich viel zu viele SOP & EOPS beim Simulieren.

Nein, das passt schon. Wenn mit den Schaltern z. B. der Wert 13 
eingestellt ist, dann wiederholt sich das eben alle 13 Takte. Du kannat 
ja mal länger simulieren, so 10 us oder so und gucken ob das wirklich 
immer die geforderte Anzahl an Takten ist von SOP bis EOP.

Einen Fehler hast du noch:
Zwischen EOP und dem nächsten SOP ist eine Lücke von einem Takt. Die 
soll da nicht sein.

Ausserdem bekommt SCHALTER_GRENZE jetzt sofort immer den aktuellen Wert 
von Schalter. Das ist nicht gut.
Stell dir vor da ist der Wert 100 eingestellt. Als Beispiel. Dein Zähler 
zählt, ist z. B. schon beim Wert 80. Jetzt ändert Schalter und damit 
auch dein SCHALTER_GRENZE den Wert auf z. B. 20. Dann geht dein Zähler 
sofort auf 0 zurück. Es wäre vielleicht schöner wenn zuerst bis 100 
weitergezählt würde und dann neu gezählt würde, dieses Mal dann bis 20.
Das ist aber nicht in der Aufgabenstellung gefordert.

Weiterhin:
Die DATA_IN sollen getaktet an DATA_OUT weitergereicht werden, das fehlt 
noch.

Anbei eine Testbench die in jedem Takt Daten ausgibt. Und auch noch eine 
leicht angepasste Version von deinem Code, ich habe das mal etwas 
strukturiert und eingerückt.

Du kannst hier auch direkt .vhd Dateien in den Anhang hängen, die muss 
man nie in .txt umbenennen. Ein guter Editor wie Notepad++ kann auch 
.vhd öffnen. https://notepad-plus-plus.org/

von Toni Z. (toni_zdr)


Angehängte Dateien:

Bewertung
lesenswert
nicht lesenswert
@Gustl B.


> Aber irgendwie bekomme ich viel zu viele SOP & EOPS beim Simulieren.

> Nein, das passt schon. Wenn mit den Schaltern z. B. der Wert 13
> eingestellt ist, dann wiederholt sich das eben alle 13 Takte. Du kannat
> ja mal länger simulieren, so 10 us oder so und gucken ob das wirklich
> immer die geforderte Anzahl an Takten ist von SOP bis EOP.
>
> Einen Fehler hast du noch:
> Zwischen EOP und dem nächsten SOP ist eine Lücke von einem Takt. Die
> soll da nicht sein.


> Weiterhin:
> Die DATA_IN sollen getaktet an DATA_OUT weitergereicht werden, das fehlt
> noch.

Ich hab dafür einfach DATA_OUT <= DATA_IN;  geschrieben.
Ich weiß nicht ob das so wirklich richtig ist aber beim Simulieren 
bekommt DATA_FROM_SOURCE die sachen von DATA_TO_SOURCE 1zu1 also das 
scheint so zu stimmen oder ?

> Anbei eine Testbench die in jedem Takt Daten ausgibt. Und auch noch eine
> leicht angepasste Version von deinem Code, ich habe das mal etwas
> strukturiert und eingerückt.
Ohh Vielen Dank, sieht jetzt echt etwas strukturierter aus.

> Du kannst hier auch direkt .vhd Dateien in den Anhang hängen, die muss
> man nie in .txt umbenennen. Ein guter Editor wie Notepad++ kann auch
> .vhd öffnen. https://notepad-plus-plus.org/
Hab mir jetzt Notepad geholt :D

von Fpgakuechle K. (fpgakuechle) Benutzerseite


Angehängte Dateien:

Bewertung
lesenswert
nicht lesenswert
Toni Z. schrieb:

>> Weiterhin:
>> Die DATA_IN sollen getaktet an DATA_OUT weitergereicht werden, das fehlt
>> noch.
>
> Ich hab dafür einfach DATA_OUT <= DATA_IN;  geschrieben.
> Ich weiß nicht ob das so wirklich richtig ist aber beim Simulieren
> bekommt DATA_FROM_SOURCE die sachen von DATA_TO_SOURCE 1zu1 also das
> scheint so zu stimmen oder ?

3. Person:
ich habe die Zeile "DATA_OUT <= DATA_IN;" jetzt auf die schnelle nicht 
in deinem angehangenem Code gefunden.

"Getaktet zugewiesen" meint hier, das die Zuweisung nicht immer aktiv 
ist sondern nur zum Taktzeitpunkt. In Hardware bedeudet eine 
'ungetaktete' Zuweisung einfach ein Stück Draht zwischen DATA_OUT  und 
DATA_IN, während für gGetaktet' ein Delay-FlipFlop zwischen beiden 
Signalen liegt.

https://home.zhaw.ch/~gelk/DT2/UEBUNG/dt2ueb4/dt2ueb4_flipflops_lsg.pdf
https://studylib.net/doc/25364006/d-flip-flop-vhdl

Du musst also deine Zuweisung innerhalb eines Processes, der auf den 
Takt empfindlich (sensitive) ist, setzen. Das stellt klar, das Data_out 
nur zum Zeitpunkt der aktiven Taktflanke seinen Wert ändert. Es genügt 
also nicht irgendwo im Code die Zeile 'DATA_OUT <= DATA_IN;' zu 
platzieren, sie muss auch an der richtigen Stelle (Kontext) (hier 
beispielsweise innerhalb eines prozesses) stehen, damit daraus eine 
getaktete Zuweisung wird.

PS:
Die Begriffe 'getaktet' und 'ungetaktet' sind essential für ein 
Digital-design, werden aber im akademischen Bereich eher nicht benutzt, 
da palavert man eher von sequentieller oder kombinatorischer Zuweisung.
Und der Praktiker spricht mal von Speicher, dann Buffer, oder auch 
Latch/latched (ganz falsch!) und meint eigentlich immer das da ein 
FlipFlop (FF, 1-bit Speicher) steht, das mit der Taktflanke schaltet.

--
>> Du kannst hier auch direkt .vhd Dateien in den Anhang hängen, die muss
>> man nie in .txt umbenennen. Ein guter Editor wie Notepad++ kann auch
>> .vhd öffnen. https://notepad-plus-plus.org/
Hab mir jetzt Notepad geholt :D

Ein Guter Editor kann auch deinen Code automatisch einrücken, Gross und 
klein anpassen und so verschönern. Bspw. Emacs im 'VHDL-Beautify mode' 
(siehe Anhang)

: Bearbeitet durch User
von Toni Z. (toni_zdr)


Angehängte Dateien:

Bewertung
lesenswert
nicht lesenswert
@Fpgakuechle K.

> ich habe die Zeile "DATA_OUT <= DATA_IN;" jetzt auf die schnelle nicht
> in deinem angehangenem Code gefunden.

> "Getaktet zugewiesen" meint hier, das die Zuweisung nicht immer aktiv
> ist sondern nur zum Taktzeitpunkt. In Hardware bedeudet eine
> 'ungetaktete' Zuweisung einfach ein Stück Draht zwischen DATA_OUT  und
> DATA_IN, während für gGetaktet' ein Delay-FlipFlop zwischen beiden
> Signalen liegt.
> in deinem angehangenem Code gefunden.

Ich hab jetzt meinen aktuellsten Code und meine Testbench mal eingefügt.
In hab in meinen Code auch Kommentiert wo ich "DATA_OUT <= DATA_IN;" 
davor hatte und wo ich es jetzt eingefuegt habe.


> "Getaktet zugewiesen" meint hier, das die Zuweisung nicht immer aktiv
> ist sondern nur zum Taktzeitpunkt. In Hardware bedeudet eine
> 'ungetaktete' Zuweisung einfach ein Stück Draht zwischen DATA_OUT  und
> DATA_IN, während für gGetaktet' ein Delay-FlipFlop zwischen beiden
> Signalen liegt.

Ich weiß da jetzt da wo ich es davor das "DATA_OUT <= DATA_IN;" 
geschrieben habe, war es ungetaktete also sozusagen einfach ein Stück 
Draht, wie du es beschrieben hast.


> Du musst also deine Zuweisung innerhalb eines Processes, der auf den
> Takt empfindlich (sensitive) ist, setzen. Das stellt klar, das Data_out
> nur zum Zeitpunkt der aktiven Taktflanke seinen Wert ändert. Es genügt
> also nicht irgendwo im Code die Zeile 'DATA_OUT <= DATA_IN;' zu
> platzieren, sie muss auch an der richtigen Stelle (Kontext) (hier
> beispielsweise innerhalb eines prozesses) stehen, damit daraus eine
> getaktete Zuweisung wird.


Ich hab "DATA_OUT <= DATA_IN;" jetzt innerhalb eines Processes 
geschrieben, würde es jetzt so passen ? Ich hab bin ziehmlich unsicher 
ob das jetzt passt so wie es jetzt ist.

von Gustl B. (-gb-)


Bewertung
lesenswert
nicht lesenswert
Ja, sieht gut aus. Du könntest auch noch die Zuweisung

Schalter_grenze <= unsigned(SCHALTER(9 downto 0));

nur dann machen wenn der Zähler gerade seinen Höchststand erreicht hat.

Es wäre auch schön, wenn das ganze Design getaktet wäre, wurde aber 
nicht gefordert.

Und dann hast du vermutlich weiterhin den Fehler, dass nach einem EOP 
ein Takt Pause ist und erst dann das nächste SOP kommt.

von Toni Z. (toni_zdr)


Bewertung
lesenswert
nicht lesenswert
Gustl B.
> Ja, sieht gut aus. Du könntest auch noch die Zuweisung
> Schalter_grenze <= unsigned(SCHALTER(9 downto 0));

> nur dann machen wenn der Zähler gerade seinen Höchststand erreicht hat.

> Es wäre auch schön, wenn das ganze Design getaktet wäre, wurde aber
> nicht gefordert.

> Und dann hast du vermutlich weiterhin den Fehler, dass nach einem EOP
> ein Takt Pause ist und erst dann das nächste SOP kommt.


Ich möchte mich nochmals bedanken bei dir, für deine Hilfe.
Dass du mir jedes mal schnelle & verständlichen Antworten gegeben hast 
und alles bezogen auf meine Aufgabenstellung.

*Vielen lieben Dank Herr @Gustl B. !* :D

von Gustl B. (-gb-)


Bewertung
lesenswert
nicht lesenswert
Bitte! Vor grob 10 Jahren bin ich hier so aufgeschlagen wie du jetzt. 
Damals wurde mir sehr geduldig auf meine laienhaften Fragen geantwortet. 
Das gebe ich jetzt weiter (-:

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
lesenswert
nicht lesenswert
Gustl B. schrieb:
> Ja, sieht gut aus.
Bis zum Juni wird das schon noch ;-)


Toni Z. schrieb:
> meinen aktuellsten Code
Sieh dir mal das an, simuliere es und sinniere ein wenig drüber nach:
1
:
2
signal COUNT            : unsigned(9 downto 0):=(others => '0');
3
signal Schalter_grenze  : unsigned(9 downto 0):=(others => '0');
4
5
begin
6
7
  process (CLK) begin
8
    if rising_edge(CLK) then
9
      SOP <= '0'; -- Defaultwerte für die beiden Signale = '0'
10
      EOP <= '0'; -- diese Werte werden später im Prozess evtl. noch "überschrieben"
11
12
      DATA_OUT <= DATA_IN; -- Wuerde es hier jetzt passen?
13
      --> ist laut Aufgabenstellung irrelevant, aber allemal besser 
14
      --  hier einmal registriert als nebenläufig einfach durchgereicht.
15
16
      COUNT <= COUNT+1;  -- Zähler weiterzählen, Achtung:
17
      -- der Wert von COUNT ändert sich noch nicht!
18
      -- der "neue" Wert wird lediglich "vorgemerkt" und nachfolgend
19
      -- wird noch der alte Zählerstand zum Vergleich genommen.
20
      -- Siehe dazu das Kapitel: "Verhalten von Signalen in Prozessen"
21
      -- frei nach dem Motto "die letzte Zuweisung gewinnt!"
22
      if COUNT+1 = Schalter_grenze then   -- der nächste Zählerschritt ist der letzte?
23
        EOP   <= '1';                     -- Ja: EOP aktiv, Defaultwert überschreiben
24
      elsif COUNT >= Schalter_grenze then -- Obergrenze erreicht?
25
        S0P   <= '1';                     -- Ja: SOP aktiv, Defaultwert überschreiben
26
        COUNT <= (others=>'0');           -- Zähler auf 0 setzen
27
        -- definierter Zeitpunkt zur Übernahme eines neuen Schalterwerts: 
28
        -- beim Übergang(!) zum Zählerstand 0
29
        Schalter_grenze <= unsigned(SCHALTER(9 downto 0));
30
      end if;
31
   end if;
32
end process;
33
:
34
:
Dadurch, dass kein Vergleich und keine Zuweisung ausserhalb des 
getakteten Prozesses ist, ist garantiert das gesamte Design synchron. 
Wenigstens ausgangsseitig, denn am Eingang müsste man ggfs. noch ein 
wenig mehr Gehirnschmalz stecken, dass nicht beim Umstellen der 
DIP-Schalter auf einen anderen Grenzwertes vogelwilde Obergrenzen 
eingelesen werden. Aber das wird schon wieder ein wenig akademisch... 
;-)

: Bearbeitet durch Moderator
von Gustl B. (-gb-)


Bewertung
lesenswert
nicht lesenswert
Damit die Simulation auch funktioniert sollte noch eine 0 gegen ein O 
getauscht werden ...
Und dann wird noch einen Takt zu lange gezählt.

: Bearbeitet durch User
von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
lesenswert
nicht lesenswert
Gustl B. schrieb:
> 0 gegen ein O getauscht werden ...
Ich muss da einen anderen Font einstellen. Irgendwie... :-/

> Und dann wird noch einen Takt zu lange gezählt.
Und auch die Forderung, dass bei Schalterstellung 00..00 (und somit 1 
einzigem Zähltakt) sowohl SOP als auch EOP gleichzeitig ausgegeben 
werden müssen, funktioniert so nicht. Da muss ich wohl nochmal ran. Aber 
bis zum 7.6. ist ja noch Zeit  ;-)

von Fpgakuechle K. (fpgakuechle) Benutzerseite


Angehängte Dateien:

Bewertung
lesenswert
nicht lesenswert
Lothar M. schrieb:
> Gustl B. schrieb:
>> 0 gegen ein O getauscht werden ...
> Ich muss da einen anderen Font einstellen. Irgendwie... :-/


Garnicht so einfach, ich hab erstmal:

https://en.wikipedia.org/wiki/Slashed_zero

nachlesen müssen um zu erfahren das 'Consolas' ein passender Font mit 
Strich-Null ist. Und dann noch im Firefox unter erweiterte Fonts 
rumgerührt, um verwechselfreie Darstellung zu erreichen.

: Bearbeitet durch User
von Gustl B. (gustl_b)


Bewertung
lesenswert
nicht lesenswert
Lothar M. schrieb:
> Aber bis zum 7.6. ist ja noch Zeit  ;-)

Tatsache!

Fpgakuechle K. schrieb:
> Garnicht so einfach

Du kannst auch nach 0 suchen. Und nach 1. Oder eben gucken was Modelsim 
dazu sagt.
Auch gerne verwechselt wird das l mit 1.

von Fpgakuechle K. (fpgakuechle) Benutzerseite


Angehängte Dateien:

Bewertung
lesenswert
nicht lesenswert
Gustl B. schrieb:

> Auch gerne verwechselt wird das l mit 1.

Mal den Zeichensatz source-code-pro anschauen (weiss jetzt aber nicht, 
ob man den Modelsim 'unterschieben' kann: 
https://fonts.google.com/specimen/Source+Code+Pro#standard-styles

von Gustl B. (-gb-)


Angehängte Dateien:

Bewertung
lesenswert
nicht lesenswert
Fpgakuechle K. schrieb:
> (weiss jetzt aber nicht,
> ob man den Modelsim 'unterschieben' kann:

Klar geht das.

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]
  • [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.