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
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:
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.