hallo, Habe einige Zeile Code geschrieben. Diese ist nur ein Ausschnitt. Ist dies so richtig? Funktion: ein interner 8bit-Zähler(externer Takt), ein Latch und ein 8bit-Vergleicher. Das Latch puffert die Daten von "DB". Es sollen die im Latch gepufferte Werte mit dem Zähler verglichen werden, ob das Ergebnis größer ist. Entsprechend soll "EndV1" 0 oder 1 sein. Muß ich für "EndV1" auch einen Zwischenspeicher anlegen? Noch eine grundlegende Frage. Beim erstellen eines Projekt die Signale(Pin) in der Tabelle sofort erstellen oder dies erst später? library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.Numeric_std.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity T3 is Port ( clk : in STD_LOGIC; rst : in STD_LOGIC; ALE1 : in STD_LOGIC; DB : in STD_LOGIC_VECTOR (7 downto 0); EndV1 : out STD_LOGIC); end T3; architecture Behavioral of T3 is begin process(clk, rst, ALE1) variable FahrCount : STD_LOGIC_VECTOR(7 downto 0):="00000000"; variable FahrBuffer1 : STD_LOGIC_VECTOR(7 downto 0):="00000000"; begin if rst = '1' then FahrCount := "00000000"; -- FahrBuffer1 := "00000000"; EndV1 <= '0'; elsif rising_edge(clk) then FahrCount := std_logic_vector( unsigned(FahrCount) + 1); end if; -- if (ALE1'event and ALE1 ='0') then FahrBuffer1(7 downto 0) := DB(7 downto 0); end if; -- if (FahrBuffer1 > FahrCount) then EndV1 <= '1'; else EndV1 <= '0'; end if; end process; end Behavioral; Nachtrag: wenn ich "FahrBuffer1 := "00000000";" bei einem Reset auch löschen möchte, bekomme ich die Fehlermeldung. ERROR:Xst:827 - "E:/Xilinix Sourcecode/Test3/T3.vhd" line 41: Signal FahrBuffer1 cannot be synthesized, bad synchronous description. gruß Siegfried
@Siegfried Saueressig >process(clk, rst, ALE1) >variable FahrCount : STD_LOGIC_VECTOR(7 downto 0):="00000000"; >variable FahrBuffer1 : STD_LOGIC_VECTOR(7 downto 0):="00000000"; >begin Als Anfänger sollte man die Finger von Variablen lassen. Das ist in VHDL ein wenig tricky. Nimm normale Signale. > if rst = '1' then > FahrCount := "00000000"; >-- FahrBuffer1 := "00000000"; > EndV1 <= '0'; > elsif rising_edge(clk) then > FahrCount := std_logic_vector( unsigned(FahrCount) + 1); Da reicht ein einfaches FahrCount <= + 1; (wenn Fahrcount ein Signal ist). Btw. Schönes Denglisch ;-) > end if; >-- > if (ALE1'event and ALE1 ='0') then > FahrBuffer1(7 downto 0) := DB(7 downto 0); > end if; Das lassen wir mal besser. In einem Prozess gibt es nur ein flankensensitives Signal. Also ab damit in einen zweiten Prozess. >-- > if (FahrBuffer1 > FahrCount) then > EndV1 <= '1'; > else > EndV1 <= '0'; > end if; >end process; Das sollte ebenfalls in den Prozess mit clk, da du dir sonst Glitches auf das Ausgangssignal holen könntest. >Nachtrag: wenn ich "FahrBuffer1 := "00000000";" bei einem Reset auch >löschen möchte, bekomme ich die Fehlermeldung. >ERROR:Xst:827 - "E:/Xilinix Sourcecode/Test3/T3.vhd" line 41: Signal >FahrBuffer1 cannot be synthesized, bad synchronous description. Ja, siehe oben. Mach zwei Prozesse draus. MFG Falk
hallo, habe es jetzt so gemacht, Ergebnis ist warscheinlich nicht korrekt. Es wird nur eine Macrocelle verwendet und in Pin-Liste existiert nur "EndV1" library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.Numeric_std.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity T3 is Port (clk : in STD_LOGIC; rst : in STD_LOGIC; ALE1 : in STD_LOGIC; DB : in STD_LOGIC_VECTOR (7 downto 0); EndV1 : out STD_LOGIC); end T3; architecture Behavioral of T3 is signal FahrZaehler : std_logic_vector(7 downto 0); signal FahrSpeicher1 : std_logic_vector(7 downto 0); begin process(clk, rst) begin if rst = '1' then FahrZaehler <= "00000000"; FahrSpeicher1 <= "00000000"; elsif rising_edge(clk) then FahrZaehler <= FahrZaehler + 1; end if; end process; process(ALE1) begin if (ALE1'event and ALE1 ='0') then FahrSpeicher1(7 downto 0) <= DB(7 downto 0); end if; end process; process(clk, rst) begin if rst = '1' then EndV1 <= '0'; else if rising_edge(clk) then if (FahrSpeicher1 > FahrZaehler) then EndV1 <= '1'; else EndV1 <= '0'; end if; end if; end if; end process; end Behavioral;
@Siegfried Saueressig >habe es jetzt so gemacht, Ergebnis ist warscheinlich nicht korrekt. Es Korrekt, es ist nicht korrekt ;-) >process(clk, rst) >begin > if rst = '1' then > FahrZaehler <= "00000000"; > FahrSpeicher1 <= "00000000"; Wenn dein FahrSpeicher1 in diesem Prozes nicht geschrieben wird, gehört es auch nicht hier rein. > elsif rising_edge(clk) then > FahrZaehler <= FahrZaehler + 1; > end if; >end process; >process(ALE1) >begin > if (ALE1'event and ALE1 ='0') then Das muss hier rein, mir deiner Reset-Bedingung von oben. Da müsst der Compiler eigentlich meckern. > FahrSpeicher1(7 downto 0) <= DB(7 downto 0); > end if; >end process; MfG Falk
Hallo, guten morgen hoffe das ich es richtig gemacht habe. Habe ein zweites Latch hinzugefügt. Zu den Macrocells. Wenn ich den Fitter Report richtig verstanden habe, benötige ich je FF(Intern/Extern) eine Macrocell. Bei diesen Zeilen benötige ich 28 Macrozells und für jedes weiteres Latsch nochmals 10 Macrocells. Besteht eine Möglichkeit, Macrocells einzusparen? In einem anderem Thread wurde mir mitgeteilt, das ich für ein Lasch(74273) eine Macrocelle benötige. Für mein Projekt hatte ich den XC9572 PLCC84 gewählt, da dieser genügend Pin bereitstellt. Nun muß ich alles neu überarbeiten, und den Chip-Tye neu ermittel. Kann ich die Anweisung der Latch nicht verkürzen, indem ich alle "rst" Anweisungen untereinander schreibe, und nach else die n Latch "takt" bzw. Ergebnis mit dem Zähler vergleiche? entity T3 is Port (clk : in STD_LOGIC; rst : in STD_LOGIC; ALE1 : in STD_LOGIC; ALE2 : in STD_LOGIC; DB : in STD_LOGIC_VECTOR (7 downto 0); EndV1 : out STD_LOGIC; EndV2 : out STD_LOGIC); end T3; architecture Behavioral of T3 is signal FahrZaehler : std_logic_vector(7 downto 0); signal FahrSpeicher1 : std_logic_vector(7 downto 0); signal FahrSpeicher2 : std_logic_vector(7 downto 0); begin process(clk, rst) begin if rst = '1' then FahrZaehler <= "00000000"; elsif rising_edge(clk) then FahrZaehler <= FahrZaehler + 1; end if; end process; process(clk, rst, ALE1) begin if rst = '1' then EndV1 <= '0'; FahrSpeicher1 <= "00000000"; else -- if (ALE1'event and ALE1 ='0') then FahrSpeicher1(7 downto 0) <= DB(7 downto 0); end if; -- if rising_edge(clk) then if (FahrSpeicher1 > FahrZaehler) then EndV1 <= '1'; else EndV1 <= '0'; end if; end if; end if; end process; process(clk, rst, ALE2) begin if rst = '1' then EndV2 <= '0'; FahrSpeicher2 <= "00000000"; else -- if (ALE2'event and ALE2 ='0') then FahrSpeicher2(7 downto 0) <= DB(7 downto 0); end if; -- if rising_edge(clk) then if (FahrSpeicher2 > FahrZaehler) then EndV2 <= '1'; else EndV2 <= '0'; end if; end if; end if; end process; end Behavioral; Gruß Siegfried
@Siegfried Saueressig >hoffe das ich es richtig gemacht habe. Habe ein zweites Latch >hinzugefügt. Du hast es verschlimmbessert. NUR EIN FLANKENSENSITIVES SIGNAL PRO PROZESS!!! Durch deine Schreibweise kann man keine Macrozellen sparen. >Zu den Macrocells. Wenn ich den Fitter Report richtig verstanden habe, >benötige ich je FF(Intern/Extern) eine Macrocell. Bei diesen Zeilen Ja, pro FF braucht man eine Macrozelle. Was meinst du mit (intern/extern)? >benötige ich 28 Macrozells und für jedes weiteres Latsch nochmals 10 >Macrocells. Besteht eine Möglichkeit, Macrocells einzusparen? In einem >anderem Thread wurde mir mitgeteilt, das ich für ein Lasch(74273) eine >Macrocelle benötige. Für mein Projekt hatte ich den XC9572 PLCC84 Ein 273er hat 8 Bit, also brauchst du 8 Macrozellen. Es ist doch recht klar. Du hast 1x 8Bit Zähler : 8 Macrozellen 2x 8Bit Latch : 16 Maxcrozellen 2x 8 BIt VergleicherVergleicher : 2 Macrozellen ------------------------------------------------------- 26 Macrozellen Wo die beiden anderen verbraten werden weiss ich jetzt nicht. Müsste man die Reports anschauen. >Kann ich die Anweisung der Latch nicht verkürzen, indem ich alle "rst" >Anweisungen untereinander schreibe, und nach else die n Latch "takt" >bzw. Ergebnis mit dem Zähler vergleiche? Nein! MfG Falk
Hallo, habe ein neues Projekt erstellt, die Signale angelegt, und den Code neu geschrieben. Bin gespannt, weches Ergebnis herauskommt. Bekomme immer noch 28 Macrozellen. Habe anbei die *.rpt Datei. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.Numeric_std.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity VhdlEndTest is Port ( DATA : in STD_LOGIC_VECTOR (7 downto 0); clk : in STD_LOGIC; rst : in STD_LOGIC; clkLatch1 : in STD_LOGIC; clkLatch2 : in STD_LOGIC; EndV1 : out STD_LOGIC; EndV2 : out STD_LOGIC); end VhdlEndTest; architecture Behavioral of VhdlEndTest is signal FahrZaehler : std_logic_vector(7 downto 0); signal FahrSpeicher1 : std_logic_vector(7 downto 0); signal FahrSpeicher2 : std_logic_vector(7 downto 0); begin process(clk, rst) begin IF rst = '1' then FahrZaehler <= "00000000"; ELSIF rising_edge(clk) THEN FahrZaehler <= FahrZaehler + 1; END IF; end process; process(rst, clkLatch1) begin IF rst = '1' THEN FahrSpeicher1 <= "00000000"; EndV1 <= '0'; ELSIF rising_edge(clkLatch1) THEN FahrSpeicher1 <= DATA; IF FahrSpeicher1 > FahrZaehler THEN EndV1 <= '1'; ELSE EndV1 <= '0'; END IF; END IF; end process; process(rst, clkLatch2) begin IF rst = '1' THEN FahrSpeicher2 <= "00000000"; EndV2 <= '0'; ELSIF rising_edge(clkLatch2) THEN FahrSpeicher2 <= DATA; IF FahrSpeicher2 > FahrZaehler THEN EndV2 <= '1'; ELSE EndV2 <= '0'; END IF; END IF; end process; end Behavioral; Gruß Siegfried
@Siegfried Saueressig >habe ein neues Projekt erstellt, die Signale angelegt, und den Code neu >geschrieben. Bin gespannt, weches Ergebnis herauskommt. Nicht das von dir gewünschte. Du bist wirklich ein Künstler, du probierst dutzende von Kombinationen durch und hangelst dich immer wieder an der richtigen Lösung vorbei. >Bekomme immer noch 28 Macrozellen. Habe anbei die *.rpt Datei. Ja, wie es scheint braucht man für einen 8 Bit Vergleicher 2 Macrozellen. Dann passt die Rechnung. Ich schreibs mal ins Reine. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.Numeric_std.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity VhdlEndTest is Port ( DATA : in STD_LOGIC_VECTOR (7 downto 0); clk : in STD_LOGIC; rst : in STD_LOGIC; clkLatch1 : in STD_LOGIC; clkLatch2 : in STD_LOGIC; EndV1 : out STD_LOGIC; EndV2 : out STD_LOGIC); end VhdlEndTest; architecture Behavioral of VhdlEndTest is signal FahrZaehler : std_logic_vector(7 downto 0); signal FahrSpeicher1 : std_logic_vector(7 downto 0); signal FahrSpeicher2 : std_logic_vector(7 downto 0); begin -- Deine PWMs, sind doch vom CLK abhängig, nicht von den Speicherpulsen!!! process(clk, rst) begin IF rst = '1' then FahrZaehler <= "00000000"; ELSIF rising_edge(clk) THEN FahrZaehler <= FahrZaehler + 1; IF FahrSpeicher1 > FahrZaehler THEN EndV1 <= '1'; ELSE EndV1 <= '0'; END IF; IF FahrSpeicher2 > FahrZaehler THEN EndV2 <= '1'; ELSE EndV2 <= '0'; END IF; END IF; end process; process(rst, clkLatch1) begin IF rst = '1' THEN FahrSpeicher1 <= "00000000"; EndV1 <= '0'; ELSIF rising_edge(clkLatch1) THEN FahrSpeicher1 <= DATA; END IF; end process; process(rst, clkLatch2) begin IF rst = '1' THEN FahrSpeicher2 <= "00000000"; EndV2 <= '0'; ELSIF rising_edge(clkLatch2) THEN FahrSpeicher2 <= DATA; END IF; end process; end Behavioral; MfG Falk
Hallo @Falk Erst mal für die ausführliche Hilfe vielen Dank. Ich bin bei CPLD noch ein Anfänger. Für mich ist es noch schwierig, aus den vorhandenen Duko's der Schreibweise der Profi-Programmierer anzuschließen. Habe am Anfang doch mit beiden Händen gegen VHDL gewährt. Einen klitzekleinen Erfolg habe ich doch schon, da ich mich mit VHDL beschäftige. Ich hoffe, das diese Arbeit auch zum Erfolg führt. Gruß Siegfried
Huch, ich merke gerade, dass da noch ein Lapsus drin ist. Die Resets für EndV1 und EndV2 müssen natürlich in den ersten Prozess. MfG Falk
hallo @ Falk du bist schneller. habe einen Nachtrag. Code erzeugen zwei gleiche Fehler. ERROR:Xst:528 - Multi-source in Unit <VhdlEndTest> on signal <EndV1> ERROR:Xst:528 - Multi-source in Unit <VhdlEndTest> on signal <EndV2> wenn ich in folgende Zeilen IF FahrSpeicher1 > FahrZaehler THEN EndV1 <= '1'; ELSE EndV1 <= '0'; END IF; IF FahrSpeicher2 > FahrZaehler THEN EndV2 <= '1'; ELSE EndV2 <= '0'; END IF; EndV1 und EndV2 ausklammern, ist kein Fehler weg, aber es werden in der Pinliste nur noch EndV1 und EndV2 aufgelistet. Müsste sogar richtig sein, da die Speicher / der Zähler keine Funktion ausführt. EndV1 und EndV2 hängen in der Luft. Gruß Siegfried
@Siegfried Saueressig >EndV1 und EndV2 ausklammern, ist kein Fehler weg, aber es werden in der >Pinliste nur noch EndV1 und EndV2 aufgelistet. Müsste sogar richtig >sein, da die Speicher / der Zähler keine Funktion ausführt. EndV1 und Die Speicher und der Zähler haben schon eine Funktion. Aber wenn du EndV1 und EndV2 KOMPLETT ausklammerst, klar, dann sind sie funktionslos und der Compiler schmeisst sie raus. MfG Falk
Hallo, habe beide Reset in den ersten Prozess verschoben, und es funktioniert. Jetzt habe ich eine kleine Grundlage, um weiter zu arbeiten. Die EndVx müssen mit mehreren Verrieglungen verbunden werden. Wenn dann dieses "Modul" besteht, habe ich auch die benötigten Macrocells. Danach kann ich den Chip aussuchen, und unter umstände muß ich dies auch in mehrere verteilen. Habe da eine Verständnisfrage zu " Prozess ". Gehen wir davon aus, das beide Prozess den gleichen Takt haben. -> Werden beide Prozess gleichzeitig verarbeitet oder einer nach dem anderem? Diese Frage bezieht sich auch auf RESET. Ich meine nicht die Gatterlaufzeit, die ist ja immmer vorhanden. Gruß Siegfried
Prozesse werden nicht abgearbeitet. Prozesse werden vom Compiler in FlipFlops umgesetzt, und diese Flip Flops arbeiten parallel (Hängen ja am gleichen Takt).
hallo, bin dabei, die logische Verknüpfungen für die Verrieglung zu schreiben. habe mir ein Schematic Projekt angesehen. hier ein Auszug davon. attribute BOX_TYPE : string ; signal XLXN_22 : std_logic; signal XLXN_24 : std_logic; signal XLXN_25 : std_logic; signal XLXN_30 : std_logic; signal XLXN_44 : std_logic; component AND2 port ( I0 : in std_logic; I1 : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of AND2 : component is "BLACK_BOX"; component AND3 port ( I0 : in std_logic; I1 : in std_logic; I2 : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of AND3 : component is "BLACK_BOX"; component INV port ( I : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of INV : component is "BLACK_BOX"; component OR2 port ( I0 : in std_logic; I1 : in std_logic; O : out std_logic); end component; attribute BOX_TYPE of OR2 : component is "BLACK_BOX"; begin XLXI_1 : AND2 port map (I0=>com, I1=>EA, O=>XLXN_24); XLXI_2 : AND3 port map (I0=>Licht, I1=>CLK10KHz, I2=>XLXN_22, O=>XLXN_25); ...... Verständnisfrage, muß ich die erzeugung der Componente pro Type nur einmal zu machen, egal wieviele AND2 .. OR2 in meinem Projekt vorkommen ? nach begin weiße ich der Componente die ensprechende Signale zu. die Signale müssen dann fortlaufen nummeriert werden. Muß ich diese Bezeichnung "XLXN_1 bis XLXN_.." einhalten, oder kann ich auch frei bezeichnen "Fahr_10100 bis Fahr_10... Ich möchte zu übersicht das machen, da im kompletten Projekt mehrere "Module" zum Schluß existieren. Gruß Siegfried
Diese Primitiv-Komponenten brauchst Du gar nicht, weil das in VHDL schon enthalten ist. Extra ine Komponente dafür zu verwenden ist viel zu umständlich, man verwendet besser einen Operator. z.B. Oder-Verknüpfung : Ergebnis_signal <= SigA or SigB; Klaus
hallo, guten morgen bekomme bei foldender Gleichung diese Fehler Out1 <= (((COMP_0101 AND FahrLogic1(0)) or ((NOT COMP_0101) and In4 and Clk10KHz)) and Sbg01 and In8); ERROR:HDLParsers:808 - "E:/XilinixSourcecode/VdhlEnd/VhdlEndTest.vhd" Line 154. AND can not have such operands in this context. "FahrLogic1(0)" ist ein 8bit interner Speicher gruß Siegfried
@Siegfried Saueressig >bekomme bei foldender Gleichung diese Fehler >Out1 <= (((COMP_0101 AND FahrLogic1(0)) or ((NOT COMP_0101) and In4 and >Clk10KHz)) and Sbg01 and In8); Sieht gut aus, aber ohne vollständigen Code nicht eindeutig. MFG Falk
hallo, signal FahrLogic01 : std_logic_vector(7 downto 0); das Problem mit dem Fehler bekomme ich bei "FahrLogic1(0)". wenn ich "FahrLogic1(0)" von einem Input Pin ableite, ist alles in Ordnung. hat dies etwas mit "std_logic_vector" -> VECTOR <- zu tun ? Gruß Siegfried
lass deine signal beschreibung mal auf dich wirken.
Richte deine Konzentration zwischen c und 1 des Signalnamens.
> hat dies etwas mit "std_logic_vector" -> VECTOR <- zu tun ?
Konsistente Namensgebung.
Cheers, Roger
hallo, Fehler ist jetzt weg. Hier mein komplettes Projekt Wurde dies gene mal simulieren. Komme aber mit ModelSim noch nicht klar. vsim work.vhdlendtest # vsim work.vhdlendtest # Licensing checkout error with feature xe-starter. (Error code -9.) # The hostid of the license does not match the hostid for this machine. # One of the following is likely: # -The license is intended for another machine. # -A dongle is not plugged into this machine. # -The dongle driver is not installed or is not functioning properly. # -The hostid mechanism has been changed or removed from this machine. # ** Error: Failure to obtain a VHDL simulation license. # Error loading design library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.Numeric_std.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity VhdlEndTest is Port ( DATA : in STD_LOGIC_VECTOR (7 downto 0); clk : in STD_LOGIC; rst : in STD_LOGIC; clkLatch1 : in STD_LOGIC; clkLatch2 : in STD_LOGIC; Clk10KHz : in STD_LOGIC; Sbg01 : in STD_LOGIC; EndV01 : out STD_LOGIC; EndR01 : out STD_LOGIC); end VhdlEndTest; architecture Behavioral of VhdlEndTest is attribute BOX_TYPE : string ; -- signal FahrZaehler : std_logic_vector(7 downto 0); signal FahrSpeicher01 : std_logic_vector(7 downto 0); -- FahrLogic...(0) = E/A -- FahrLogic...(1) = V/R -- FahrLogic...(2) = Licht signal FahrLogic01 : std_logic_vector(7 downto 0); signal COMP_01 : std_logic; signal FAHR_01V : std_logic; signal FAHR_01R : std_logic; -- begin FAHR_01V <= (((COMP_01 AND FahrLogic01(0)) or ((NOT COMP_01) and FahrLogic01(2) and Clk10KHz)) and Sbg01 and FahrLogic01(1)); FAHR_01R <= (((COMP_01 AND FahrLogic01(0)) or ((NOT COMP_01) and FahrLogic01(2) and Clk10KHz)) and Sbg01 and (NOT FahrLogic01(1))); process(clk, rst) begin IF rst = '1' and Sbg01 = '0' then EndV01 <= '0'; EndR01 <= '0'; END IF; IF rst = '1' then FahrZaehler <= "00000000"; ELSIF rising_edge(clk) THEN FahrZaehler <= FahrZaehler + 1; IF FahrSpeicher01 > FahrZaehler THEN COMP_01 <= '1'; EndV01 <= FAHR_01V; EndR01 <= FAHR_01R; ELSE COMP_01 <= '0'; EndV01 <= FAHR_01V; EndR01 <= FAHR_01R; END IF; END IF; end process; process(rst, clkLatch1) begin IF rst = '1' and Sbg01 = '0' THEN FahrSpeicher01 <= "00000000"; ELSIF rising_edge(clkLatch1) THEN FahrSpeicher01 <= DATA; END IF; end process; process(rst, clkLatch2) begin IF rst = '1' and Sbg01 = '0' THEN FahrLogic01 <= "00000000"; ELSIF rising_edge(clkLatch2) THEN FahrLogic01 <= DATA; END IF; end process; end Behavioral; gruß Siegfried
hallo, wie muß ich vorgehen, wenn ich über die "DATA : inout STD_LOGIC_VECTOR (7 downto 0);" "WR : in STD_LOGIC;" Daten nach aussen senden will? ich habe 7 FF, dessen Zustand an den Datenbus, gesendet werden soll. Gruß Siegfried
@Siegfried: ein tolles Buch zum Thema ist z.B. J. Reichardt, B. Schwarz; "VHDL-Synthese, Entwurf digitaler Schaltungen und Systeme"; Oldenburg Verlag; ISBN 3-486-25809-5 Sehr realitätsnah und synthesetauglich geschrieben. Damit hab' ich die Theorie dann auch kapiert. Und von da aus zur realen Schaltung ist's nur ein kleiner Schritt. Gruß Lothar
Hallo, habe folgendes gemacht. WR : in STD_LOGIC; IoSel : in STD_LOGIC; Sbg01 : in STD_LOGIC; -- signal ADRDEC_0WR : std_logic; -- begin -- ADRDEC_0WR <= (ADR(0) and ADR(1) and ADR(2) AND IoSel AND (NOT WR)); -- process(clk) begin IF rst = '1' then SBG_01 <= '0'; ELSIF rising_edge(clk) THEN SBG_01 <= Sbg01; END IF; end process; -- process(ADRDEC_0WR) begin IF (ADRDEC_0WR = '0') then SBG_01 <= 'Z'; ELSE DATA(0) <= SBG_01; END IF; end process; -- möchte folgendes erreichen. Sbg01 ist ein Inputsignal. dieses wird Taktabhänig in SBG_01 gespeichert. Wenn die externe Hardware auf den Chip zugreift, möchte ich über DATA(0) den Zustand von SBG_01 abfragen. Auch wenn die externe Hardware nicht auf den Chip zugreift, muß taktabhänig die Information von Sbg01 in SBG_01 gespeichert werden. Habe ich dies richtig gemacht? Gruß Siegfried
Nein. Mir ist Deinen Beschreibung nicht ganz klar, aber 2 Punkte stimmen sicher nicht. - Das Signal SBG_01 wird in 2 verschiedenen Prozessen zugewiesen. Das ist (für die Synthese) nicht erlaubt. - Nur einem Signal, das nach außen an einen Pin geht, kann man 'Z' (hochohmig) zuweisen. Das Signal muß dann von der Richtung inout oder out sein. Warum wird 'Z' an SBG_01 zugewiesen, wenn ADRDEC_0WR='0' ist? Klaus
hallo, guten Abend habe in allen mir vorliegende Duko gesucht. habe ein "Flip-Flop With Negative-Edge Clock And Asynchronous Reset". process (C, CLR) begin if (CLR = '1')then Q <= '0'; elsif (C'event and C='0')then Q <= D; end if; end process; ich hoffe das ich dies richtig beschreibe. Wenn "CLR" 1 (HIGHT) wird, nimmt, wird der Ausgang Q aud 0 (Low) gesetzt. Ich benötige aber für das FF 3 "RESET" Eingänge. Jeder Reset Eingang soll das FF löschen. Das FF azeptiert aber an seinen Asynchronous Reset nur eine AND Verknüpfung. Wie kann ich diese Bedinungen erfüllen. hallo @Dirk, @Lothar Das Buch giebt es nicht mehr im Internet-Buchhandlung. Werde weiter versuchen, dieses aufzutreiben. Hoffe das ich dieses noch bekomme. hallo @Klaus Bei meiner Duko ist nicht zu ersehen, das ich das Ausgangs-Signal nur in einem Prozess benutzen darf. Deine Info ist sehr gut. Auch mit Tristate werde ich mich auseinandersetzen. Werde nochmals mein Projekt mit Ruhe angehen. Gruß Siegfried
Im April soll es eine neue Auflage von dem Buch geben. Ich hatte meines erst Weihnachten bei Amazon bestellt. Gruß Dirk
Hallo @Dirk Werde mich beim ansässigem Buchhandlung informieren. Gruß Siegfried
Wegen dem Reset mit 3 Eingängen : Du brauchst nur ein Signal definieren, das aus den 3 Signalen ODER-verknüpft wird. Das verwendest Du als CLR Signal. std_logic vs. std_ulogic : Beitrag "anfänger-frage" Am besten für den Anfang immer std_logic verwenden.
hallo, habe "std_ulogic" aus meinen Internet-Unterlagen. Wird sehr oft benutzt. habe es so gelößt. Jetzt setzt er ein Oder vor die Reset. So soll es auch sein. -- FF Fahrstufe Ansteuerung Links / Rechts process(rst, clk, Sbg01, EndR_01, EndL_01) begin IF rst = '1' then EndL01 <= '0'; EndR01 <= '0'; ELSIF Sbg01 = '1' THEN EndL01 <= '0'; EndR01 <= '0'; ELSIF rising_edge(clk) THEN EndL01 <= EndL_01; EndR01 <= EndR_01; END IF; end process; -- 8-Bit Speicher Geschwindigkeit process(clk, rst, Sbg01, ADR_11) begin IF rst = '1' THEN FahrSpeicher01 <= "00000000"; ELSIF Sbg01 = '1' THEN FahrSpeicher01 <= "00000000"; ELSIF rising_edge(clk) THEN if (ADR_11 = '1') then FahrSpeicher01 <= DATA; END IF; END IF; end process; Gruß Siegfried
So sollte man es aber nicht machen. Es ist zwar möglich, daß der Compiler es akzeptiert, und intelligenterweise die RESET-Signale richtig berechent. Ein FF in Hardware hat aber nur einen RESET und/oder SET-Eingang. Ein Compiler muß also nur folgende Form akzeptieren, dies ist auch genormt : if reset = '0'/'1' then signal <= ... elsif rising_edge(Clk) then .... end if; Die richtige Schreibweise ist deshalb : FahrReset <= Rst or Sgb01; -- FF Fahrstufe Ansteuerung Links / Rechts process(FahrReset, clk) begin IF FahrReset = '1' then EndL01 <= '0'; EndR01 <= '0'; ELSIF rising_edge(clk) THEN EndL01 <= EndL_01; EndR01 <= EndR_01; END IF; end process; Grüße Klaus
hallo, guten morgen habe jetzt mein Projekt fast fertig. Der Compiler läüft komplett durch. Es werden weder Warnungen noch Fehler gemeldet. Schematic is auch in Ordnung. Nur bei "Syntesize - XSL" bekomme ich ein gelbes Ausrufezeichen. Dies ist aber von Anfang an. Die noch ausgeremmte Zeilen werden später aktiv, da ich je nach Chiptype die Logic mehrfach einbringe. Ich möchte jetzt langsam an die Harware herangehen, um das Ergebnis zu überprüfen. Hoffe, das ich keine Fehler mehr in dem Projekt habe. Hier meine Code. entity EndStufe is Port ( DATA : inout STD_LOGIC_VECTOR (7 downto 0); FahrCount : in STD_LOGIC_VECTOR (7 downto 0); ADR : in STD_LOGIC_VECTOR (2 downto 0); clk : in STD_LOGIC; rst : in STD_LOGIC; IOSEL : in STD_LOGIC; RW : in STD_LOGIC; CLK10KHz : in STD_LOGIC; Sbg01 : in STD_LOGIC; EndR01 : out STD_LOGIC; EndL01 : out STD_LOGIC); end EndStufe; architecture Behavioral of EndStufe is signal FahrSpeicher01 : std_logic_vector(7 downto 0); -- FahrLogic...(0) = E/A -- FahrLogic...(1) = V/R -- FahrLogic...(2) = Licht signal FahrLogic01 : std_logic_vector(2 downto 0); signal COMP_01 : std_logic; signal SBG_01 : std_logic; signal EndL_01 : std_logic; signal EndR_01 : std_logic; -- signal Adr_RW : std_logic; signal Adr_11 : std_logic; signal Adr_12 : std_logic; -- signal Adr_21 : std_logic; -- signal Adr_22 : std_logic; -- signal Adr_31 : std_logic; -- signal Adr_32 : std_logic; -- signal Adr_41 : std_logic; -- signal Adr_42 : std_logic; signal rst_11 : std_logic; begin -- -- Adressen Decoder ADR_11 <= ((NOT IOSEL) AND (NOT RW) AND (NOT ADR(2)) AND (NOT ADR(1)) AND (NOT ADR(0))); ADR_12 <= ((NOT IOSEL) AND (NOT RW) AND (NOT ADR(2)) AND (NOT ADR(1)) AND (ADR(0))); -- --ADR_21 <= ((NOT IOSEL) AND (NOT RW) AND (NOT ADR(2)) AND (ADR(1)) AND (NOT ADR(0))); --ADR_22 <= ((NOT IOSEL) AND (NOT RW) AND (NOT ADR(2)) AND (ADR(1)) AND (ADR(0))); -- --ADR_31 <= ((NOT IOSEL) AND (NOT RW) AND (ADR(2)) AND (NOT ADR(1)) AND (NOT ADR(0))); --ADR_32 <= ((NOT IOSEL) AND (NOT RW) AND (ADR(2)) AND (NOT ADR(1)) AND (ADR(0))); -- --ADR_41 <= ((NOT IOSEL) AND (NOT RW) AND (ADR(2)) AND (ADR(1)) AND (NOT ADR(0))); --ADR_42 <= ((NOT IOSEL) AND (NOT RW) AND (ADR(2)) AND (ADR(1)) AND (ADR(0))); -- ADR_RW <= ((NOT IOSEL) AND RW AND (NOT ADR(2)) AND (NOT ADR(1)) AND (NOT ADR(0))); -- rst_11 <= rst or Sbg01; -- 8-Bit Comparator process(FahrSpeicher01, FahrCount, Clk10KHz, Sbg01, COMP_01, FahrLogic01) begin IF FahrSpeicher01 > FahrCount THEN COMP_01 <= '1'; ELSE COMP_01 <= '0'; END IF; EndR_01 <= (((COMP_01 AND FahrLogic01(0)) or ((NOT COMP_01) and FahrLogic01(2) and Clk10KHz)) and Sbg01 and FahrLogic01(1)); EndL_01 <= (((COMP_01 AND FahrLogic01(0)) or ((NOT COMP_01) and FahrLogic01(2) and Clk10KHz)) and Sbg01 and (NOT FahrLogic01(1))); end process; -- FF Fahrstufe Ansteuerung Links / Rechts process(clk, rst_11, EndR_01, EndL_01) begin IF rst_11 = '1' then EndL01 <= '0'; EndR01 <= '0'; ELSIF rising_edge(clk) THEN EndL01 <= EndL_01; EndR01 <= EndR_01; END IF; end process; -- 8-Bit Speicher Geschwindigkeit process(clk, rst_11, ADR_11, DATA) begin IF rst_11 = '1' THEN FahrSpeicher01 <= "00000000"; ELSIF rising_edge(clk) THEN if (ADR_11 = '1') then FahrSpeicher01 <= DATA; END IF; END IF; end process; -- 8/3-Bit Speicher Logic process(clk, rst_11, ADR_12, DATA) begin IF rst_11 = '1' THEN FahrLogic01 <= "000"; ELSIF rising_edge(clk) THEN if (ADR_12 = '1') then FahrLogic01(0) <= DATA(0); FahrLogic01(1) <= DATA(1); FahrLogic01(2) <= DATA(2); END IF; END IF; end process; -- Strombegrenzung Speicher Logic process(clk, rst, ADR_RW, Sbg01, SBG_01) begin if rst = '1' then SBG_01 <= '0'; elsif rising_edge(clk) then SBG_01 <= Sbg01; end if; if ADR_RW = '1' then DATA(0) <= SBG_01; else DATA(0) <= 'Z'; end if; end process; end Behavioral; Gruß Siegfried
Hallo, guten abend habe noch ein Problem beim Compilieren. arbeite mit der Version 8.2.03i Wenn ich den XC9532XL-10-PC44 oder XC9572XL-10-VQ44 wähle, bekomme ich in Fitter-Report den Fehler "[Warning]:Cpld:868 - Cannot fit the design into any of the specified devices with the selected implementation options. " Die Gehäuse Typen sind doch in der Liste vorhanden! I/O Pin = 27 Macocells = 17 Pterms Used = 96 Registers Used = 14 Function Block 65 Gruß Siegfried
Deine HW-Beschreibung ist ziemlich ABEL kryptisch, gebe dir den Tipp dich von deinem Gatter Denken zu loesen. Der Address decoder sieht oberhaesslich aus, mit einem case select in einem process ginge das uebersichtlicher und wartbarer. Gibts eigentlich einen Grund warum du EndL/R01 zuerst kombinatorisch bildest und dann in einem anderen process registerst? Aus der Synthese kommt evtl. dasselbe raus, aber eben wieder die Uebersichtlichkeit. btw, schau dir mal das keyword alias an, dann musst du nicht mit kryptischen FahrLogic01(0), FahrLogic01(1) etc. hantieren. Cheers, Roger
hallo, was mache ich hier falsch? COMP_01 <= '1' when FahrSpeicher01 > FahrCount else '0'; ERROR:HDLParsers:164 - "E:/XilinixSourcecode/Test_XC9572CL44PLCC/EndTreiber.vhd" Line 77. parse error, unexpected WHEN, expecting SEMICOLON Zeile ist in abgewandelter Form aus "XST User Guide" Gruß Siegfried
machst einfach noch nen Semikolon nach COMP_01 <= '1' dann müsste es passen. Gruß Volker
hallo, guten morgen damit ist doch meine Frage nicht beantwortet. Gruß Siegfried
@Siegfried Saueressig >hallo, guten morgen >damit ist doch meine Frage nicht beantwortet. Häng doch bitte bei deinen Fragen den KOMPLETTEN Quelltext als Anhang dran, solche Sachen sind meistens kontextsensitiv. MfG Falk
Zm Thema Einsteigerbuch: Das hier hat mir sehr geholfen: http://www.amazon.de/VHDL-Eine-Einf%C3%BChrung-Paul-Molitor/dp/3827370477/ref=sr_1_1/028-0372841-1492547?ie=UTF8&s=books&qid=1173260112&sr=8-1 (VHDL - Eine Einführung, von Paul Molitor und Jörg Ritter)
hallo, hier mein Sourcecode als Anhang. Siehe "FF Fahrstufe Ansteuerung Links / Rechts". Hier möchte ich IF FahrSpeicher01 > FahrCount THEN COMP_01 <= '1'; ELSE COMP_01 <= '0'; END IF; gegen COMP_01 <= '1' when FahrSpeicher01 > FahrCount else '0'; austauschen. Bekomme dann die Fehlermeldung "ERROR:HDLParsers:164 - "E:/XilinixSourcecode/Test_XC9572CL44PLCC/EndTreiber.vhd" Line 77. parse error, unexpected WHEN, expecting SEMICOLON". Gruß Siegfried
@Siegfried Saueressig >hier mein Sourcecode als Anhang. >Siehe "FF Fahrstufe Ansteuerung Links / Rechts". Hier möchte ich >IF FahrSpeicher01 > FahrCount THEN > COMP_01 <= '1'; >ELSE > COMP_01 <= '0'; >END IF; >gegen >COMP_01 <= '1' when FahrSpeicher01 > FahrCount else '0'; >austauschen. Bekomme dann die Fehlermeldung "ERROR:HDLParsers:164 - 1.) Warum? Es funktioniert doch so gut, oder? 2.) Logo, kann nicht gehen, du bist schliesslich in einem (getakteten) Prozess. Dort gibts nur IF THEN. Das WHEN Konstrukt gilt nur als Einzelanweisung ausserhalb eines Prozesses und ist rein kombinatorisch. Ergo. Lass es einfach so, es ist lesber und funktioniert. Was willst du mehr? MfG Falk P.S. Genau das meinte ich mit kontextsensitiv.
hallo, Wird akzeptiert. Habe aber noch ein anderes Problem. Um Macrozellen zu sparen, wollte ich IF FahrSpeicher01 > FahrCount THEN COMP_01 <= '1'; ELSE COMP_01 <= '0'; END IF; in einen ungetakten Prozess/Bereich legen. Diese Zeilen im getaktem Bereich, verzögern das Ergebnis um ein Takt. Warum soll das Ergebnis des Komparator zwischenspeichern, dann mit anderen Signale verknüpfen und anschließen dieses Ergebnis nochmals speichern. Jetzt kommt der Wurm. Wenn ich den XC9532XL-10-PC44 oder XC9572XL-10-VQ44 wähle, bekomme ich in Fitter-Report den Fehler "[Warning]:Cpld:868 - Cannot fit the design into any of the specified devices with the selected implementation options. " Bei anderen Gehäuseformen/Typen bekomme ich diesen Fehler nicht. Gruß Siegfried
Du hättest nur die Zeile mit dem when aus dem Prozess herausnehmen brauchen, dann hatte es gepasst und COMP_01 ist nicht mehr getaktet.
@Siegfried Saueressig >Habe aber noch ein anderes Problem. Um Macrozellen zu sparen, wollte ich >IF FahrSpeicher01 > FahrCount THEN > COMP_01 <= '1'; >ELSE > COMP_01 <= '0'; >END IF; >in einen ungetakten Prozess/Bereich legen. Diese Zeilen im getaktem >Bereich, verzögern das Ergebnis um ein Takt. Warum soll das Ergebnis des >Komparator zwischenspeichern, dann mit anderen Signale verknüpfen und >anschließen dieses Ergebnis nochmals speichern. Dann mach es doch einfach. Schreib deine WHEN Konstruk ausserhalb eines Prozesses. >Jetzt kommt der Wurm. Wenn ich den XC9532XL-10-PC44 oder >XC9572XL-10-VQ44 wähle, bekomme ich in Fitter-Report den Fehler ??? Deinen Quellcode kann ich problemlos in ein 9532XL compilieren. MfG Falk
Ich habe es mit ISE 9.1 auch probiert. Wenn das COMP_01 Signal getaktet ist, dann gehts ohne Probleme. Wenn man das COMP_01 kombinatorisch macht, dann werden ziemlich große Gleichungen erzeugt und der Fitter hat in der Tat Probleme. Mit der Option "Exhaustive Fitting" hat es dann geklappt. Ein > Vergleich in einem CPLD ist immer eher ungünstig, ein Vergleich auf Gleichheit ist besser.
hallo, hast du eine Möglichkeit, das Ergebnis so auswerten, daß wenn Speicher größer Zähler ist, eine "1" ergibt? mit der Opition "Exhaustive Fitting" prüfe ich später. Es ist nur auffällig, das es nur bei den genannte Typen vorkommt. Gruß Siegfried
@Siegfried Saueressig >hast du eine Möglichkeit, das Ergebnis so auswerten, daß wenn Speicher >größer Zähler ist, eine "1" ergibt? Du willst PWM. Das geht so. if pwm_cnt = 0 then pwm_output <= '1'; elsif pwm_cnt = pwm_setting then pwm_output <= '0'; end if; Das sind zwei simple Komparatoren (XOR-Ketten) welche je nur einen Produktterm belegen. Der Vergleicher ">" ist ein Subtrahierer, der wesentlich mehr Produkterme braucht. MfG Falk
hallo, wo änderst du in der Compiler Optionen den Wert um. Zur Zeit ist "Exhaustive Fitting" OFF. gruß siegfried
hallo, habe dieses "Exhaustive Fitting" im Netz gesucht. Kann das gesuchte nicht korrekt übersetzen, aber soweit ich es verstehe, hat der Compiler bei -EndR01 <= (((COMP_01 AND FahrLogic01(0)) or ((NOT COMP_01) and FahrLogic01(2) and Clk10KHz)) and Sbg01 and FahrLogic01(1)); EndL01 <= (((COMP_01 AND FahrLogic01(0)) or ((NOT COMP_01) and FahrLogic01(2) and Clk10KHz)) and Sbg01 and (NOT FahrLogic01(1))); probleme. Werde diese neu überarbeiten. Collapsing Product Term Limit: This option creates a maximum product term limit per equation. This is best observed by an example. Given an initial design: Y <= (A(0) and A(1)) or Node_a; Node_a <= (not B(0) and B(1)) or Node_b; Node_b <= (not C(0) and C(1)) or (D(0) and D(1)); A product term limit of five allows all product terms to collapse into one level of logic: Y <= (A(0) and A(1)) or (B(0) and B(1)) or (C(0) and C(1)) or (D(0) and D(1)); The following would occur if the product term limit were set to three: Y = Y8 or (A(1) and A(0)) or (D(1) and D(0)); Y8 = (C(1) and C(0)) or (B(1) and B(0)); Gruß Siegfried
Man kann natürlich schwer sagen woher es genau kommt, ich glaube es kommt eher vom > Vergleich. Du kannst Dir den "Fitting Report" anschauen, und zwar den Abschnitt "Equations". Dies zeigt Dir genau, was an Logik erzeugt wurde. Am verständlichsten sind die Gleichungen meiner Meinung nach in ABEL, stelle deshalb das Pull-Down Menu links von VHDL auf ABEL. Man sieht, daß die Gleichungen für COMP_01 am längsten und am kompliziertesten sind. Ich nehme an, daß dein FahrCount eine Art Zähler ist, mit dem Du eine Art Pulsweitemodulation machst. Kannst Du diesen Zähler nicht ins CPLD geben, dann könntest Du auf Gleichheit testen? Klaus
hallo @Falk @Klaus kann es drehen wie ich will, mit XC9536XL-PC44 bzw. XC9572XL-PC44 und FahrCount > FahrSpeicher01 , der Fehler geht nicht weg. mit XC9572XL-TQ100 funktioniert es wunderbar. Habe nochmals den Code in geänderter Form beigefügt. bei deinem Code habe ich ein anderes Problem. if FahrCount = 0 then COMP_01 <= '1'; ... elsif FahrCount = FahrSpeicher01 then COMP_01 <= '0'; ... end if. Dieser wird vom Compiler problemlos akzetiert, auch bei PC44 Gehäuse, aber er benotigt mehr Macrocells Used mein Code: Macrozells Used 17/72 Pterms Used 85/360 Registers Used 14/72 Pins Used 27/72 Funktion Block 60/216 dein Code: Macrozells Used 20/72 Pterms Used 72/360 Registers Used 14/72 Pins Used 27/72 Funktion Block 67/216 noch eine Frage zu deiner Version. Wenn der FahrCount 0 ist (if FahrCount = 0 then), wird COMP_01 eine '1' zugewiesen "EINSCHALTEN" . Der FahrCount(Zähler) wird solange erhöht, bis (elsif FahrCount = FahrSpeicher01 then) ist. Hier wird dann COMP_01 eine '0' zugewiesen "AUSSCHALTEN" . Wie ist das, wenn der FahrSpeicher '0' ist. Wird da bei der Zeile IF "eingeschaltet", und sofort bei der elsif wieder "ausgeschaltet" ? gruß Siegfried
@Siegfried Saueressig >kann es drehen wie ich will, mit XC9536XL-PC44 bzw. XC9572XL-PC44 und >FahrCount > FahrSpeicher01 , der Fehler geht nicht weg. mit Ich damit keinerlei Probleme. Dein Code mit ISE 4.2 funktioniert wunderbar. Hast du vielleicht irgendwelche komischen Pinzuweisungen in deinem Design? Versuchs mal gänzlich ohne Pinzuweisungen. >Dieser wird vom Compiler problemlos akzetiert, auch bei PC44 Gehäuse, >aber er benotigt mehr Macrocells Used Dein Code braucht bei mir 19 MCs. >Wie ist das, wenn der FahrSpeicher '0' ist. Wird da bei der Zeile IF >"eingeschaltet", und sofort bei der elsif wieder "ausgeschaltet" ? Naja, das ist noch nicht ganz perfekt. In diesem Fall würde das Signal immer auf '1' bleiben. Das muss man umstellen. if pwm_cnt = pwm_setting then pwm_output <= '0'; elsif pwm_cnt = 0 then pwm_output <= '1'; end if; MfG Falk gruß Siegfried
hallo habe an der Pinzuweisung noch keine Hand angelegt. Wenn eine Pinzuweisung erfolgt ist, dann durch das Programm. Ich habe hier bewust nichts gemacht, da ich nach möglichkeit ein sauberes Platienen-Layout(Eagle) haben möchte und die entgültige Anzahl der "Module" richtet sich nach den MCs. Sollte ich mit 17 MCs pro "Modul" auskommen, könnte ich mein koplettes Projekt mit zwei 95144 aufbauen. 2 x 8 Module bzw. 8 Module x 17 MCs = 136 MCs Frage: sind in meinem Code noch Fehler oder sollte gewisse Zeilen noch geändert werden. PS. gibt es einen guten (deutsch!) Link, für die Bedienung von ModelSim Gruß Siegfried
Unsauberheiten sind in deinem Code schon. Die Sensitivity lists stimmen nicht und folgender Code
1 | -- Strombegrenzung Speicher Logic
|
2 | process(clk, rst, ADR, IOSEL, RW, Sbg01, SBG_01) |
3 | begin
|
4 | if rst = '1' then |
5 | SBG_01 <= '0'; |
6 | elsif rising_edge(clk) then |
7 | SBG_01 <= Sbg01; |
8 | end if; |
9 | if ADR = "101" AND IOSEL = '0' AND RW = '1' then |
10 | DATA(0) <= SBG_01; |
11 | else
|
12 | DATA(0) <= 'Z'; |
13 | end if; |
14 | end process; |
ist so richtiger :
1 | -- Strombegrenzung Speicher Logic
|
2 | process(clk, rst) |
3 | begin
|
4 | if rst = '1' then |
5 | SBG_01 <= '0'; |
6 | elsif rising_edge(clk) then |
7 | SBG_01 <= Sbg01; |
8 | end if; |
9 | end process; |
10 | |
11 | DATA(0) <= SBG_01 when ADR = "101" AND IOSEL = '0' AND RW = '1' else 'Z'; |
Die Berechnung von SBG_01 ist getaktet, und gehört deshalb in einen eigenen Prozess. DATA(0) ist kombinatorisch, und gehört deshalb in einen eigenen Prozess oder wird am besten außerhalb eines Prozesses geschrieben. Von der Funktion war es aber korrekt. Klaus
hallo, werde die Zeilen anpassen. Aber, ich habe mir überlegt, den Chip nicht voll auszureizen. Nach der alten Berechnung für die MCs, hatte ich eine Reserve von 8 MCs. Werde also nur 4 Module einsetzen "144 - 4 X 17 = 76 MCs Reserve" je Chip. Sollte dann in der Praxis noch Änderungen vorkommen, kann ich auf die Reserve zugreifen. Kostet etwas mehr, aber was solls. Werde jetzt ein Layout (Adapter) erstellen, um meine Arbeit testen zu können. Ich werde auch in Zukunft auf diese Forum's zugreifen. Habe in wenige Tage einen ganz kleinen Einblick in diese Programmiersprache erlernt. Allen Forumsteilnehmer, die tatkräftig mich unterstützt haben, Danke. Gruß Siegfried
hallo, bin wieder da war ist richtig ? diese Version ( erzeugt 10 MCs ) process(rst, clk, FahrCount, FahrSpeicher01) begin if rst = '1' then PwmOut_01 <= '0'; elsif FahrCount = FahrSpeicher01 then PwmOut_01 <= '0'; elsif FahrCount = 0 then PwmOut_01 <= '1'; end if; end process; oder diese Version (erzeugt 18 MCs) -- Endstufe Comparator - - 1 - - process(rst, clk, FahrCount, FahrSpeicher01) begin if rst = '1' then PwmOut_01 <= '0'; elsif rising_edge(clk) THEN if FahrCount = FahrSpeicher01 then PwmOut_01 <= '0'; elsif FahrCount = 0 then PwmOut_01 <= '1'; end if; end if; end process; FahrSpeicher01 = 8bit als Latch FahrCount = 8Bit -> Input-Pin Soweit wie ich zur Zeit mit ModelSim zurecht komme, wird in beiden Versionen die Funktionen korrekt ausgeführt. Gruß Siegfried
@ Siegfried Saueressig (dieleena) Die erste Version erzeugt keine PWM, da bekommst du nur zu einem Takt ein HIGH, und zwar genau dann, wenn Fahrcount = 0 ist. Es fehlt der Takt. Die zweite Version sieht korrekt aus. >Soweit wie ich zur Zeit mit ModelSim zurecht komme, wird in beiden >Versionen die Funktionen korrekt ausgeführt. Das glaube ich nicht. MfG Falk
hallo @Falk Ich sehe dieses auch so. Der Sollwert (FahrSpeicher01) muß doch gespeichert werden. Benötige zwei Werte, um einen Vergleich zu erstellen. Gruß Siegfried
@Sigfried: Du hast doch ein synchrones Design. Was machen da "FahrCount" und "FahrSpeicher01" in der Sensitivity-List? Rick
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.