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)?
> 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?
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
Das wird so nichts. Schau dir am besten erst mal ein paar Beispiele an wie man serielle Daten einliest, z.B. UART/SPI-Cores.
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.
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.
mir ist etwas aufgefallen, was ich noch am Code verbessern kann und wenn ich weiterhin Probleme habe, werde ich mehr Informationen angeben. Danke vorerst
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:
SensorManual bzw. ADW-Manual(Der Sensor ist auf einer Platine mit einem ADC aufgebaut)
Übrigens wird der Sensor durch ca. 14cm lange Kabel an der Platine verbunden.
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.
:) 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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.