Forum: FPGA, VHDL & Co. Ist sowas synthetisierbar


von Plau S. (radih)


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)?

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


Lesenswert?

> Ist sowas richtig(auch Synthese)?
Das kommt darauf an, wie z.B. dein count_global deklariert ist.

> result(11+(30178-30178)/2) ergibt result(11)
Kommt das in der Simulation auch so raus?

Aber mir scheint sowieso, du machst hier irgendwas irgendwie arg 
kompliziert. Was wird denn das werden?

von Plau S. (radih)


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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Das wird so nichts. Schau dir am besten erst mal ein paar Beispiele an 
wie man serielle Daten einliest, z.B. UART/SPI-Cores.

von Plau S. (radih)


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.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Falls es um ein serielles Protokoll geht bist du mit dem Schieberegister 
schon auf dem richtigen Weg. Mehr kann man dazu nicht sagen, alles was 
du bisher an Informationen gegeben hast ist dass du VHDL-Code schreibst 
um einen Sensor auszulesen. Wenn du Hilfe willst musst du schon genauer 
erklären was du vor hast.

von Plau S. (radih)


Lesenswert?

mir ist etwas aufgefallen, was ich noch am Code verbessern kann und wenn 
ich weiterhin Probleme habe, werde ich mehr Informationen angeben.

Danke vorerst

von Plau S. (radih)


Angehängte Dateien:

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:

von Plau S. (radih)


Angehängte Dateien:

Lesenswert?

SensorManual bzw. ADW-Manual(Der Sensor ist auf einer Platine mit einem 
ADC aufgebaut)

von Plau S. (radih)


Lesenswert?

Übrigens wird der Sensor durch ca. 14cm lange Kabel an der Platine 
verbunden.

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


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.

von Plau S. (radih)


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.

von Plau S. (radih)


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.

von Fried V. (tich)


Lesenswert?

Kalte Lötstellen und verdeckte Sofwarefehler.... beides gleichermassen 
sehr von Übel!

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.