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


von Marten K. (m_88)



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.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity block_clock is
6
  port(
7
    clk: in std_logic;
8
    reset_in: in std_logic;    
9
    clk_neu: out std_logic;
10
   q_temp: out std_logic_vector(3 downto 0)
11
  );
12
end block_clock;
13
14
architecture Behavioral of block_clock is
15
  signal raus: std_logic;     
16
  signal reset_temp: std_logic;     
17
18
  begin
19
-- instantiate the circuit under test
20
    uut: entity work.counter(arch) -- uut: unit under test
21
    port map(
22
      clk=>clk, 
23
      max_tick=>raus,
24
      reset=>reset_temp,
25
      q=>q_temp
26
    );
27
    process(raus,reset_in)
28
    begin
29
      clk_neu <= raus;
30
      reset_temp <= reset_in or raus;
31
    end process;
32
end Behavioral;

Ich wäre für jede Hilfe Dankbar!

Also schonmal vielen Dank im Voraus.

Gruß Marten

: Verschoben durch User
von max (Gast)


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

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
Noch kein Account? Hier anmelden.