Hi Leute,
ich möchte gerne die Schaltung die in einer Art Funktionsplan im Anhang
ist als Schaltung mit Xilinx 10.1 als VHDL übersetzen. Daher ich das
noch nicht so richtig verstanden habe suche ich jemanden der das
programmieren kann und dann so mit Kommentaren ausschmückt das ich es
komplett verstehen kann und ähnliche Programme selbst schreiben kann.
Das Board auf dem das Programm laufen soll ist ein Spartan-3A.
Ich würde mal behaupten ich hab schon ne ganz gute Vorbildung studiere
nämlich E-Technik im 4 Semester. Nur von der VHDL Vorlesung im letzten
Semester hab ich nicht so richtig viel mitgenommen und will meine
Kenntnisse darum noch ein bisschen auffrischen.
Danke für eure Hilfe.
Grüße Monty
>Ich würde mal behaupten ich hab schon ne ganz gute Vorbildung
Nur mit dem deutschen Satzbau hapert es noch ein wenig ;O)
Es gibt doch an deiner Universität bestimmt eine Bibliothek, und in
dieser
Bibliothek gibt es doch ganz bestimmt auch ein paar Bücher zu VHDL. Und
in diesen VHDL-Büchern gibt es doch bestimmt ähnliche Beispiele.
Also lauf ganz schnell in die Bibliothek und besorge dir ein VHDL-Buch,
dann
bekommst das ganz bestimmt hin.
Viele Grüße,
Der Dieter
Ich bin an einer kleinen pisseligen Fachhochschule und bei uns kann man
garnichts rausfinden, weil man mit 5 Leuten studiert die auch keine
Ahnung haben und unsere Bibliothek, wenn man sie so nen darf, auf dem
Stand von Anno dazumal ist. Und mir wäre es sehr Lieb wenn mir einer bei
dem Problem helfen würde das ich kein Rechtschreibtalent bin weis ich
selber. Aber trotzdem DANKE!
> Nur von der VHDL Vorlesung im letzten Semester hab ich nicht so> richtig viel mitgenommen und will meine> Kenntnisse darum noch ein bisschen auffrischen.
Die Idee ist nicht schlecht...
Als Buchtipp: Reichardt/Schwarz VHDL-Synthese
Das Ding, das du da als Zeichnung bietest, kann ich dir schnell in VHDL
beschreiben. Aber du wirst es nicht synthetisieren können :-o
Denn ein solches Bauteil, wie einen Zähler, der synchrone UP- und
DOWN-Eingänge hat, die aber aus einer asynchronen Flankenerkennung
getriggert werden (die bekommt ja keinen Takt...). Nein, das kann nur
schiefgehen.
Ich würde es so machen (du siehst z.B. keinen Reset, der ist nicht
nötig):
1
libraryieee;
2
useieee.std_logic_1164.all;
3
useieee.numeric_std.all;
4
5
entitytestis
6
port(
7
clk:instd_logic;
8
btn_up:instd_logic;
9
btn_dn:instd_logic;
10
bcd10:outstd_logic_vector(3downto0);
11
bcd1:outstd_logic_vector(3downto0)
12
);
13
endtest;
14
15
architecturebehoftestis
16
signalsr_up:unsigned(3downto0):="0000";-- Schieberegister für Flankenerkennung
17
signalsr_dn:unsigned(3downto0):="0000";
18
signalcount_up:std_logic:='0';-- Flag für erkannte Flanke
19
signalcount_dn:std_logic:='0';
20
signalcnt1:integer0to9:=0;-- interner Zähler Einer
21
signalcnt10:integer0to9:=0;-- dito Zehner
22
begin
23
-- Flankenerkennung
24
processbegin
25
waituntilrising_edge(clk);
26
sr_up<=sr_up(2downto0)&btn_up;-- Externes Signal eintakten
27
if(sr_up="0111")thencount_up<='1';
28
elsecount_up<='0';
29
endif;
30
endprocess;
31
32
-- Flankenerkennung
33
processbegin
34
waituntilrising_edge(clk);
35
sr_dn<=sr_dn(2downto0)&btn_dn;
36
if(sr_dn="0111")thencount_dn<='1';
37
elsecount_dn<='0';
38
endif;
39
endprocess;
40
41
-- Zähler
42
processbegin
43
waituntilrising_edge(clk);
44
if(count_dn='1'andcount_up='0')-- runter zählen
45
if(cnt1>0)then
46
cnt1<=cnt1-1:
47
else
48
cnt1<=9;
49
if(cnt10>0)then
50
cnt10<=cnt10-1:
51
else
52
cnt10<=9;
53
endif;
54
endif;
55
if(count_dn='0'andcount_up='1')-- hoch zählen
56
if(cnt1<9)then
57
cnt1<=cnt1+1:
58
else
59
cnt1<=0;
60
if(cnt10<9)then
61
cnt10<=cnt10+1:
62
else
63
cnt10<=0;
64
endif;
65
endif;
66
endprocess;
67
68
bcd10<=std_logic_vector(to_unsigned(cnt10,4));
69
bcd1<=std_logic_vector(to_unsigned(cnt1,4));
70
endbeh;
Wie gesagt: der Code oben setzt nicht genau den Schaltplan um. Aber die
Funktion, die dort abgebildet ist, ist synthetisierbar beschrieben.
Sieh dich zum Thema Zähler und Flankenerkennung mal dort um:
http://www.lothar-miller.de/s9y/categories/18-Flankenerkennunghttp://www.lothar-miller.de/s9y/categories/16-Numeric_Std
usw. usf......
> Ich bin an einer kleinen pisseligen Fachhochschule...
Ja nun, du selbst wolltest dort hin :-/
Dass die Schule klein ist, das wird nicht gerade die letzten zwei Jahre
passiert sein...
Auf jedenfall schon einmal DANKE. Ich werde es morgen Nachmittag sofort
ausprobieren. Und das mit der kleinen Fachhochschule hat ja auch ab und
zu Vorteile. Und wenn es Leute gibt die einem in so einem Forum wie hier
so SUPER helfen ist das ja auch alles kein Problem ;-)
>Ich bin an einer kleinen pisseligen Fachhochschule und bei uns kann man>garnichts rausfinden, weil man mit 5 Leuten studiert die auch keine>Ahnung haben und unsere Bibliothek, wenn man sie so nen darf, auf dem>Stand von Anno dazumal ist.
Alles nur Ausreden! Selbst das älteste VHDL-Buch kann, sofern man
mal reinschauen würde, helfen. Gerade Zähler etc. werden in JEDEM
VHDL-Buch erläutert.
Früher oder später solltest du dich damit auseinandersetzen, denn
deine Hausaufgaben werden hier nicht immer gelöst werden.
Viel interessanter wäre doch folgender Ansatz: Du präsentierst DEINEN
VHDL-Code und die Leute hier geben ihren Senf dazu. Fändest du das nicht
zielführender ? Kritik@Lothar!
Gruß,
Der Dieter
> Kritik@Lothar!
[ignore] ;-)
Was glaubst du, was der Prof, der solche Aufgaben stellt,
wohl sagt, wenn er mit meinem Code ankommt?
Denn das ist noch nicht in jeder Vorlesung angekommen:
- Synchroner Reset
- wait im Prozess
- Zähler und Statemachines mit nur 1 Prozess
Und eines ist (jedenfalls mir) klar:
Ich werde bei der Klausur nicht neben Monty Monty sitzen :-o
Also ich weis nicht wie es bei euch ist aber bei uns auf der
Fachhochschule gibt es keine Hausaufgaben. Und die Klausur ist auch
schon seit letztem Semester vorbei. Auch danke für die Literturtipps ich
werde mir auch davon mal ein paar Sachen angucken. Ich wollte ja nur mal
sehen wie man sowas richtig macht.
> ich weis nicht wie es bei euch ist
War...
Als ich studiert habe, wurde VHDL gerade so als IEEE 1076 Standard
genormt ;-)
> aber bei uns auf der Fachhochschule gibt es keine Hausaufgaben
Na gut, dann nenne das Kind eben Semesterarbeit oder wie auch immer. Ich
hatte Zuhause jedenfalls immer was zu tun. Und wenns nur die
Fernsehreparatur zum Geldverdienen war...
>> E-Technik im 4 Semester> Und die Klausur ist auch schon seit letztem Semester vorbei.
Nach der Klausur ist vor der Klausur ;-)
wir haben nach euren angaben versucht,dass programm zu schreiben!(
vielen dank)
leider funktioniert der zähler noch nicht richtig!
hat da noch einer eine idee???
------------------------------------------------------------------------
----------
-- Company:
-- Engineer:
--
-- Create Date: 10:06:14 10/05/2009
-- Design Name:
-- Module Name: zaehler - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
------------------------------------------------------------------------
----------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity test is
port(
clk,reset : in std_logic;
btn_up : in std_logic;
cou_up, co_u , cou_dn, co_d: out std_logic;
btn_dn : in std_logic;
bcd10 : out std_logic_vector(2 downto 0);
bcd1 : out std_logic_vector(3 downto 0)
);
end test;
architecture beh of test is
signal count_up : std_logic; -- Flag für erkannte Flanke
signal count_dn : std_logic;
signal co_down, co_up : std_logic;
signal cnt1 : std_logic_vector(3 downto 0):= "0000"; -- interner
Zähler Einer
signal cnt10 : std_logic_vector(2 downto 0):= "000"; -- internet
Zähler Zehner
type ZUSTAENDE_UP is (AU,BU,CU);
signal ZUSTAND_UP,FOLGEZUSTAND_UP: ZUSTAENDE_UP;
type ZUSTAENDE_DN is (AD,BD,CD);
signal ZUSTAND_DN,FOLGEZUSTAND_DN: ZUSTAENDE_DN;
begin
ZUSTANDSAKTUALISIERUNG_UP: process (CLK, RESET)
begin
if reset = '1' then ZUSTAND_UP <=AU;
elsif clk = '1' and clk'event then
ZUSTAND_UP <= FOLGEZUSTAND_UP;
end if ;
end process ZUSTANDSAKTUALISIERUNG_UP;
FOLGEZUSTANDSBERECHNUNG_UP : process (btn_up, ZUSTAND_UP)
begin
case ZUSTAND_UP is
when AU => if btn_up = '1' then FOLGEZUSTAND_UP <= AU;
else FOLGEZUSTAND_UP <= BU;
end if ;
count_up <= '0';
when BU => if btn_up = '1' then FOLGEZUSTAND_UP <= CU;
else FOLGEZUSTAND_UP <= BU;
count_up <= '0';
end if;
when CU => if btn_up = '1' then FOLGEZUSTAND_UP <= AU;
else FOLGEZUSTAND_UP <= BU;
end if ;
count_up <= '0';
end case;
end process FOLGEZUSTANDSBERECHNUNG_UP;
ZUSTANDSAKTUALISIERUNG_DN:process (CLK,RESET)
begin
if reset = '1' then ZUSTAND_DN <=AD;
elsif clk = '1' and clk'event then
ZUSTAND_DN<=FOLGEZUSTAND_DN;
end if ;
end process ZUSTANDSAKTUALISIERUNG_DN;
FOLGEZUSTANDSBERECHNUNG_DN: process ( btn_dn,ZUSTAND_DN)
begin
case ZUSTAND_DN is
when AD => if btn_dn = '1' then FOLGEZUSTAND_DN <= AD;
else FOLGEZUSTAND_DN <= BD;
end if ;
count_dn <= '0';
when BD => if btn_dn = '1' then FOLGEZUSTAND_DN <= CD;
else FOLGEZUSTAND_DN <= BD;
count_dn <= '0';
end if;
when CD => if btn_dn = '1' then FOLGEZUSTAND_DN <= AD;
else FOLGEZUSTAND_DN <= BD;
end if ;
count_dn <= '1';
end case;
end process FOLGEZUSTANDSBERECHNUNG_DN;
-- 1er Zähler
process (reset,clk,count_dn,count_up)
begin
if reset = '1' then cnt1 <= "0000";
elsif clk = '1' and clk'event then
if count_dn='1' and count_up='0' then -- runter zählen
if cnt1 = "0000" then cnt1 <= "1001";
else cnt1 <= cnt1 - 1;
end if;
elsif (count_dn='0' and count_up='1') then-- hoch zählen
if cnt1 = 9 then cnt1 <= "0000";
else cnt1 <= cnt1 + 1;
end if;
else
cnt1 <= cnt1;
end if;
end if;
end process;
-- 10er Zähler
process(reset,clk,co_down,co_up)
begin
if reset = '1' then cnt10 <= "000";
elsif clk = '1' and clk'event then
if (co_down='1' and co_up='0')then -- runter zählen
if cnt10 = 0 then cnt10 <= "101";
else cnt10 <= cnt10 - 1;
end if;
elsif (co_down='0' and co_up='1') then-- hoch zählen
if cnt10 = 5 then cnt10 <= "000";
else cnt10 <= cnt10 + 1;
end if;
else
cnt10 <= cnt10;
end if;
end if;
end process;
co_up <= '1' when co_up = '1' and cnt1 = 9 else '0';
bcd10 <= cnt10;
bcd1 <= cnt1;
cou_up <= count_up;
cou_dn <= count_dn;
co_u <= co_up;
end beh;
> wir haben nach euren angaben versucht,dass programm zu schreiben!
Sicher nicht! :-/
Denn sowas macht man nicht:
1
useieee.std_logic_1164.all;
2
useieee.numeric_std.all;
3
useieee.std_logic_arith.all;
4
useieee.std_logic_unsigned.all;
Entweder so:
1
useieee.std_logic_1164.all;
2
useieee.numeric_std.all;
Oder so:
1
useieee.std_logic_1164.all;
2
useieee.std_logic_arith.all;
3
useieee.std_logic_unsigned.all;
Siehe dazu den Beitrag "Redundanz in den IEEE Libs / Welche kann ich weg lassen?"> leider funktioniert der zähler noch nicht richtig!Was funktioniert nicht?
Wozu denn diese ganzen verwirrenden FSM?
Wie z.B. ZUSTANDSAKTUALISIERUNG_DN und Co: der Taster ist nicht
entprellt und geht direkt in diese windige Flankenerkennung. Wie man
eine Flanke eines Eingangssignals erfasst siehst du doch dort im
Beitrag "Re: Funktionsplan in VHDL übersetzen"
BTW:
Ich habe dir doch eine maßgeschneiderte Lösung angeboten. Hast du daraus
nichts gelernt? :-/
Ja das braucht man jetzt auch nicht mehr "use ieee.numeric_std.all;".
Das ist von der Veränderung des oberen Programms noch übrig geblieben.
Das obere Programm mit dem Schieberegister als Flankenerkennung hat so
garnicht funktioniert. Und da haben wir eine Eigene programmiert.
So
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
funktioniert hier in unserer Programmierung nicht. Denn da haben die
Rechenoperationen nicht funktioniert + - usw.
> Denn da haben die Rechenoperationen nicht funktioniert + - usw.
Klar. Man kann Vektoren mit dern numeric_std nicht so einfach
addieren...
Dafür gibt es die Datentypen unsigned und signed.
Wie auch immer:
> Das obere Programm mit dem Schieberegister als Flankenerkennung hat so> garnicht funktioniert.
Die Flankenerkennung funktioniert. Die verwende ich selber zigfach.
Den Code oben habe ich ohne Syntax-Check einfach so aus dem Kopf
geschrieben. Damit waren da noch ein paar Typos drin:
- integer ohne range
- : statt ;
- zwei fehlende end if
Nach dem Beheben derselben läuft das Ding bei mir auf Anhieb (Aufwand 10
Minuten, incl. Erstellen eines Projekts, Beheben der Fehler, Schreiben
einer Testbench und Testen des Designs).
Fazit: Mitdenken schadet nicht :-/
da ich das ganze gedöne hier nur mäßig verstehe, haben wir uns später
einfach an den vorgaben unseres dozenten entlanggehangelt!
somit hatten wir dann wenigstens etwas,was einigermaßen,nur nicht
richtig,funktioniert hat!
vielen dank für deine vorschläge!haben uns ja auch weiter gebracht,nur
mitdenken....würde ich ja gerne...nur wie gesagt,verstehen tu ich das
ganze noch nicht so richtig!
bist du demnach der meinung,wenn wir deine flankenerkennung wieder
einsetzen,damit die taster nicht prellen,dass es dann funktioniert??
> bist du demnach der meinung,wenn wir deine flankenerkennung wieder> einsetzen,damit die taster nicht prellen,dass es dann funktioniert??
Nein, denn das Herunterzählen der Zehnerstellen (co_down) ist noch nicht
implementiert...
> damit die taster nicht prellen
Die Taster prellen sowieso. Du mußt dafür sorgen, dass dir das Prellen
nichts ausmacht.
Die Flankenerkennung, die ich beschrieben habe, ist (abhängig vom Takt)
ziemlich schnell. Da können also durchaus noch Preller im ms-Bereich
durchkommen. Aber das gilt für eure Flankenerkennung noch mehr...
Abhilfe:
Das Abtastintervall verlängern und das Schieberegister nur einmal pro ms
mit einem neuen Wert füllen. Dazu braucht es einen Vorteiler, der z.B.
50MHz Taktfrequenz auf 1 ms herunterteilt.
1
signalsr_up:unsigned(3downto0):="0000";-- Schieberegister für Flankenerkennung
2
signalsr_dn:unsigned(3downto0):="0000";
3
signalcount_up:std_logic:='0';-- Flag für erkannte Flanke