www.mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL: Anfänger Problem


Important 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.
Autor: Marten Köhler (m_88)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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.
Autor: max (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net