Hallo ich habe einige Verständnisfragen! Ganz grob.. wir müssen ein Förderband in VHDL programmieren hier soll zuerst der Takt von 1 Mhz auf 4Khz heruntergesetzt werden mittels Frequenzteiler! ************************************************************** library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity Frequenzteiler is generic (rate: integer := 250); --Teilerverhältnis port( Reset: in std_logic; CLK1: in std_logic; -- Input Clock 1 MHz CLK2: out std_logic -- Output Clock 4 kHz ); end Frequenzteiler; architecture Teiler of Frequenzteiler is begin process(Reset,CLK1) is variable cnt: integer range 0 to 255; constant half: integer range 0 to 255 := rate/2-1; variable state : std_logic :='1'; begin if Reset = '1' then cnt := 0; elsif CLK1'event and CLK1 = '0' then if cnt = half then cnt := 0; state := not state; else cnt := cnt + 1; end if; end if; CLK2<=state; end process; end Teiler; ********************************************************** kann man das auch ohne den "Takt" zu generieren also sprich ohne -> generic (rate: integer := 250); und warum wurde also constant half die rate/2-1 ? und dazu muss ich noch einen Untersetzer von 1:4 programmieren! dh bei einem Zähler der 4 Takte hat und davon einen Ausgangstakt ausgibt wie muss ich das in den Quelltext einfügen?
1 MHz / 250 = 4kHz Zählen der 1MHz Signale von Null bis 250/2 -1 ( = 124) und Ausgang so lange auf '1' (also 125 Impulse des 1 MHz-Signals) Dann Reset des Zählers und Ausgang auf '0' Zählen bis 124, Ausgang wieder auf '1' usw. dann bekommst du nen Rechteck mit 4kHz bei dem High und Low gleich lange anliegt (Duty-Cycle: 50 %) Die zweite Frage hab ich nicht verstanden...
wäre das denn ein Teilerverhältnis von 1:250 ? bei 1Mhz wenn ich 4 Khz rausbekomme.. versteh es noch nicht wirklich warum man die Hälfte von dem 1Mhz Takt nimmt! Ich muss auch noch ein Pulsweitenmodul entwerfen! entity PWM32 is generic (MaxSpeed: integer := 31); -- Def. Variable MaxSpeed port( Reset: in std_logic; -- Reset, asynchron CLK: in std_logic; -- Clock 4 kHz Speed: in std_logic_vector (4 downto 0); -- Speed, Wert 0<=Speed<=31 MSS: out std_logic -- MotorStellSignal (Signal an den Motor (PWM) ) ); end PWM32; obwohl wir generic noch nie besprochen haben klint das schon logisch, gibt es denn dazu eine Alternative? Hier soll ich die Geschwindigkeit regulieren! bei 32 Takten! Wie kann ich das anstellen? Das Prinzip eines PWM habe ich einigermaßen verstanden nur das in VHDL umzusetzen ist das Problem! (Pulse,Pause) die Periodendauer soll T=8ms/32= 125mikrosekunden dauern jedoch wäre das doch 250 oder irre ich mich da? :/ bzw ein Takt von f= 1/T = 4Khz Ein Tipp wurde noch gegeben if (( conv_std_logic_vector(count,5))<= Speed)then... bedeutet dies wenn er bis 5 gezählt hat soll er Speed im dem STD_Logic ausgeben? DAs PWM Modul kann in VHDL mit einem Zähler realisiert werden!
-> wäre das denn ein Teilerverhältnis von 1:250 ? bei 1MHz wenn ich 4 KHz rausbekomme.. eine Millionen (1 MEGA-Herz) geteilt durch zweihundertfünfzig ist.... (Taschenrechner raus oder im Kopf rechnen) .... richtig! Viertausend!!! 4000 Herz = 4 KILO-Herz! Sorry, und was den Rest angeht, du redest in Rätseln! Formulier mal ne anständige Frage, denn aus diesem Gestammel wird ja kein Mensch schlau!
@ Jens 250 ist das Teilerverhaltnis von 1MHz nach 4kHz, anders Ausgedrueckt wieviele 1MHz Perioden in eine 4kHz Periode passen. Nun generiert ja dein Code ja ein Taktsignal und muss drum in der Mitte auch toggeln. Hilft vielleicht wenn du dir das aufmalst. Falls deine Hausaufgabe sich auf PLDs bezieht dann ist der Ansatz jedoch murks. Nimm besser clock enables, dann kannst du auch mit deinen 250 rechnen. Cheers, Roger
@Jens Und beachte beim aufmalen, dass da steht: "elsif CLK1'event and CLK1 = '0' then" D.h. immer wenn eine negative Flanke auf CLK1 kommt wird gezaehlt.
Hi nochmals .. bei dem Wartemodul soll ich 0.5s warten! Das realisiere ich mit einem Zähler der einfach 4Khz * 0.5s = 2000 .. sprich bis 2000 zählt! Jedoch habe ich Probleme mit der Syntax! Lässt sich nicht compelieren! Was habe ich falsch gemacht? Wird der Ausgang nur für einen Takt ausgegeben? Sprich 1 Takt -> Stop! library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity warte05s is port( Reset: in std_logic; CLK1: in std_logic; -- Input Clock 4 kHz Start: in std_logic; -- Startsignal Stop: out std_logic -- Stopsignal ); end warte05s; architecture zaehler of Warte05s is begin process (Reset,CLK1,Start) is variable state:integer range 0 to 2000; begin if Reset = '1' then state := '0'; elsif (CLK1'Event and CLK1 = '1') then if (Start = '1') then state := '0'; if state < '2000' then state := state + 1; end if; end if; end if; if state = '2000' then Stop <= CLK1; state := '0'; end if; end process; end zaehler;
Beitrag "Frequenzteiler und Zähler in VHDL" <-- ist es jetzt Peter oder Jens? an eurer Stelle würde ich auf jeden fall mal nach nem VHDL Grundlagenbuch schauen, und das durchlesen. Das kopieren von Code, den man nicht versteht, bringt doch absolut nichts. state :='...' funktioniert jedenfalls nicht. Und das Stop <= CLK1 irgendwie Sinn mcht glaub ich auch noch nicht.
bzw wie kann man das Stop Signal nur für einen Takt am Ende ausgeben nachdem er gezählt hat? Hier in meinem BSP bis 2000
So hab ich es nun gemacht, sollte gehen, bin mir aber auch nicht sicher ! library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity warte05s is port( Reset: in std_logic; CLK1: in std_logic; -- Input Clock 4 kHz Start: in std_logic; -- Startsignal Stop: out std_logic -- Stopsignal ); end warte05s; architecture behv of Warte05s is begin Process (Reset, CLK1, Start) is variable var_zustand_vektor : std_logic_vector (1 downto 0); variable var_zaehler_vektor : integer range 0 to 2000; begin if Reset = '1' then var_zustand_vektor := "00"; var_zaehler_vektor := 0; elsif (CLK1'event AND CLK1='1') then CASE var_zustand_vektor is when "00" => if Start = '1' then var_zustand_vektor := "01"; var_zaehler_vektor := 0; end if; when "01" => if var_zaehler_vektor = 2000 then var_zustand_vektor := "10"; Stop <= '1'; else var_zaehler_vektor := var_zaehler_vektor + 1; end if; when "10" => Stop <= '0'; var_zustand_vektor := "00"; when others => var_zustand_vektor := "00"; End Case; end if; end Process; end behv;
habe es so gemacht! architecture zaehler of Warte05s is signal hilfssignal: std_logic; begin process (Reset,CLK1,Start) is type state is (Z0,Z1,Z2); variable var_zustands_vektor: state; variable var_zaehler: integer range 0 To 1999; begin if (Reset = '1') then var_zustands_vektor := Z0; elsif (CLK1'Event and CLK1 = '1') then case var_zustands_vektor is when Z0 => if (Start='1') then var_zustands_vektor := Z1; var_zaehler := 0; hilfssignal <= '1'; end if; when Z1 => if (var_zaehler = 1999) then var_zustands_vektor := Z2; else var_zaehler := var_zaehler+1; end if; when Z2 => hilfssignal <= '1'; when others => var_zustands_vektor := Z0; end case; end if; end process; Stop <= hilfssignal; end zaehler; PS: du zählst bis 2001 und ich habe das Signal erst bei der 3."Blase" ausgegeben!
Frequenzteiler..... architecture behv of Frequenzteiler is begin process (Reset, CLK1) is variable var_zustand_vektor : std_logic_vector (1 downto 0); variable var_zaehler_vektor : integer range 0 to 249; begin if Reset = '1' then var_zustand_vektor := "00"; var_zaehler_vektor := 0; elsif (CLK1'event AND CLK1='1') then CASE var_zustand_vektor is when "00" => if var_zaehler_vektor = 124 then var_zustand_vektor := "01"; else var_zaehler_vektor := var_zaehler_vektor + 1; CLK2 <= '1'; end if; when "01" => if var_zaehler_vektor = 249 then var_zustand_vektor := "00"; var_zaehler_vektor := 0; else var_zaehler_vektor := var_zaehler_vektor + 1; CLK2 <= '0'; end if; when others => var_zustand_vektor := "00"; End Case; end if; end Process; end behv;
wie kann man wenn man eine maximale Geschwindigkeit hat! BSP Speed: out std_logic_vector(4 downto 0) --Geschwindigkeit d. Motors 0<=Speed<=31 nur 50% fahren? sprich 15 Takte -> so würde ich dies machen! Speed <= '15'
Ja, einfach den Vektor halt dementsprechend einstellen : 100% : 11111 --> 31 50% : 10000 --> 16 33% : 01011 --> 11
Geht sicherlich leichter, aber naja^^ An den PWM mache ich mich jetzt :D Process (Reset, CLK1, LS, RS, B, ST, ER, StopS) is variable var_zustand_vektor : std_logic_vector (2 downto 0); variable var_ausgabe_vektor : std_logic_vector (2 downto 0); begin if Reset = '1' then var_zustand_vektor := "000"; elsif (CLK1'event AND CLK1='1') then CASE var_zustand_vektor is when "000" => if (LS = '0') and (RS = '1') then var_ausgabe_vektor := "110"; var_zustand_vektor := "001"; StartS = '1'; Speed := "10000"; elsif (LS = '1') and (RS = '0') then var_ausgabe_vektor := "101"; var_zustand_vektor := "001"; StartS = '1'; Speed := "10000"; end if; when "001" => StartS = '0'; if StopS = '1' then var_zustand_vektor := "011"; Speed := "11111"; end if; if ST = '0' then var_ausgabe_vektor := "011"; var_zustand_vektor := "000"; end if; when "011" => if B = '0' then Speed := "01011"; var_zustand_vektor := "100"; end if; if ST = '0' then var_ausgabe_vektor := "011"; var_zustand_vektor := "000"; end if; when "100" => if ER = '1' then var_ausgabe_vektor := "011"; var_zustand_vektor := "000"; end if; when others => var_zustand_vektor := "000"; End Case; end if; end Process;
Axo, ich habe noch nicht die Zuweisung von der Ausgabe....also bei dem Ausgabe vektor habe ich immer 1. Stelle M_An 2. Stelle M_li 3. Stelle M_re naja, aber ist ja einfach dann nur zuweisen....
So, nun ist auch der PWM fertig....also hoffe, dass der so richtig ist, aber das weiß ich wirklich nicht.....und nun ab ins Bett :D Process (Reset, CLK, Speed) is variable count: integer range 0 to 31; variable var_MSS: std_logic; begin if Reset = '1' then MSS <= '0'; elsif (CLK'event AND CLK='1') then if ( (conv_std_logic_vector(Count, 5)) <= Speed) then var_MSS := '1'; end if; end if; MSS <= var_MSS; end process; P.S.: Oben im Automaten von der Motorsteuerung sind noch einige Fehler....hatte wieder mal "Set File to Current Project" beim compilieren vergessen.....tztztz
Tach zusammen. mal ne dumme frage, seit ihr zufällig auf der FH-Köln?:) sieht sie aus, als hätten wir die selben aufgaben oder änliche. wir müssen auch ein pulsweitmodul und einen vorteiler (frequenzteiler) in vhdl programmieren. könntest du noch mal deine richtige lösung posten ? kommen nicht weiter. mfg tim
Der Frequenzteiler von oben muss nachher noch mit ein bandpass gefiltet werden, oder??? ich habe hier andere methode zum Frequenzteilen, kann jemand das bitte erklaeren? es ist 50MHZ am Eingang und musste 12HZ am ausgang sein. LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; PACKAGE types is CONSTANT cLEDS :Integer RANGE 4 TO 25 :=17; CONSTANT CNTSIZE :Integer :=22; --Typdeklarationen ... SUBTYPE TLEDPORT IS std_logic_vector(cLEDS downto 0); END types; ------------------------------------------------------------------------ - LIBRARY ieee; LIBRARY work; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; USE ieee.numeric_std.all; USE work.types.all; entity E_TaktTeiler is port ( CLOCK, RESET :in std_ulogic; TaktOut :out std_ulogic ); end entity E_TaktTeiler; architecture A_TaktTeiler of E_TaktTeiler is signal CLOCKDIV :integer range 0 to 2**CNTSIZE-1; begin TEILER:process(CLOCK,RESET,ClOCKDIV) begin if (RESET ='0')then CLOCKDIV <=0; elsif (CLOCK ='1'and CLOCK'EVENT)then CLOCKDIV <=(CLOCKDIV +1)mod 2**CNTSIZE; end if; end process TEILER; TaktOut <=TO_UNSIGNED(CLOCKDIV,CNTSIZE)(CNTSIZE-1); end architecture; Danke im voraus.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.