Forum: FPGA, VHDL & Co. Couldn't implement registers Prescaler problem


von GS (chromosoma)


Lesenswert?

Hallo. Ich baue hier geade einen CLK Prescaler für meinen Hobbyrojekt 
auf CPLD.
Leider bekomme ich folgende Fehlermeldung:

Error (10822): HDL error at FIRMWARE.vhd(161): couldn't implement 
registers for assignments on this clock edge

Die Fehler hatte ich schon   mehrmals gehabt, und könnte es 
selbsständig lösen. Normalerweise lag es daran, dass  ein Signal in 
mehreren Statemens  gleichzeitig zugewisen wurde.
Hier ist es  nicht der Fall (so sehe ich das :)
1
PROCESS(CLK_250, PRSCL,CLK_ADC_SIG)---CLK FOR ADC
2
BEGIN
3
CASE PRSCL IS
4
WHEN 1 =>  ----NO PRESCALER
5
   CLK_ADC<=CLK_250;--- IF NO PRESCLAER THEN ASSIGN CLK TO ADC_CLK
6
WHEN  OTHERS => ---ELSE USE PRESCALER 
7
   IF(CLK_250'EVENT AND CLK_250='1')THEN
8
   ADC_PRSC<=ADC_PRSC+1;
9
   IF(ADC_PRSC=PRSCL)THEN
10
         ADC_PRSC<='1';
11
   CLK_ADC_SIG<= NOT CLK_ADC_SIG;--- FLIP VALUE
12
   END IF;
13
   END IF;
14
  CLK_ADC<=CLK_ADC_SIG;---ASSIGN VALUE
15
END CASE;
16
END PROCESS;

Please help:)

von GS (chromosoma)


Lesenswert?

also. DAs ist jetzt wirklich komisch, ich  habe gerade

IF(CLK_250'EVENT AND CLK_250='1')THEN


 durch

IF(CLK_250='1')THEN


 ersetzt, und das Problem ist plötzlich weg ...

Ich dachte immer diese beide Ausdrücke sind equivalent.

Kann mir jemand bitte erklären, was da passiert ist?

von Spülknecht (Gast)


Lesenswert?

Böser Kommunist schrieb:
> Ich dachte immer diese beide Ausdrücke sind equivalent.
Keineswegs, der erste generiert flankengesteuerte Flipflops für die 
zugewiesenen Signale, der 2. Pegelgesteuerte Flipflops (von deren 
Verwendung aber im allgemeinen abgeraten wird)

Und hast du nicht genau hier zwei Zuweisungen zum Signal ADC_PRSC?
Böser Kommunist schrieb:
> ADC_PRSC<=ADC_PRSC+1;
>    IF(ADC_PRSC=PRSCL)THEN
>          ADC_PRSC<='1';
Und wie weist du außerdem einmal einen Integer-Wert zu und einmal einen 
bit-Wert?

von GS (chromosoma)


Lesenswert?

Morgen:)

 Also die Sache mit 'bit'  Zuweisung war zwar ein Fehler den ich 
übersehen habe,hatte aber nichts dem Problem zu tun.

 Ich habe mein Prescaler mit dem Code realisiert:
1
IF(CLK_250='1')THEN
2
  
3
   IF(ADC_PRSC<PRSCL)THEN
4
      ADC_PRSC<=ADC_PRSC+1;
5
6
   ELSE
7
    ADC_PRSC<=1;
8
    CLK_ADC_SIG<= NOT CLK_ADC_SIG;--- FLIP VALUE
9
   CLK_ADC<=CLK_ADC_SIG;---ASSIGN VALUE
10
   END IF;
11
 END IF;


Schreibe ich CLK'event noch dazu,  kommt es wieder zu obiger 
Fehlermeldung.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Mal eine kleine Anregung zum Nachdenken: wo steht der Takt üblicherweise 
in VHDL Beschreibungen? Und wo steht er bei dir?

Du wirst die Arbeit in 2 Schritte aufteilen müssen, weil/wenn du es 
nicht in 1 Prozess bekommst:
1. Den Teiler
2. Den Multiplexer (ungeteilter Takt und geteilter Takt)

von GS (chromosoma)


Lesenswert?

Ehm, der Takt steht üblicheweise am  Anfang des Processes. Aber ich 
dache so würde es auch gehen.
Wieso muss ich jetzt die Arbeit aufteilen, wenn   der obige  Code in 
Simulation problemslos funktioniert?

von GS (chromosoma)


Lesenswert?

Ok, ich habe es so gemacht, wie  mir Lothar es emphohlen hat, 
schließlich hat er mehr Erfahrung als ich:)
1
WITH CLK_DIV SELECT
2
     CLK_ADC <= CLK_250 WHEN '0',
3
                CLK_ADC_SIG WHEN OTHERS;
4
5
6
7
PROCESS(CLK_250, PRSCL)---CLCK FOR ADC
8
BEGIN
9
   IF(CLK_250='1' AND CLK_250'EVENT)THEN
10
     CASE PRSCL IS
11
    WHEN 0 =>
12
      CLK_DIV<='0';--- IF NO PRESCLAER THEN ASSIGN CLK_250 TO ADC_CLK
13
     ADC_PRSC<=1;
14
     CLK_ADC_SIG<='1';
15
    WHEN  OTHERS => ---ELSE USE PRESCALER 
16
      CLK_DIV<='1';
17
     IF(ADC_PRSC<PRSCL)THEN
18
      ADC_PRSC<=ADC_PRSC+1;
19
      ELSE
20
       ADC_PRSC<=1;
21
       CLK_ADC_SIG<= NOT CLK_ADC_SIG;--- FLIP VALUE
22
       
23
   END IF;
24
     END CASE;   
25
   END IF;
26
END PROCESS;

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.