Forum: FPGA, VHDL & Co. mal wieder "bad synchronous description"


von Sebastian H. (Gast)


Lesenswert?

Frohe Ostern!

Ich hab da ein kleines Problem mit dem ACT_ADC-Signal. Wie bekomme ich
es hin, daß ich das Signal bei fallenden und steigenden Flanken
bearbeiten kann?
1
PIX_COUNTER: process (CCD_CLK)
2
begin
3
  if CCD_CLK = '1' and CCD_CLK'event then
4
    if PIX_COUNT = 1 then
5
      ACT_ROG <= '1';
6
      PIX_COUNT <= PIX_COUNT + 1;
7
    elsif (PIX_COUNT >= 34) and (PIX_COUNT <= 2082) then
8
      ACT_ADC <= '1';
9
      PIX_COUNT <= PIX_COUNT + 1;
10
    elsif PIX_COUNT = 2088 then
11
      PIX_COUNT <= 0;
12
    else
13
      PIX_COUNT <= PIX_COUNT + 1;
14
    end if;
15
  end if;
16
  if CCD_CLK = '0' and CCD_CLK'event then
17
    if PIX_COUNT = 1 then
18
      ACT_ROG <= '0';
19
    elsif (PIX_COUNT >= 34) and (PIX_COUNT <= 2082) then
20
      ACT_ADC <= '0';
21
    end if;
22
  end if;
23
end process PIX_COUNTER;

Danke!

Gruß,
Sebastian

von T.M. (Gast)


Lesenswert?

In einem Prozess darf man nur auf steigende ODER fallende Flanke
abfragen. Beides zusammen ergibt die Fehlermeldung. Musst also so
umschreiben, dass du das ganze in 2 Prozesse packen kannst.

von Sebastian H. (Gast)


Lesenswert?

Erstmal Danke für den Tip! Ich hab nun zwei Prozesse daraus gemacht.
Jetzt hab ich aber zwei neue Probleme:
  Multi-source on signal <ACT_ROG>
  Multi-source on signal <ACT_ADC>
Wie kann ich denn die Multi-source umgehen?
1
PIX_COUNTER_1: process (CCD_CLK)
2
begin
3
  if CCD_CLK = '1' and CCD_CLK'event then
4
    if PIX_COUNT = 1 then
5
      ACT_ROG <= '1';
6
      PIX_COUNT <= PIX_COUNT + 1;
7
    elsif (PIX_COUNT >= 34) and (PIX_COUNT <= 2082) then
8
      ACT_ADC <= '1';
9
      PIX_COUNT <= PIX_COUNT + 1;
10
    elsif PIX_COUNT = 2088 then
11
      PIX_COUNT <= 0;
12
    else
13
      PIX_COUNT <= PIX_COUNT + 1;
14
    end if;
15
  end if;
16
end process PIX_COUNTER_1;
17
18
PIX_COUNTER_2: process (CCD_CLK)
19
begin
20
  if CCD_CLK = '0' and CCD_CLK'event then
21
    if PIX_COUNT = 1 then
22
      ACT_ROG <= '0';
23
    elsif (PIX_COUNT >= 34) and (PIX_COUNT <= 2082) then
24
      ACT_ADC <= '0';
25
    end if;
26
  end if;
27
end process PIX_COUNTER_2;

Gruß,
Sebastian

von Sebastian H. (Gast)


Lesenswert?

Ich habe es jetzt hinbekommen. Im Zwei Prozesse frage nur die Pegel ab
und nicht die Flanke.
1
PIX_COUNTER_2: process (PIX_COUNT)
2
begin
3
  if (PIX_COUNT >= 34) and (PIX_COUNT <= 2082) then
4
    if CCD_CLK = '1' then
5
      ACT_ADC <= '1';
6
    elsif CCD_CLK = '0' then
7
      ACT_ADC <= '0';
8
    end if;
9
  end if;
10
end process PIX_COUNTER_2;

Gruß,
Sebastian

von Mockup (Gast)


Lesenswert?

man könnte die flanken abfragen indem man das so macht.
if rising_edge(clk) then
  signal1 <= signal;
  signal2 <= signal1;

  if signal2 = '0' and signal1 = '1' then -- steigende flanke
    blabla
  end if;

  if signal2 = '1' and signal1 = '0' then -- fallende flanke
    blabla
  end if;
end if;

mfg

von Tom (Gast)


Lesenswert?

Hallo zusammen,

die Flankenabfrage von Mockup ist eigentlich recht gängig.
Nur würde ich das abzufragende signal mindestens über 3 FF einsampeln,
und dann die FF2 und FF3 für die jeweilige Flankenabfrage (vom Typ
BOOLEAN) nutzen.
In etwa so:
1
IF rising_edge(clk) THEN
2
.
3
.
4
Signal1 <= Signal;
5
Signal2 <= Signal1;
6
Signal3 <= Signal2;
7
.
8
.
9
rising_edge_Signal  <= Signal2 = '1' AND Signal3 = '0';
10
falling_edge_Signal <= Signal2 = '0' AND Signal3 = '1';

Gruß
Tom

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.