mikrocontroller.net

Forum: FPGA, VHDL & Co. Ist sowas synthetisierbar


Autor: Plau Sein (radih)
Datum:

Bewertung
0 lesenswert
nicht 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)?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Plau Sein (radih)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Plau Sein (radih)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Plau Sein (radih)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Plau Sein (radih)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:

  alt_u8 reqclear= 0x0;
  alt_u8 reqout= 0xE3; // E5 : T_H, E3 : ACC
  int a=0;
  int b=0;
  alt_u16 datainacc0=0;
  alt_u16 datainacc1=0;
  alt_u16 datainacc2=0;
  alt_u16 datainacc3=0;

while(b<5) {
        a=0;
        newdata=0;
        datainacc0=0;
        datainacc1=0;
        datainacc2=0;
        datainacc3=0;
          IOWR_ALTERA_AVALON_PIO_DATA(REQ_BASE, reqout); // reqacc
    while (newdata !=1) {
    newdata =  IORD_ALTERA_AVALON_PIO_DATA(NEWDATA_BASE); // newdata
    a++;
    }
    IOWR_ALTERA_AVALON_PIO_DATA(REQ_BASE, reqclear); // clear
    datainacc0=IORD_ALTERA_AVALON_PIO_DATA(VREF_BASE); // empfänger vRef & xaxis
    datainacc1=IORD_ALTERA_AVALON_PIO_DATA(XAXIS_BASE); // empfänger yaxis & zaxis
    datainacc2=IORD_ALTERA_AVALON_PIO_DATA(YAXIS_BASE); // empfänger vRef & xaxis
    datainacc3=IORD_ALTERA_AVALON_PIO_DATA(ZAXIS_BASE); // empfänger yaxis & zaxis
    printf("newdata received after %d\n",a);
    printf("vRef : %d\n", datainacc0);
    printf("x Achse : %d\n", datainacc1);
    printf("y Achse : %d\n", datainacc2);
    printf("z Achse : %d\n", datainacc3);
    b++;
     }


SensorManual:

Autor: Plau Sein (radih)
Datum:
Angehängte Dateien:

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

Autor: Plau Sein (radih)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Übrigens wird der Sensor durch ca. 14cm lange Kabel an der Platine 
verbunden.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Plau Sein (radih)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Plau Sein (radih)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fried Vissel (tich)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kalte Lötstellen und verdeckte Sofwarefehler.... beides gleichermassen 
sehr von Übel!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.