Ist sowas synthetisierbar

#1034388
Lesenswert?

HAllo,

ich habe eine Case Struktur:

--hier einen Auszug:
case count_global is
...
...
...
when 30178 | 30180 | 30182 | 30184 | 30186 | 30188 | 30190 | 30192 | 
30194 | 30196 | 30198 => -- empfange 11 bits
  result(11+(30178-count_global)/2)<=dio;
  count_global  <= count_global+1;
when 30200 -- es geht weiter...


result ist:
signal    result : std_logic_vector(11 downto 0);

dio ist ein Eingangssignal

Also habe ich:

result(11+(30178-30178)/2) ergibt result(11)
result(11+(30178-30180)/2) ergibt result(11+(-1)) also (10)
result(11+(30178-30182)/2) ergibt result(11+(-2)) also (9)
...

Ist sowas richtig(auch Synthese)?
#1034402
Lesenswert?

1. signal   count_global:     integer range 0 to 35202:=0;

2. in der Simulation kommt es richtig raus

3. ich führe Messungen aus:

Clock Period von FPGA 20 ns
Clock Period von Sensor 10 us

Startsequenz senden:
Messung ausführen
10 ms Warten
...

deswegen die großen Zahlen von count_global
#1035387
Lesenswert?

Ein Beispiel geben, wäre noch hilfreicher

sowas habe ich auch probiert und es klapte nicht so ganz:
shiftregister <= shiftregister(breite-2 downto 0) & dateneingang;


vom Sensor lese ich 4 Ergebnisse aus:
vref,xaxis,yaxis,zaxis (ACC Sensor)

die Vorgehensweise für alle Achsen ist gleich, aber es
wird nur das Ergebnis für vRef und xaxis richtig ausgelesen.
#1036284
Lesenswert?

VHDL-nicht alles Könner :)))
Vieles habe ich mir durch Beispiele angeeignet, also es könnte auch 
sein, dass ich irgendwo dummen Fehler gemact habe. So, ich habe vieles 
geändert aber es scheint nicht zu klappen. Kleine Vorgeschichte:
Es handelt sich um den H48C3-Beschleunigungssensor:
cs - aktiviert den Sensor
dio - inout Data
clk - Clock
VCC - 5 V
GND - 0 V

loop:
1. cs muss auf low, damit der Sensor aktiviert wird
2. die erste rising_edge(clk) und dio=1 initialisiert den Startbit
3. danach werden durch weitere 4 Clocks die 4 Confbits übertragen
4. danach wartet man 1,5 Clocks für die Messung
5. danach erhält man 200ns nach falling_edge(clk) einen Nullbit+12 
Ergebnisbits
6. dann cs auf high und eine gewisse Zeit warten bis man neue Messung 
ausführt(ich habe schon mit 1ms, 6ms, 9ms, 18ms probiert)

zum Schluss, nachdem die 4 Messungen gemacht worden sind(Referenzwert+3 
Achsen), setze ich newdata auf 1 (durch den NIOS II lese ich die Werte 
aus
while (newdata !=1) {
    newdata =  IORD_ALTERA_AVALON_PIO_DATA(NEWDATA_BASE); // newdata
    a++;
    }
) und später ende_messung auf 1(danach werden weitere 
Messungsaufforderungen akzeptiert)


Im NIOS II IDE Terminal:

newdata received after 147500
vRef : 2047 -- ist richtig
x Achse : 3584 -- zu groß
y Achse : 0
z Achse : 0
newdata received after 147501
vRef : 0  -- es wird nicht mehr richtig gemessen/ausgegeben???
x Achse : 0
y Achse : 0
z Achse : 0
...
...
...

Ich verstehe nicht wieso, wenn im Modelsim alles richtig zu scheinen mag
Die Signale werden initialisiert(durch global Reset)
nach Ende Messung werden sie wieder zurückgesetzt, aber es geht nicht.
Habe ich irgendwo einen dummen Fehler(Simulation<>Synthese)???


C-Code:
1
  alt_u8 reqclear= 0x0;
2
  alt_u8 reqout= 0xE3; // E5 : T_H, E3 : ACC
3
  int a=0;
4
  int b=0;
5
  alt_u16 datainacc0=0;
6
  alt_u16 datainacc1=0;
7
  alt_u16 datainacc2=0;
8
  alt_u16 datainacc3=0;
9

10
while(b<5) {
11
        a=0;
12
        newdata=0;
13
        datainacc0=0;
14
        datainacc1=0;
15
        datainacc2=0;
16
        datainacc3=0;
17
          IOWR_ALTERA_AVALON_PIO_DATA(REQ_BASE, reqout); // reqacc
18
    while (newdata !=1) {
19
    newdata =  IORD_ALTERA_AVALON_PIO_DATA(NEWDATA_BASE); // newdata
20
    a++;
21
    }
22
    IOWR_ALTERA_AVALON_PIO_DATA(REQ_BASE, reqclear); // clear
23
    datainacc0=IORD_ALTERA_AVALON_PIO_DATA(VREF_BASE); // empfänger vRef & xaxis
24
    datainacc1=IORD_ALTERA_AVALON_PIO_DATA(XAXIS_BASE); // empfänger yaxis & zaxis
25
    datainacc2=IORD_ALTERA_AVALON_PIO_DATA(YAXIS_BASE); // empfänger vRef & xaxis
26
    datainacc3=IORD_ALTERA_AVALON_PIO_DATA(ZAXIS_BASE); // empfänger yaxis & zaxis
27
    printf("newdata received after %d\n",a);
28
    printf("vRef : %d\n", datainacc0);
29
    printf("x Achse : %d\n", datainacc1);
30
    printf("y Achse : %d\n", datainacc2);
31
    printf("z Achse : %d\n", datainacc3);
32
    b++;
33
     }


SensorManual:
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #1036412
Lesenswert?

Du bist hier komplett auf dem Holzweg.
Nicht der ADC gibt den Takt aus, sondern du. Deshalb mußt su auch 
niemals auf irgendeine rising_edge() warten, sondern kannst aktiv den 
Takt erzeugen und die Daten bezogen auf den von dir generierten Takt 
ausgeben bzw. einlesen.

Such mal hier im Forum nach SPI. Das ist, was du brauchst.
Z.B. sowas wie Beitrag "SPI im CPLD mit State Machine - geht das so?"
Lies dir den Thread mal durch. Dort geht es zwar um einen SPI-Slave, 
aber wenn du den verstanden hast, klappt es auch mit dem SPI-Master.
#1036564
Lesenswert?

:)

ich warte natürlich nicht auf dem ADC, sondern erzeuge ich schon einen 
Clock
(siehe VHDL Code)

Der Fehler sollte nicht am Clock liegen, weil er eigentlich die erste 
Achse richtig ausliest, aber die folgenden 3 nicht mehr.
Dabei spielt es keine Rolle, welche Achse ich zuerst auslese, die wird 
immer richtig ausgelesen und die nachfolgenden 3 nicht mehr.
#1057421
Lesenswert?

für alle, die sich auch gewundert haben sagen ich was sich 
herausgestellt hat:

Die Kabels mit denen ich den Sensor an die Platine angeschloßen habe, 
waren nicht sauber gelötet(das wusste ich davor, aber dass es so schlimm 
war, dass es nicht funktionieren wird, konnte ich mir nicht vorstellen)
Nachdem dies behoben wurde funktioniert alles wie geschmiert.

Tschüss.

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