Datum:
Angehängte Dateien:Moin, ich mache grad meine ersten Versuche mit VHDL. Meine Aufgabe ist jetzt ein variabel einstellbares Rechtecksignal zu erzeugen. Und nun komme ich nicht mehr weiter. Ich nutze hierfür das Spartan 3e-Board und ISE Projekt Navigator. Der Syntax Check ist in jedem Modul und jeder Testbench erfolgreich. 1. Problem Ich habe das Projekt in mehrere Module Aufgeteilt: counter: zählt bis zu einem Wert M (in einer Generic Vorbelegt mit 5) und gibt dann ein tick raus, zählt dann weiter bis er dann resetet wird. Braucht ein Reset um zu Starten. q Zähl dabei binär hoch. RS_FF: Ein RS-Flip-Flop, der undefinierter Zustand sollte nie eintreffen. Setzt bzw Resetet bei den Ticks den Ausgang (wave) testbench: zum testen der einzelnen Module Hier liegt das Problem: square_wave: Hinein kommt ein belibiges Clock Signal mit (0101010...); N und M sind in der Generic mit 5 vorbelegt; Heraus sollte also ein Signal (wave) kommen, welches 5 Takte auf 1 gelegt ist, dann wieder 5 takte auf Null... . Ist denn mein grund Gedanke grundsätzlich falsch? Wo könnte mein Fehler liegen? Ich weiß auch nicht wie es zu dieser testbench kommen kann (siehe Bild). 2. Problem Modul: Block Clock Nutze das Modul "counter" von oben, um für das Modul "sqare_wave" die Clock herunter zu teilen. Dafür wird der Ausgang der auf den Reset des counters gelegt. counter: zählt bis zu einem Wert M (in einer Generic Vorbelegt mit 5) und gibt dann ein tick raus, zählt dann weiter bis er dann resetet wird. Braucht ein Reset um zu Starten. q Zähl dabei binär hoch. Damit mit der Tick als erstes dem Signal "raus" übergeben wird, bevor der Counter resetet wird, habe ich das in einem Prozess geschrieben. Trotdem der binär Counter richtig zählt (siehe q), wird der Tick offensichtlich nicht weitergegeben.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity block_clock is port( clk: in std_logic; reset_in: in std_logic; clk_neu: out std_logic; q_temp: out std_logic_vector(3 downto 0) ); end block_clock; architecture Behavioral of block_clock is signal raus: std_logic; signal reset_temp: std_logic; begin -- instantiate the circuit under test uut: entity work.counter(arch) -- uut: unit under test port map( clk=>clk, max_tick=>raus, reset=>reset_temp, q=>q_temp ); process(raus,reset_in) begin clk_neu <= raus; reset_temp <= reset_in or raus; end process; end Behavioral; |
Ich wäre für jede Hilfe Dankbar! Also schonmal vielen Dank im Voraus. Gruß Marten
Beitrag #2711234 wurde von einem Moderator gelöscht.
Datum:
Hallo. Ein paar Sachen klingen ein bißchen komisch, zB "binär hochzählen." Gleich zu Beginn fiel mir folgendes auf: Fehler im counter: r_next <= r_reg + 1; Was soll er da machen? Das ist eine kombinatorische Schleife. würde ich in den clk-process geben und schreiben r_reg <= r_reg + 1; >Meine Aufgabe ist jetzt >ein variabel einstellbares Rechtecksignal zu erzeugen. Und nun komme ich >nicht mehr weiter. Du möchtest das Problem lösen mit einem Counter und einem Taktteiler. Ist machbar, aber du hast dann nur halben/viertel/achtel/...-fache von deiner Clk. Möglich wäre aber sowas in der Art (pseudocode): entity: inputs clk,reset, pulsbreite_vector output variables_rechteck (pwm) in der architecture dann sowas in der art synchroner process { wenn reset { setze alles auf deine werte(zB variables_rechteck= 0;r_reg=0;) } sonst wenn rising_edge { wenn r_reg < pulsbreite_vector { r_reg <= r_reg + 1; } sonst { r_reg <= 0 variables_rechteck <= not variables_rechteck } } Da is auch einiges erklärt: http://www.lothar-miller.de/s9y/ LG



