Hallo allemaal,

Ik ben net begonnen met het ontdekken van de mogelijkheden van JAL, maar ik kom er niet uit. Ik ben elke tutorial afgelopen, maar geen van die geeft het antwoord.

Ik heb een word en wil die opsplitsen in twee aparte bytes. De ene byte de hoogste 8 bits, de andere byte de laagste. Nu ben ik van VHDL gewend dat je iets kan zeggen als: byte x = word c(15 downto 8) om de hoogste 8 bits te pakken. Is zoiets mogelijk in JAL?

Als dat niet kan, heb ik een andere vraag. Ik probeerde even of 'byte x = word c' mag. JalEdit gaf geen problemen, maar nu vraag ik me af welk deel van de word in de byte is gekomen. Waarschijnlijk de 8 laagste bits, maar ik wil het toch even zeker.

In het geval dat dat laatste klopt, kan ik dan de hoogste 8 bits van een word pakken met 8 keer een SRL?

Alvast bedankt.

Op 21 januari 2010 00:52:56 schreef Justovic:
Waarschijnlijk de 8 laagste bits, maar ik wil het toch even zeker.

Kleine moeite om dat te controleren

In het geval dat dat laatste klopt, kan ik dan de hoogste 8 bits van een word pakken met 8 keer een SRL?

SRL ken ik niet maar bedoel je een logic shift?
Dat kan, met een AND mask kan het ook.

Jal gebruikt het shift (right or left) commando. Staat in de manual op deze pagina: http://www.casadeyork.com/jalv2/jalv2/c376.html.

wordvariable = wordvariable >> 8
bytevariable = wordvariable

dit geeft je de hoogste 8 bits
Of dit in 1 regel kan weet ik niet zeker dat moet je even testen.

De laatste versie van de compiler zal je een warning geven dat er een variabele mismatch is, maar dat is hier juist de truck dus gewoon negeren.

Ah bedankt, zoiets verwachtte ik al, maar kon het nergens bevestigd vinden.

Op 21 januari 2010 02:44:27 schreef Henry S.:
SRL ken ik niet maar bedoel je een logic shift?
Dat kan, met een AND mask kan het ook.

SRL: Shift Right Logical.
Een AND mask ken ik weer niet

Op 21 januari 2010 02:44:27 schreef Henry S.:
Kleine moeite om dat te controleren

Dus de byte op binnen zetten en controleren of het goed gegaan is? Of ken je misschien een goede simulator?

EDIT:
Ik heb nog even snel gecheckt of JALEdit problemen geeft met bytevariable = wordvariable >> 8, maar zelfs geen warnings. Nu heb ik hier nog wel een vraagje over. Is wordvariable daadwerkelijk 8 verschoven, na deze expressie? Of alleen tijdelijk zodat bytevariable de waarde kan overnemen en wordt de wordvariable dan weer teruggezet?

Dat wordt testen denk ik. Ik doe dit altijd door de verschillende getallen naar een lcd te schrijven en proefondervindelijk te checken wat het nu precies is.

Een simulator is er inderdaad maar mij lukt het niet hier iets serieus mee te doen (waarschijnlijk heb ik er gewoon niet de tijd in gestopt. snel naar een lcdtje schrijven werkt sneller :)).

Ok, bedankt

Ben even verder gegaan met experimenteren. Ten eerste ben ik erachter gekomen dat bytevariabele = (wordvariabele >> 8) niet werkt, maar wordvariabele = wordvariabele >> 8 en dan bytevariabele = wordvariabele wel.

Nu heb ik alleen hetzelfde probleem voor byte naar bit. Ik wilde een byte opdelen in bits en die versturen (voor een schuifregister). Maar bitvariabele = bytevariabele levert altijd een 1 op. Wat wel werkt is bytevariabele % 2 om de LSB te zien en dan bytevariabele >>1 om de volgende te kunnen bekijken, maar voor mijn opstelling is het makkelijker om bij de MSB te kunnen beginnen. Waarom kan je niet gewoon bytevariabele(7) doen om die te krijgen? Of bestaat er wel zoiets?

[Bericht gewijzigd door Henry S. op (97%)]

Op 21 januari 2010 12:13:44 schreef Justovic:
SRL: Shift Right Logical.
Een AND mask ken ik weer niet

Een franstalige ontwikkelaar? :+ Die luisteren ook naar een Disque Compact ipv een CD...

Een AND mask is een AND vergelijking.


target=source AND %00001111

Leest alleen de onderste 4 bits.
(pseudocode, voor JAL zelf even uitzoeken)

Verzoek om http://www.circuitsonline.net/forum/faq/1#topickicks even te lezen.

Dit kan in JAL veel eenvoudiger:

var byte bytevariabele
var bit bitvariabele0 at bytevariabele :0
var bit bitvariabele1 at bytevariabele :1

...

Kijk maar eens in eender welke device library daar vind je hele reeksen hiervan. Zo worden bijvoorbeeld alle pinnetjes gedefinieerd.

Maar in mijn geval moet ik dan twee bytes helemaal opdelen in bits. Het is makkelijker om gewoon een loop te maken. Een AND mask zoals Henry geeft is daarvoor ideaal. Om dan bit 6 te pakken van een byte doe je gewoon bitvariabele = bytevariabele & 0b_0100_0000. Maak je van dat laatste een variabele, dan kan je in een loop van de MSB naar LSB lopen door ANDMASK = ANDMASK >> 1 en te beginnen op 0b_1000_000.

Nee dat hoeft helemaal niet. Je definieert alleen bit 6 en klaar. Daarna moet je alleen de variabele voor bit 6 aanroepen.

Maar ik wil van twee bytes alle bits om de beurt op twee uitgangen zetten (2 schuifregisters). Dan zou ik 16 definities moeten maken, ipv een loopje met een AND mask.

Dan heb ik nog een mogelijkheid:

definieer de eerste bit van je wordvariabele,

en dan twee loopjes: eerste bit naar de uitgang en eentje opschuiven, 8 x voor het eerste schuifje en nog eens 8 maal voor het tweede schuifje. Dan hoef je je wordvariabele niet eens in bytes te splitsen.

Je bedoelt zoiets? (toch even met bytevariabele, met maar 1 uitgang):


for 8 using i loop
var bit bitvariabele at bytevariabele:(7-i) -- Om te  beginnen bij de MSB
bituitgang = bitvariabele
end loop

De compiler geeft hier een foutmelding: "constant expression expected".
Gewoon 'i' in plaats van '7-i' werkt ook niet trouwens.

Nee de bitvariabele definieer je samen met alle andere definities (voor je forever loop dus)


var word wordvariabele
var bit bitvariabe at wordvariable : 0

forever loop

     for 8 loop
         bituitgang = bitveriabele
         wordvariabele = wordvariabele >> 1
     end loop

end loop

Ik ben nu op het werk en bedenk me dat ik een bit uit een word nog nooit zo gedaan heb (wel uit bytes zoals in de libs) Wel even checken dat dit kan, anders moet je toch eerst de bytes uit je word halen.

Ik heb het een en ander veranderd zodat het controleren iets makkelijker wordt en de uitgang begint bij de MSB.


var word wordvariabele
var bit bituitgang
var bit bitvariabele at wordvariabele : 15

forever loop
     wordvariabele = 60000                  -- 1110101001100000
     for 16 loop
         bituitgang = bitvariabele
         wordvariabele = wordvariabele << 1
         serial_sw_write(bituitgang)
         delay_1s(1)
     end loop

end loop

En met MICterm krijg ik precies die bitstring. Dus dit werkt! Bedankt, dit maakt het een heel stuk makkelijker.