Couldn't implement registers Prescaler problem

OP #3212110
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:)
OP #3212361
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?
Gast #3212370
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?
OP #3212373
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.
OP #3213027
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren