# FPGA, CPLD, 74xx loģikas >  par State machine Loģiku un to nepieciešamību

## Epis

Pēdējās dienas kad jau uztaisīju savu PWM Generātor Loģiku priekš nios II procesora sapratu kad kautkā baigi daudz resursus aizņem tās paštaisītās manas perifērijas ar Avalon slave interfeisu. pāris piemēri: 

parasts Quadratūrā A,B signāla dekoderis (priekš optiskā enkodera A,B Quadratūrie singāli) kopā man aizņem 189 LE (Lģiskos Elementus vai LUT)
un nesen uztaisītais primitīvais PWM ģenerātors(var ģenerēt arī parastu frekvenci) aizņem ap ~120LE !

varbūt kādam liekās kad tas nav neko daudz ja salīdzina kad iekš fpga mikrenes tilums mērāms tūkstošos(man ir ~8000, ietiplīga FPGA) LE, bet ja vaig vairāks šādas perifērijas tad tas loģikas skaits savācās un jau arī merāms tūkstošos un es sāku skatīties kur tad tā visa loģika aiziet (kādās darbībās) un izrādās kad enkoder Loģikas gadījumā 65% loģikas aiziet avalon slave interfeisa izveidei jeb 122LE un pats enkoder ekoderis ar visiem savu countera un + taimeri aizņem tikai 67LE bet pats Quadratūrā signāla dekoderis nieka 12LE un te arī sāku domāt kā lai samazina šito loģikas daudzumu un vienkāršo visu sistēmu jo lielais perifēriju skaits (ja pievieno kādas 10-15 šādas visādas perifērijas sāk bremzēt paša procesora ātrumu kas saistīts ar to Avalon data līnijas jeb to signālu slēdžu skaita palielināšanos (kas starp citu arī papildus prasa savu loģiku tikai es nēsu izmērijis cik daudz viņš programma pieliek loģikas gēnerējot sistēmu un savienojot to loģiku ar procesoru) 
un beigās sanāks nenormāli daudz Loģikas vienkārši izķēzīt (lietderība tur nebūs nekāda lielā) 
Un ideja tagat ir tāda kad vaig izmantot tos mazos Quadratūr dekoderus 12LE pieslēgt pie viena taimera un Priekš Datu glabāšanas izmanto iekšējo fpga atmiņu (dual port RAM), tad arī vaidzētu kautko līdzīgu minī procesoram jeb State machine, kas tos datus ierakstītu Ram atmiņā un veiktu nelielu manupulāciju (saskaitīšana un atņemšana) un arī pēc Nios procesora pieprasījuma sūtītu datus no RAM procim caur to Avalon intefeisu. 
Esu jau pētījis mazos 8bit procesoriņus kā Picoblaze kurš ir ļoti miniatūrs ap 190LC un ir vēl Actel CoreABC kuram datu līnijas platuvu var izvēlēties no 8-32bitiem, bet abos gadījumos priekš tāds specifiskas lietas viņi der bet ja grib dabūt maximāli iespējami miniatūrāku + efektīvāku variantu tad laikam jātaisa savējais kontrollieris un tagat es arī mēģinašu kautko izveidot. Kontrolles State machine kodu es te ielikt varētu (kad uztaisīšu  ::  mācību nolūkos jo es pats arī mācīšos kā uztaisīt minī speciālizētu proci  :: 

Jebkādas idejas + linki būs ļoti noderīgi  ::  ar visādiem state machine piemēriem.
Es pats arī gribu izpētīt dziļāk to State machine būvniecību jo neko tik sarežģitū vēl kodējis nēsu (tās visas citas loģikas ir samēra vienkāršas  ::

----------


## Epis

Vakar jau sāku likt kopā jauno sistemu. 
Izveidoju to Ram atmiņas Read, Write līniju dalītāju kas sadalīs pieju pie Ram atmiņas starp to state machine Loģik un avalon interfeisu Ar parasto MUX loģiku

Šeit viens intresants links S430 Open sorece Core
http://bleyer.org/s430/

kur viens izveidoja MSP430 procesora analogu (no nulles) S430 un tur ir kods pa velti (VHDL valodā) tagat ienāca ideja paskatītes un papētīt to kodu moš kādu koda gabalu kā Instrukciju dekoderi var izmantot vai vismaz pasmelties idejas no viņu darba (jau apskatījos viņi tur izmanto One Hot encoding priekš instrukciju dekodēšanas  :: , 
bet nu pirm es ķeršos klāt tam S430 pameklēšu valodas konvertētāju no tā Verilog uz VHDL (negribās to Verilog valodu mācīties. 

Vēlāk arī ielikšu kādus sistēmas printscreen no progas lai būtu vieglāk saprast ko es te mēģinu uzkodēt  :: 
nupat izdevās to S430 Kodu nocompilēt uz Quartus un šeit procesora Instrukcijas dekodera RTL bilde samērā sarežģita Loģika 
ienāk 16bit instrukcija un tad viņu šeit itkā dekodē un iziet vairāki aignāli kas tālāk aiziet uz citām vietām Pēc šitās bīldes saprast neko īsti nevar bet tā tīri simblosii tā izskatās tas instrukcju dekoderis.


šodien 18. martā beidot (pēc milzīgas čakarēšanās) uztaisīju to savu Ram atmiņas Read,Write(16bitu)+Adress(8biti) dalītāju (pirmstam ko uztaisīju no sākuma uz ātro tā īsti negāja un aizņema ap 100LE) tas ir tā kad tā state machine pa tiešo nesūtīs signālus Procesoram, bet palaidīs Interupt signālu un tad procis pieslēgsies tai RAm atmiņai un tos datus nolasīs  ::  un tā pat arī ar Datu ierakstīšanu Ram atmiņā, un sanāk kad tā komunicēšanās notks caur to RAM atmiņu (lai ietaupītu Logīku un arī izmantotu to RAM).
un šis datu līniju Dalītājs man aizņem 52 LE to Loģikas daudzumu var +- vienkārši apreiķināt tā 2x16bit Reģistri =32LE+ 2X7bit adrešu reģistri=kopā jau 46 LE un papildus vēl loģika citu signālu loģika un tikai tagat kad šitā daļa ir gatava sākšu taisīt to STATE MACHINE  ::

----------


## Raimonds1

pēc manas saprašanas vajag sākt no otra gala - sākt ar parastu loģikas mikreni UN-NE, VAI-NE, trigeriem salikt no atsevišķām mikrenēm kaut kādu, pat visprimitīvāko loģiku, kas izpilda komandas un tad uz augšu līdz reģistram, tad vēl kam un tā tālāk...
tajā momentā, kad no 50 primitīvām mikrenēm būsi salicis funkcionējošu shēmu, kas atbilst vienai mazai programmējamai mikrenei- 
šajā procesā rodas kaudze iemaņu un zināšanu...

Kādas darbības gribi ieprogrammēt? Patulko profesionālo žargonu!

----------


## Epis

Paldies kar komentāru es jau to pamazām sāku saprast un gribi vai negribi jāsāk no tās primitīvās Loģikas atkal (tas ir jāpārbauda katrs loģikas bloks atsevišķi jo ja uzreiz uzkodē lielu koda gabalu tad tur neko vairs saprast nevar un nākās visādu Test signāl vadus papildus vilkt. 
Pirmājā bildē tas lielais bloks ir tas kurā iekšā ir mans kods un augšā ir RAM atmiņas Bloks (No gatavajām RAM Loģikām paņēmu) un saskaitītāj un atņēmēj aritmētiskais bloks arī paņēmu kā gatavu bloku (bet šeit viņš nav savienots (citā failā es vinu bīju savienojis un pārbaudīju kā viņš strādā) 

Īsumā izpidāmās dabības būs tādas: 
JA ir signās enkoderim2 (kopā būs 4)  TAD ģenerē pārtraukuma signālu un iedarbina to STATE machine Loģiku UN saglabā Enkodera2 Taimera vērtību pagaidu REģistrā UN dekodē pārtraukuma Avotu (nosaka kurš no 4 enkoderiem to izraisīja)
 Tālāk: 
Sate machine Nolasa no Ram atmiņas Enkodera 2 veco Taimera vērtību un Atņem no tās jauno taimera vērtību (Vtaimeris-Jtaimeris=Ātrums) un iegūstam Ātrumu kuru ierakstam RAM atmiņas speciālā Atruma adresē, 

Pēc tam Nomainam Vtaimera vērtību ar Jtaimera vērtību to ierakstam V taimera Ram adresē, 
Tālāk nolasam no Ram Countera adreses Cauntera vērtību un pēc enkodera griešanās virziena viņu samazinam(-1) vai palielinam(+1) un saglabājam  ::  
Kad šitas viss tiek izdarīts tad sūta Pārtraukuma signālu Lielajam procesoram ar papildus baitu, kurā norādīta Enkodera2 RAM Adrese, Lai lielais procis zinātu ko nolasīt (nolasīs viņš Atrumu un Counter vērtību (ātruma adrese+1)+vēl papildus procis nolasīs pirmstam Ramā ierakstītu ŗtraukuma vektora adresi(ātruma adrese+2) uz kuru viņš pats pēctam Leks lai veiktu nepieciešamos tālākos aprēķinus un darbības (ja nebūtu adreses tad vaidzētu pašam kodu rakstīt, lai noteiktu kurš no enkoderiem ir tas kurš iedarbojās).

Ja būs vairāki enkoderu pārtraukumi tad viņus pārbaudīs pēc secības sākot ar pirmo (vismaz tā būtu Loģiksi domājot)

Galvenais ir to Loģiku uztaisīt pēc iespējas mazāku man tagat šitias RAm nolasīšanas interfeis + tas Add/sub 16b bloks aizņem kopā jau pie 100LE + tie enkoder Dekoder 4 bloki katrs pa ~20x4=80 kopā ~180LE + taimeris ar Capture reģistru kopā bij ap 67LE un tad tagat, bez nekā cita jau skaits izaug līdz 247LE (salīdzinot ar ~756LE pirms tam), 
Bet man ir arī ideja ja es šitam  State machine pievienošu kāt Step signāla detektētājus 4 (kas nāks no CNC progas kompja LTP ports) un tad ceru kad būs tā atdeve lielāka no šitās perifēijas ja viņa apstrādās 8 iejošos signālus (tā parasti man tas viss aizņemtu 1512LE),
ja man šitas State machine kods kopā ar visiem dekoderiem sasniegs 500LE tad tas jau būs 3X mazāks nekā bez viņa parastajā variantā  :: .

----------


## Raimonds1

nu re, te jau pēc teksta var kaut ko saprast neprogrammētājs

tātad, kā parasta mikrene saprot tādu darbību kā nolasīt datus, ja pirms tam bijis tas un tas, bet ne tas
*ir kaut kāds izvads, kas atļauj nolasīt ( piemēram viens UN elements, kas ļauj tikt cauri tam impulsam, kas pieprasa lasīsānu
*tad ir kaut kāda skaitļu virkne uz reģistra, kas uz brīdi ir saglabāta, bet pēc 1 vai cik tur nolasīšanām jāīzdzēš, lai varētu rakstīt nākamo, tam ir kaut kāds reset izvads, kuram pievadot impulsu, nometās pa nullēm
*tad ir kaut kāds trigeris, kuram jāatceras, ka ir atmiņā tukša un gatava ierakstam
*tad ir kaut kāda shēma, kas seko tam, lai tā rakstīsana reģistrā, dzēšana laukā, atkal rakstīšana, lasīšana un atkal dzēšana notiktu secīgu un nekas nepārklātos, tam seko trigeri, reģistri, UN- NE elementi un vēl sazin kas, jābūt priekšstatam, kas notiek, ja uz izvada A ir nulle, uz B ir 1, uz C ir 1 un tā tālāk, kāds process tad tiek atļauts, kāds aizliegts un kāda šo vērtību kombinācija ko atļauj un ko aizliedz, kāda kombinācija pēc kuras var sekot un kāda nevar būt

*tad, kad uz tā grafika, kur ir nulles un vieninieki, saprotam, ko tajā brīdī dara tā ikrene- vai viņa lasa, vai raksta, vai dara vēl ko, tad sākamsaprast, aks un kā

Nu tādas pāŗdomas  ::

----------


## Epis

Šodien jau kautkas sanāca PIRMĀ State machine, kas dekodē pārtaukuma avotu (kādu no 4 enkoderiem) un sūta 8bit vērtību (RAM Adresi) 
un es arī vēl papildus ieliku Loģiku kas to Enkodera ģenerēto Pārtraukum signālu saglabā speciālā Status Reģistrā un pārtraukumu var nodzēst tikai caur to Speciālo Reģistru un viņš tiks dzest kad tiks tā Enkodera informācija apstrādāta un tikai tad State machine turpinās savu darbu pārbaudot citus pārtraukumus (šīs Enkoder Pārtraukuma Reģistrs strādā neatkarīgi no State machine garantējot to kad ja būs situācija kad vielaikus pārtraukuma vektoru ģenerēs vairāki avoti (enkoderi) tad viņi visi arī tiks pēc secības apstrādāti (neviens netiks izlaists)) 
Un lai pārbaudītu kā šī pama opārtraukuma ideja strādā es uzkodēju Taimeri 4bitu kas skaita līdz 16 un taimeri iedarbinās pārtraukuma vekotrs un tad kad taimeris aizskaitīts līdz 16 viņš pados signālu uz to Speicālo Pārtraukuma Reģistru un nodzēsīs paraukuma avotu dodot signālu State machine kad tā var turpināt savu darbu pārbaudot nākošo avotu.
Šito taimera efektu var redzēt otrajā attēlā kur ES ir pārtraukuma avots:
1= 0001 enkoderis 1 un tā tālāk līdz 4
2= 0010
4= 0100
8= 1000
un state machine uzdevums ir ģenerēt to RAM adresi QS izejā (katram stāvoklim sava adrese 
Pirmajam enkderim ir ielikts tas taimeris, Otrajam ir tikai Pārtraukuma vekotra Statusa reģistrs un trešajam ceturajam nav nekā un var redzēt kā 3 Enkoderi State machine nemaz nedetektē (izlaiž) jo pārtraukuma vekotrs 0100 uz to brīdi kad State machine pabeidza apkalpot 2 enkoderi jau bija 1000 (trešais jau beidzās un paspēja paņemt 4 enkoderi tur bildē nevar redzēt bet pēc (40) seko 4 enkodera RAM adrese (12) 
Kad pievienošu pārējiem diviem to Pārtraukuma speciālo Statusa reģitru tad tāda situācija kad 3 pazūd vairs neatkārtosies  ::  
Tur signālu attēlā pulkstens ātrums ir 200 Mhz bet es arī mēģināju uz max. iespējamo (cik programma noteica) 380Mhz, bet īpaši liels bonus vairs nebīj tajā atrumā, pie ~300Mhz bīj viss efektīgāk. (state machine dekodēja ar 14-17ns(70-58Mhz) ātrumu.




Rakstot  šitos Loģikas kodus ar VHDL vai VERlog valodu reāli netiek 
rakstīta tāda Tīra oģika kā UN vai vārti (protams tāda iespēja ir var arī tā rakstīt) tur princips ir daudz vienkāršāk ar iF- else- else if variantiem vai arī Case un citieim apzīmējumiem tiek tā funkcionalitēte veidota (apmēram kā C un citās augstā līmeņa valodās, protams šitai valodai nav tik augstā apstrakcijas līmenis) un tikai pēctam ja grib var apskatītes reālos Loģiskos vārtus ko esi uzkodējis (pārbaudei) man vēl ir tā kad es pats dažreiz nesaprotu un nevaru izsekot tajā Reālajā Loģikā tur ir tāds vadu mudžēklis labāk apskatīties simulātorā vai Loģika strādā un ja strādā tad viss kārtībā nav ko vairāk iedziļināties tajā vārtu līmenī. 
Bet nu tas palīdz, ja zini kā ar kodu izveidot to Loģiku arī vaŗtu līmenī un rakstot iedomājies kādiem vārtiem tur jābūt, 
Tagat jau arī ir jaunie C valodas Loģikas ģenerētāji no C koda, bet pēc tā uzģenerētā koda grib optimizētāku variantu vaig pašam pielabot.

----------


## Raimonds1

Šodien jau kaut kas sanāca - PIRMĀ State machine, kas dekodē pārtraukuma avotu (kādu no 4 enkoderiem)---kad tas enkoderis ir avots, kam jānotiek?---- un sūta 8bit vērtību (RAM Adresi) ---Kā viņš to sūta – kā virknes impulsu paketi pa vienu izvadu vai kā bināro skaitli pa 3 izejām? Uz kuras izejas jābūt impulsam, lai viņš sūtītu, kad viņš sāk, kad beidz un kad dzēš to 8bit vērtību? Ko tas sūtījums nozīmē tehnikai – apturēt soļinieku, noteikt, par cik pagriezies vai ko? Kas nosaka, kādu skaitli vin’’s sūta?-----
un es arī vēl papildus ieliku Loģiku, kas to Enkodera ģenerēto Pārtraukum signālu ---pie kādiem apstākļiem tas Pārtraukumsignāls ir vajadzīgs, ko viņš nosaka – status noteikšanu, pagrieziena leņķi, atļauju ierakstīt skaitli reģistrā vai ko?-----saglabā speciālā Status Reģistrā un pārtraukumu var nodzēst---kas ir, ja pātraukums ir dzēsts, ka sir, ja nav dzēsts, kādas darbības var, kādas nevar izpildīt?----- tikai caur to Speciālo Reģistru un viņš tiks dzēsts, kad tiks tā Enkodera informācija apstrādāta---- kas nosaka, ka apstrāde beigusies, uz kura izvada ir tas atļaujošais impulss vai kāda darbība tiek veikta?----- un tikai tad State machine turpinās savu darbu pārbaudot citus pārtraukumus (šīs Enkoder Pārtraukuma Reģistrs strādā neatkarīgi no State machine, garantējot to, ka,  ja būs situācija, kad vienlaikus pārtraukuma vektoru ģenerēs vairāki avoti (enkoderi), tad viņi visi arī tiks pēc secības apstrādāti (neviens netiks izlaists)) 
---kas no tās apstra’des, kādas sekas, kāda darbība?-----Un lai pārbaudītu kā šī pārtraukuma ideja strādā, es uzkodēju Taimeri 4bitu kas skaita līdz 16 un taimeri iedarbinās pārtraukuma vektors un tad, kad taimeris aizskaitīs līdz 16, viņš pados signālu uz to Speicālo Pārtraukuma Reģistru un nodzēsīs pārtraukuma avotu dodot signālu State machine, ka tā var turpināt savu darbu pārbaudot nākošo avotu. 
Šito taimera efektu var redzēt otrajā attēlā kur ES ir pārtraukuma avots: 
1= 0001 enkoderis 1 un tā tālāk līdz 4 
2= 0010 
4= 0100 
8= 1000 
un state machine uzdevums ir ģenerēt to RAM adresi QS izejā (katram stāvoklim sava adrese 
Pirmajam enkoderim ir ielikts tas taimeris ---ko nosaka ieliktais taimeris, ko atļauj veikt, ko nē?----, Otrajam ir tikai Pārtraukuma vektora Statusa reģistrs---vai reģistrs nozīme’, kā tā state mašīna ņem vinū vispaŗ vērā, bet nekādas darbības neveic?---- un trešajam ceturajam nav nekā un var redzēt kā 3 Enkoderi State machine nemaz nedetektē (izlaiž) jo pārtraukuma vekotrs 0100 uz to brīdi kad State machine pabeidza apkalpot 2 enkoderi jau bija 1000 (trešais jau beidzās un paspēja paņemt 4 enkoderi tur bildē nevar redzēt bet pēc (40) seko 4 enkodera RAM adrese (12) 
Kad pievienošu pārējiem diviem to Pārtraukuma speciālo Statusa reģitru tad tāda situācija kad 3 pazūd vairs neatkārtosies  

Rakstot šitos Loģikas kodus ar VHDL vai VERlog valodu reāli netiek rakstīta tāda Tīra loģika kā UN vai vārti (protams tāda iespēja ir var arī tā rakstīt) tur princips ir daudz vienkāršāk ar iF- else- else if variantiem vai arī Case un citiem apzīmējumiem tiek tā funkcionalitāte veidota ---respektīvi, programma var ierakstīt to pašu, ko veiktu parasta mikrene ar loģiku?---- (apmēram kā C un citās augstā līmeņa valodās, protams šitai valodai nav tik augstā abstrakcijas līmenis) un tikai pēc tam, ja grib var apskatītes reālos Loģiskos vārtus, ko esi uzkodējis (pārbaudei) man vēl ir tā, ka es pats dažreiz nesaprotu un nevaru izsekot tajā Reālajā Loģikā - tur ir tāds vadu mudžeklis: labāk apskatīties simulātorā vai Loģika strādā un ja strādā tad viss kārtībā nav ko vairāk iedziļināties tajā vārtu līmenī. ---Vārti būtu tas, ka laiž cauri, tas ir UN elements ?-----
Bet nu tas palīdz, ja zini kā ar kodu izveidot to Loģiku arī vārtu līmenī un rakstot iedomājies kādiem vārtiem tur jābūt, 
Tagat jau arī ir jaunie C valodas Loģikas ģenerētāji no C koda, ---tātad var it kā pa virus uzkodēt loģiku, it kā liktu kopā loģikas mikrenes?-----bet pēc tā uzģenerētā koda grib optimizētāku variantu--- vajag pašam pielabot.

----------


## Epis

Šodien bišķi pārtaisīju pašu signālu detektētāj(dekoder) Loģiku un sanāca 2X ātrāka un pēc ietilpības arī 2X mazāka 5LE un detektē 1pūlkstens ciklā kas arī ir max iespējamais ātrums(ja tā padomā). + saku veidot sava koda Hirarhiju ( izveidoju mazus koda blociņus un tad no tiem būvēju tālāko dodu).

Atbildes: 



> kad tas enkoderis ir avots, kam jānotiek?


 --- Avots viņš ir tad kad piesleģts pie strāvas un grižās sāk ģenrēt impulsus un tie ir tie impulsi 00111000111100 (mainīga frekvence kas arī jādetektē un jānosaka viņas ātrums) 

un sūta 8bit vērtību (RAM Adresi) ---Kā viņš to sūta? -- Vienkārši ir signāls Write enable(ieraksta atļauja) kur ja tas ir 1 tad informācija kas ir uz ierakstu datu līnijas 16 vadiem (16biti), tiek ierakstīta tajā adresē kāda ir uz Adreses datu līnijas 8vadiem (8biti) tajā momentā kad pūlktens signāls ir 1. tas ir primitīvs ierakstīsānas mehānisms bet pagaidām es vēl nēsu savienojis visu kopā.



> Uz kuras izejas jābūt impulsam, lai viņš sūtītu, kad viņš sāk, kad beidz un kad dzēš to 8bit vērtību?


  To 8bitu adreses vērtību pagaidām nedzēš nekas bet vēlāk būs līniju dalītājs kas noteikti kontrollēs to datu plūsmu(pagaidām tāda vēl nav jo pirmā State machine atbild tikai par pārtraukumu vektoru dekodēšanu (sagatavo signālus nākošam posmam)




> pie kādiem apstākļiem tas Pārtraukumsignāls ir vajadzīgs, ko viņš nosaka – status noteikšanu, pagrieziena leņķi, atļauju ierakstīt skaitli reģistrā vai ko?


 pārtraukuma signāls singnalizē kad ir parādījies Notikums Darbība šajā gadījumā viņš signalizē kad enkodera Signāls ir mainījis savu stāvokli no 0uz1 vai no 1uz0 un tad pēc tā pārtraukuma signāla tiek iedarbinātas visas pārējās sistēmas un State machine, ja nav signāla tad nekas nenotiek! (sistēma guļ un gaida kad parādīsies signāls) un pēc partraukma singāla parādīšanās viņš tiek saglabāts Statusa Reģistrā tik ilgi kamēr State machine nav apkalpojusi(apstrādājusi) ar šo signaļu saistītās tālākas darbības  ::  kad viss ir izdarīts tad signālu noņem un gaida nākamo (tās darbības ir frekvences ātruma notiekšana un impulsu skaitīšana+ datu nosūtīšana galvenajam procesoram)




> kas ir, ja pātraukums ir dzēsts, ka sir, ja nav dzēsts, kādas darbības var, kādas nevar izpildīt?


  Pārtraukuma signļa ilgums ir 1 pūlkstens cikls (ja pūlkstens ir 50Mhz tad tās būs 20ns) tādēļ arī to signālu saglabā Statusa Reģistrā lai viņš būtu aktīvs tik ilgi kamēr viņu nenodzēsīs State machine.



> kas nosaka, ka apstrāde beigusies, uz kura izvada ir tas atļaujošais impulss vai kāda darbība tiek veikta?


  kad galvenā State machine pabeigs tās visas darbības tad beigās pēdējā viņa darbība būs nodzēst šo Status Reģistru(bitu). 



> kas no tās apstra’des, kādas sekas, kāda darbība?


  Domājam Loģiski ja piemēram tiek saņemti 4 enkodera pārtraukuma impulsi pēc kārtas katra impulsa ilgums ir 1pūlkstens cikls (20ns) tad ja nebūs nekāda mehānisma kas tos signālus saglabās tad pēc 4 pūlkstens cikliem signāli būs beigušies un neviens viņus vairs nevarēs detektēt!(vilciens ir aizģajis!) 
Apstrāde?? nozīme kautkāda veida informācijas apstrādi manā gadijumā simpulsu skaitīsāna + laika intervāla notiekšana starp 2viem impulsiem un datu nodošana tālākai apstrādei lielajam procim(šeit iet runa par datu savākšanu un pirmatnējo viņu apstrādi lai atvieglotu darbu galvenajam procesoram un netārētu viņa laiku + paātrunātu Visas sistēmas reāģēšanas ātrumu uz ārējiem notikumiem (pārtraukuma singāliem),




> ko nosaka ieliktais taimeris, ko atļauj veikt, ko nē?


  kā jau minēju tad to taimeri es ieliku kā laika aizturi kas novilcinās laiku 16 pūlkstens ciklus un tad dos to signālu kad darbs ir padarīts (Ierakstīs tajā pārtraukuma Statusa Reģistrā 0 kas nodzēsīs  pārtrukuma(statusa) reģistra 1. 



> vai reģistrs nozīme’, kā tā state mašīna ņem vinū vispaŗ vērā, bet nekādas darbības neveic?


 Es State macine esu izveidojis tā kad viņa šos Reģistrus pārbauda pēc kārtas un kamēr pirmais nav pārbaudīts un viņa status Nodzēst tikmēr State machine neķerās klāt nākosājam(kas gaida rindā kamēr viņu apkalpos State machine)



> respektīvi, programma var ierakstīt to pašu, ko veiktu parasta mikrene ar loģiku?


 Nu te gāja runa par Kodu (VHDL) valodu kurai ir tā funkcionalitāte kad var izmantot jau gatavus Loģikas kodus (paketes ar gataviem kodiem kur ir norādita tikai to funkcionalitāte) neiedziļinoties kādu loģiku viņi reālitāte izveido tas nozīmē kad nav jāveido Loģika domājot par Loģiskajām Vārtu kombinācijām kā AND,XOR,NOT,DFF,MUX, utt.. un nevaig pašam kodēt katru Loģiksa elementa iejas izejas vadu(kā viņš savienojās ar citu Loģikas elemetnu) tādējādi var veidot Loģiku kuras apjomi ir milzīgi būvējot no mazākiem kodu gabaliem lielākus un vēl lielākus.

Es tagat arī jau sāku domāt par hirarhijas veidošanu un gatavu kodu bloku izveido kurus pēctam vairākkārt varētu izmantot kodā, jo ļoti daudz kodi atkārtojās vairākas reizes un ja viņus visus kopē (jādomā jauni signālu nosaukumi) izveidojās ļoti gara kodu rinda kurā pašam ir grūti orjentēties + ja vaig mainīt kāda koda bloka funkcionalitāti vai viņu pielabot tad atliek izmainīt Pamat bloka kodā kodu un visas ra'ditās tās bloka kopījas pašas izmainīsies  ::  līdz ar to var kādu koda daļu Optimizēt nemainot visas koda (virtuālās)kopījas(jeb instance).



> tātad var it kā pa virus uzkodēt loģiku, it kā liktu kopā loģikas mikrenes?


 Tā programma C valodas Logīkas Generātors(sintezātors, compileris) veido Loģiku pēc C valodā aprakstītās tā darbības(funkcionalitētes) tas ir tas pats kad prikeš procesoriem C valodas compileris ģenerē Assembler kodu pēc C valodā aprakstītām darbībām un funkcijām) un pēc tam no Assemblera mašīnkodu. 
Loģikā ir tā pat C kods - VHDL/Verlog - Tranzistoru līmenis.

----------


## Epis

Beidzot saliku savu jauno State machine + piekabināju visus enkoder dekoderus zemāk bildēs var redzēt Enkoder Dekoder blociņus un lielos Blokus (ieviesu Kodā kautkādu Hirarhiju un kārtību  ::  )
Bilde 1: 
Var redzēt 8 enkodera iejošos singālus un kā uztiem atbils State machine atbilde ir Izejošā Q(8bit)i Adrese (vēlāk arī piekabināšu Taimera vērtību) 
Reāģē''snas un State machine dekodēšanas ātrums 30ns (pie pūlktens 200Mhz)

Te var redzēt kad situācijā kad visi 4 enkoderi maina savu stāvokli no 1uz 0 tad State machine apstrādā viņus pēc kārtas un nevienu neizlaiž garantējot to kad viss notiks precīzi (vienīgi 1 sanāk izpildās pēdējais nez kapēc)

Šeit pašas Loģikas  RTL bilde un tie Zaļie Bloki ir tie Hirarhiskie moduļi kuros iekšā ir atkal Cits kods Nākošajā bildē varēs redzēt kas tajoš zaļajos ir iekšā  ::  
Tas dzeltenais ir tas State machine Pārtraukumu dekoderis kas ģenerē tās adreses  :: 


Šeit ir tas kas atrodās pirmstam Zaļajā blokā un te arī ir vēl 2 blociņi kuros atrodās vienkārša Edge detector Loģika un šitas bloks ģenerē pamat pātraukumu un te arī ir tas Pārtraukuma Status Reģistrs kurš jānodzēš State machine blokam  ::

----------


## Mosfet

Epi kam tu to raksti, sev????
Daudz kas tur ir attēlots ir sviets, jau pamatos.

Star citu PWM izveido tikai ar 27 elementiem vienam kanālam.

----------


## Raimonds1

argumentus....?
 Process, kurā pamazām iziet cauri, kas, kā un kāpēc darbojas, vai, kas ir vēl svarīgāk, nedarbojas, ir ļoti vērtīgs un dod kaudzi zināšanu.
Paldies par atbildēm, manas zināšanas dubultojas  :: 

Grafiskā procesu ilistrācijai ar laiku ir svarīga lieta   ::  

Ko vēl var realizēt ar State Machine?

----------


## Epis

> Epi kam tu to raksti, sev????
> Daudz kas tur ir attēlots ir sviets, jau pamatos.
> 
> Star citu PWM izveido tikai ar 27 elementiem vienam kanālam.


 Es to rakstu sev - Lai palīdzētu pats sev - jo varbūt kāds kautko zin un var kautko nederīgu pateikt (papildināt), 
Un dažreiz arī palīdz ja kāds cits uzdod vienkāršus, bet trāpīgus jautājumus, kas liek bišķi padomāt vairāk un atbilde pate atrodās  :: , 

Es gribu redzēt (izpētīt) cik Liels ir Potenciāls šīm STATE machine Loģikām salīdzinājumā jau ar gatavajiem procesoru kodoliem primitīvu uzdevumu vikšanā + resursu efektīvāka izmantošana, un + dabūt lielāku pieredzi VHDL kodēšanā. 

Un kādas ir tava 27 Elementu izveidotā PWM funkcijas ?? (bitu daudzums un vai ir savienojams ar kādu datu maģistrāli(interfeisu) caur kuru var datus sūtīt). 

Kā redzi Mosfet es  tagat mācos tās State machine veidot un lai būtu proces intresantāks izveidoju šo topiku, un lielākā daļa no foruma dalīdniekiem šeit kautko mācās vai grib iemācites.

----------


## Raimonds1

mani pirmie pasatiprinātāji arī bija sviests totālākais, bet pamazām viss notika tā, kā tam bija jānotiek, šie sāka strādāt kā vajag.

Epi, esi iepircis mikreņu ligzdas, mikrenes un kādu D trigeri vai reģistru no parastajām UN-NE  utt salicis? Tajā procesā, kad saproti, kā tās mazās loģikas var kaut ko izpildīt, atcerēties un vispār darboties ir liels potenciāls.
Secība būtu tāda - saliekam trigerus kādus 4
uztasam skrejošu gaismiņu ar diodēm
tad jau ņemam gatavus trigerus un reģistrus, kombinējam tos
un tā uz augšu  ::

----------


## Epis

Realitātē es Tās Loģiskās shēmas Lodējis nēsu bet iekš simulātora esu modelējis (pašā sākumā tos Logīksos vārtus UN,NE,VAI utt.) Ja es mezinātu kas notiek Logīkas līmenī tad tik tālu nemaz ticis nebūtu  :: 
Un realitāte'ja to Loģiku Lodētu tad būtu grūti izsekot līdzi Visiem signāliem un vaidz'tu baigo osciloskopu vai arī digitālo Osciloskopu ar veselu kaudzi provju ņēmēju, bet kompī var ielikt Proves signāl izeju un apskatīties ir tas signāls savā vietā un laikā vai nav tadēļ tas viss process (testēšanas un pārbaudes) vismaz Loģikas veidošanas stadījā paātrinās. 

Tagat izdomāju savu galvenās State machine(SM) Uzbūvi un jau sataisīju tās 16bit platās datu līnijas ar atzariem un to atzaru sadalītāj(slēdzi kas pieslēgs vajadzīgo līniju) Loģiku ( MUX) kuru vadīs State machine(SM) principā sanāk kad pate SM vienkārši sūtīs signālu uz datu līnīju dalītājiem un citus aktivizācijas signālus, lai vadītu Datus pa tām vietām pa kurām vaig  ::  
pagaidām dati plūdīs Ram atmiņā no 3 vietām(datu līnijām:
taimeris = RAM
 Saskaitītāja/atņēmēja Rezultāta izeja = RAM
Avalon Datu līnija = RAM

un ārā no RAM informācija ies uz:
Saskaitītāja/atņēmēja A ieju 
Saskaitītāja/atņēmēja B ieju 
Un Avalon datu līniju 

kā redzams tad pašā SM nekādi dati neieies un sākumā viņa darbs būs Vadīt šo datu plūsmu caur Dalītāj slēdžiem

----------


## Mosfet

PWM ir 8 un 16 bitu variantā.
Epi labi ka tu kautko dari, bet būtībā tu esi iebraucis sviestā. Tu tagad- gribi ar divkodolu proci + Windows ... , iedezdzināt galda lampu, paiet pāris minūtes un lampa iedegās, vai nav labi , jo lampu ieslēdza NNN bitu procis ar GHz taktu, un to visu vadija windows pēdēja versija. Par liederības koificentu nav vērts runāt. To ko tu gribi var izdarīt daudz vienkāršāk. Ja tu mācētu izklāstīt domu bez............ un apsēstos uz zemes varbūt varētu palīdzēt.Ieteikums, bet tu jau neklasusīsis, uztaisi to savu koderi kāda simulatorā,( Multisim, Logic Works........) un sapratīsi ka tu piesmērē mikreni ar nevajadzīgām lietām. Viss dzīve ir vienkārši un lai neiznāk kā tai stāstiņā kad visa pasaule braukāja ar velosipēdiem slavenais izgudrotājs Otto Stulbēnius, dzīvodams niedrēs un pārtikdams no bruņurupuču gaļas vienā dienā izgudroja velosipēdu. Tāka tas viss sv......

Raimods1 Negribu neko sliktu sacīt bet  izlasi savas domas par zināšanām, vai tās nos ši sviesta var............... ceru ka neapvainojies.

----------


## Epis

jūs jau Lielie speciālisti esat pa visu savu mūžu izmēģinājuši visādas tehnoloģijas dažādas mikrenes un zinat vissu kas kā, bet es tad esu iesācējs un kamēr visu neizmēģināsu tikmēr arī neko nezināšu  kas ir viss labķais risinājums tākā tagat ir FPGA mikrenes Pētīsanas kārta un tad redzēs kas no tā visa sanāks  ::

----------


## Epis

Uzīmēju Autocadā shematisku zīmējumu kā izskatās tā mana ideja lai labāk var saprast kā tiek savienoti visi elementi RAM,ADD/SUB,Avalon,Speed reģistrs utt.. 

Protams shēma ir nepilnīga nav Mux slēdzamo singālu un citu sīku signālu 
Šodien saliku visus tos Slēdžus kopā ar Enkoder perifēriju un to pārtraukuma SM un sanāca kopā 183 LE + nāks klāt tā galvenā State machine kas to visu kontrollēs un slēgs tos slēdžus bet es domāju kad vairāk par 100Le klāt nenāks.

šeit Failu Hirarhija kas arī attēlo kodu Bloku Hirarhiju  ::  

Kā redzams tad tā koda hirarhija jau ir tīri liela un tas pats arī ir ar Signālu daudzumu kas jau ir nenormāli liels un paliek grūtāk visu to savienot un atcerēties kurš signāls kam bīj domāts + tos signālus savienojot starp tiem failiem mainās arī viņu nosukumi (parasti jāizdomā jauni (varbūt var arī neko neizdomāt) un tad vairākos līmeņos nosaukumi mainās un vispār Putra kapitālā būs nopietni jāpiedomā Par Signālu apzīmējumiem lai vieglāk varētu Atcerēties un saprasti kam kas domāts.

----------


## M_J

Man ir jautājums Epim. Vai kaut kas no šeit aprakstītā jau ir izmēģināts un strādā uz reāla dzelža? Ja ne, tad pavelc svītru un pamēģini tomēr kaut ko no šitā norealizēt. Izrādīsies, ka daudz kas strādā citādāk, kā Tu iztēlojies. Var jau uzbūvēt baigo monstru, iepriekš nepārbaudot, kā strādā atsevišķas tā daļas, bet tā var būvēt otro, vai trešo līdzīgo projektu, kad viss jau ir puslīdz skaidrs. Ja šādi būvē pirmo projektu, tas neizbēgami nonāk miskastē, jo kad to monstru mēģina palaist, nekas nestrādā un nav pat idejas, kur tajā juceklī meklēt kļūdas, bet kļūdas ir visur. Nākas visu sākt no gala, tagad jau darba procesā rūpīgi pārbaudot katru risinājumu un pamazām audzējot klāt jaunas detaļas. Tā ir mana pieredze, bet Tu jau to neņemsi vērā. Katrs mācās tikai no savām kļudām. Lai veicas!

----------


## Epis

Es jau CNC topikā tač ieliku Bildi motors + optiskais enkoderis un Fpga plate viss smuki strādāja (mana paštaisītā enkoder perifērija, kuras Loģikas apjoms bija 189LE (vienam enkoderim) un es to perifēriju saslēdzu ar Nios II 32bit proci uzrakstīju procim kodu un viss gāja ar taksts frekvenci 50Mhz (pat bez digitālā filtra uz enkoder iejām) 
Un mans mērķis ir samazināt to Loģikas apjomu jo secināju kad tiek nelietderīgi izmantota Loģika (pārāk daudz Loģikas aiziet uz Avalon interfeisa atbalstu ap 120 LE katram enkoderim (tas ir padaudz un + realajā dzīvē man taču nevaig, lai enkodera Loģikas reaģēšanas ātrums būtu tās 80-120ns pilnīgi pietiktu ar to 1us līdz ar to šitas jaunais variants samazinās to Reakcijas laiku un ietaupīs Loģiku + es pie šitā pašas micromachine(State machine, minī procis)  pēctam vēl pievienošu klāt vēl 4 signāla dekoderus un ja snāks arī PWM ģenrātorus tā lai būtu viens mikro procis, kas veic šo MELNO darbu, apmēram tākā Texas instrument TMS470 procesora High end Taimeris, jeb Micromachine no kā es arī ņēmu IEDVESMU un IDEJu kad man a vaig tādu katko līdzīgu uzcept uz FPGA, lai ietaupītu un lietderīgāk izmantotu to Loģiku. 




> High-End Timer (HET) is a software-controlled timer with a dedicated specialized timer micromachine


 Izdomāju kad vaidzēs taisīt to Programm Counteri (PC) kas palielinās instrukcijas (RAM) adresi pa 1 domāju kad ar 6bitu adresi man pietiktu + vēl ideja izmēģināt Dual port RAM viens ports ir  Datiem un ptrs priekš instrukcijām kopā 2x16b iejas un 2x16b izejas kas laikam strādās neatkarīgi viena no otras bet tas vēl jāpapēta iesākumam pietiks ar vienkāršo variantu  ::

----------


## Raimonds1

Tas mans ieteikums par parastajām loģikām bija domāts tā, ka atrast, kas nestrādā paša liktā loģikas shēmā ar visviekāršākajām loģikas elementu sastāvdaļām ir vieglāk, nekā saprast, kāpēc nestrādā liela programmējama mikrene.

Čakars, kas rodas tādas shēmas liekot, palīdz izprast, kas tai ""tumšajai kastei"iekšā darās.  Tur ir visādas interesantas problēmas - kur pazuda takts impulss uz mikrenes 12, vai viņš nebija jāpadod caur NE, kāpēc reģistra mikrene nepadeva to, kas viņā bija uz izejām, kāda papildus loģika jāliek', lai atrisinātu problēmu uttutjpr Tas ir izziņas un mācīšānās dēļ, ne tam lai konkrētā State Machine uzlabotu.

Bet vispār es to, ko saka Epis, saprotu aizvien labāk .
Tās idejas rodas viena pēc otras un tā tehniskā realizācija arī pamazām sāk izdoties.

----------


## Mosfet

Epi
Beidzot ir ielikta kaut cik normāla bilde.Progress.
Cik  attceros tu gribēji taisīt stepperim lai  vīņs neizlaistu soļus mikrosoļu režīmā. Viens impuls motoram ir viens vai divi imp. enkoderim, tad kur tur ir 16 biti, ja tev jasalīdzina 1 vai 2 impulsi ar noraidīto stepperim?
Tev patīk likt bildes ieliec savu PWM.

----------


## Epis

> Viens impuls motoram ir viens vai divi imp. enkoderim, tad kur tur ir 16 biti, ja tev jasalīdzina 1 vai 2 impulsi ar noraidīto stepperim?
> Tev patīk likt bildes ieliec savu PWM.


 Sākšu ar to kad 16bitu datu līnijas man ir priekš Loģikas ietaupīšanas (varēju arī ņemt 8bitu,vai 32 bitu), bet visi dati kurus man būs tur jāapstrādā(jābīda) iekš šitās mikromašīnas būs 32biti (pagaidām moš vēlāk uzlikšu uz 24 vai 16 atkal, lai ietaupītu vēl vairāk Loģiku) un tie 32 datu biti tiek izmantoti 32bit taimera vērtību fiksēšanai jo es šeit mēru Laiku starp enkodera A,B signālu izmaiņām no 0uz1 un 1uz0 (faktiski tā ir impulsa platuma mērīšana ar ko es te nodarbojos var arī teikt ka tas ir kā Digitālais Osciloskops un tur arī ir tie 32 biti, kas apzīmē impulsa platuma laiku) un es te mēģinu to koda Loģiku samazināt uz Fpga iekšējās RAM atmiņas reiķina kurā var glabāt šitos visus parametrus (kā mikrenei Darba reģistri) ja kas optimizētie fpga procesori izmanto tieši šādu pieju kad visi reģistri glabājās iekš RAM līdz ar to ietaupās ļoti daudz Loģikas piemērs 32bit reģistrs =32 LE un kā es pirmstam reiķināju tad 1 enkoder dekoderim vaidzēja: 
1x 32bit Reģistru  
1x 32bit taimeri 
1x 32bit up/down counteri 
1x avalon Datu maģistrāles interfeis ar 3 Read un 2write reģistriem, 
un pareizinam šito visu ar 4(priekš 4 enkoderiem) 
sanāk 
4x 32bit Reģistru  
4x 32bit taimeri 
4x 32bit up/down counteri 
4x avalon Datu maģistrāles interfeis ar 3 Read un 2write reģistriem, 

Bet manā šitajā mikromašīnas variantā man vaidzēs:
1x 32bit Taimeris 
1x 32bit Reģistrs (priekš taimera)
1x 16b ADD/SUB 52LE loģika 
1x 4Kbiti Ram atmiņa (kurā glabāsies visi citi Reģistri un cita info!)
1x un Čupa 16b SLĒdŽU 
2x State machine (viens jau gatavs otrs taisās  ::   )

Te arī tā Loģikas izmantojamības efektivitāte, kad es izmantošu vienu Taimeri un vienu Taimera reģistru priekš visiem enkoderiem nevis katram savējo un vienu RAM atkal priekš visas informācijas glabāšanas  ::  
To pašu es arī gribu izdarīt ar PWM ģenerātor bloku pievienot viņu pie šitās pašas mikromašīnas, lai izmanto šito pašu 32bit taimeri (+ papildus 32bit compare Reģistrs) un + Step signāla dekoderus (tas pats kad enkodera dekoders tikai vēl vienkāršāks!) 
kopā ja sanāks tad šitā mikromašīna apstrādās 12 singālus !! 

Es jau šodien sāku to mikromašīnu veidot un vis grūtākais ir tos signālus sakodēt tā lai kad notiek Ierakstīšana ram atmiņā tie signāli būtu savā vietā (write_enable, Write_adress, Write_data). Varbū tik grūti viņus pielīdzīnāt jo es izmanto testēšanai  180Mhz pūlksteni (gandrīzm max RAM ātrums, Loģika pate iet daudz ātrāk), būs jāpamēģina 50Mhz moš tie signāli paši ieies rāmjos vai arī jāizmanto vēlviens pūlkstens avots 50Mhz priekš RAM,  (gribās jau izspies vissu ko var no tās Fgpa  ::  )

----------


## Raimonds1

> Viens impuls motoram ir viens vai divi imp. enkoderim, tad kur tur ir 16 biti, ja tev jasalīdzina 1 vai 2 impulsi ar noraidīto stepperim?
> Tev patīk likt bildes ieliec savu PWM.
> 
> 
>  
> Te arī tā Loģikas izmantojamības efektivitāte, kad es izmantošu vienu Taimeri un vienu Taimera reģistru priekš visiem enkoderiem nevis katram savējo un vienu RAM atkal priekš visas informācijas glabāšanas  
> To pašu es arī gribu izdarīt ar PWM ģenerātor bloku pievienot viņu pie šitās pašas mikromašīnas, lai izmanto šito pašu 32bit taimeri (+ papildus 32bit compare Reģistrs) un + Step signāla dekoderus (tas pats kad enkodera dekoders tikai vēl vienkāršāks!) 
> kopā ja sanāks tad šitā mikromašīna apstrādās 12 singālus !! 
> 
> Es jau šodien sāku to mikromašīnu veidot un vis grūtākais ir tos signālus sakodēt tā lai kad notiek Ierakstīšana ram atmiņā tie signāli būtu savā vietā (write_enable, Write_adress, Write_data). Varbū tik grūti viņus pielīdzīnāt jo es izmanto testēšanai  180Mhz pūlksteni (gandrīzm max RAM ātrums, Loģika pate iet daudz ātrāk), būs jāpamēģina 50Mhz moš tie signāli paši ieies rāmjos vai arī jāizmanto vēlviens pūlkstens avots 50Mhz priekš RAM,  (gribās jau izspies vissu ko var no tās Fgpa  )


 Būtu labi tās laika diagrammas redzēt - kas uz kuras izejas/ieejas ?
Kas tad pasaka tai mašīnai, ka atļaut rakstīt, kad rakstīto nolasīt un kad dzēst un kad atkal rakstīt?
Vai tad takts frekvencei vai atļaujošiem impulsien nav OBLIGĀTI  jānāk no viena avota, kur katram impulsam, tā platumam, sākšanās un beigšanās laikam jābūt stingri noteiiktam un saskanīgam ar vienu takts frekvenci?

----------


## Mosfet

Kāpec mērīt laiku starp impulsiem???????????????
Nav taču servoregulācija DC motoram, stepperis strāda pie max griezes momenta, tātad soli atstrādās noteiktā laika vienībā.Tev svarīgi vai stepperis ir izdarijis soli vai nē nevis cik ilgi to veicis.
Izmantojot MAX3000 pietiek ar 4MHZ (lēts kvarcs) takta frekvenci. 33 LE priekš 4 decoderiem ieskaitot virziena decodēšanu. Stepperim mikrosolis max 1/8
900 apgr/min.

 Vai būs tava PWM bilde ?

----------


## Epis

> Izmantojot MAX3000 pietiek ar 4MHZ (lēts kvarcs) takta frekvenci. 33 LE priekš 4 decoderiem ieskaitot virziena decodēšanu


 nevaru iedomāties kā tik maz Loģikas var sanākt priekš 4 quadratūrajiem dekoderiem + virziens man jaunais Quadratūrais dekoderis ar 4X izšķirtspēju vienam enkoderim aizņem 10LE (katrs kanāls pa 5Le) un šitas ir mans jaunais uzlabotais variants (pirmstam 1 kanālam vaidzēja 7Le un + 4 pūlkstens ciklus kamēr bij rezūltāts (izmantoju State machine viņam), bet šitas jaunais izmanto pilnīgi citu principu un bez State machine līdz ar to reakcijas ātrums ir 1 pulkstens cikls (nākošajā ir rezultāts) Rezultātā dekoderis izlaiž vienu pūlkstens impulsu, kas signalizē par enkodera kustību par 1 vienību. 
man liekas kad tavs dekoders dod ārā pavisam citu rezultātu nekā manējais.
šeit  bildĒ dekodera izeja ir AOUT un tas ir tas Rezūltāts  ::  ko dekoderis ģenerē!
http://www.cnczone.com/forums/attachmen ... 1165340487
bildi no šitā linka nerādīja tāpēc ieliku linku tur arī ir bilde!

Nu saprast visu to procesu lasot noteikti kad ir grūti pēc shēmas tas ir daudz vienkāršāk vēlāk to shēmu domāju papildinat un pielabot (ar Mux slēdzu signāliem un citiem).
Visi tie slēdžu signāli nāks no galvenās mikromašīnas un mikromašīnā adreses singāls, pārtraukuma singāls,un taimera singāls ienāk dazādos perjodos atšīība pāris pūlkstens cikli un tad viņi visi jāsalāgot līdz tai vietai kad viņi ie iet RAM atmiņā un piemēram Adreses signāls var uzreiz iet pa taisno uz RAM atmiņu(laigan adresei vaidzēs programm counteri un Pāris slēdžus lai adresi vare'tu ielādēt no RAM), tāp at ar pārējie kā taimera 32bit signālu jālaiž caur 2 datu līnijas slēdžiem kur to slēdzus jāieslēdz ar attiecīgo signālu un tā tālāk. principā no kautkāda signālu attēla tagat jēga nebūtu nekāda! kad uztaisīū strādājošu modeli tad arī ielikšu kādu bildi.

Es gribu Steperi vadīt pēc servo motoru principiem ieskaitot PID. 
Tas PWM ir primitīvs viens Taimeris +compare reģistrs un kad compare sakrīt ar taimeri taimeris nonullējās un skaita atkal līdz compare (tā visu laiku pa apli) priekš īsta PWM jau vaidzētu 2 compare reģistrus, bet vēlāk redzēs pēc vajadzības pielikšu, vai arī iekš mikromašīnas uztaisīšu to otru compare reģistru.

----------


## Mosfet

Bildi nevaru redzēt laikam jāreģistrējas, baigi negribas.
stepperi parverst par servo ir ļoti gruti izdarīt tikai daudzfāžu stepperiun tad tāds prast iznāk. Katrs dara savu

Max 3000 ar 33 elementiem: ir tāda  lieta ka multipleksors un vairāki un 1 koderis kam pieslēgti 4 enkoderi.

Viņš ģenerē papildus impulsus stepperim ja tie ir neizdarīti, aptur datu plūsmu no kontroliera ši impulsa laika, un vēl šo to  labu dara.

PWM sapratu tāds pats ka Pikos un atmeļos. sarežģīts. Vai vērts kopēt?

----------


## Epis

Laikam tapēc to bildi arī nerādija kad ieliku img tagā es tagat viņu ieliku inboxā šeit ir tā bilde tur ir tie 4 pūlktens cikli kamēr bijušais quadratūrais dekoderis to signālu dekodē un ģenerē AOUT rzultātu  ::  jaunais ģenerē rezūltātu nākošajā pūlkstens ciklā un aizņem 5LE.


Cik tad daudz loģikas var ietaupīt ar to multiplexeri? 
Man liekas kad manā gadījumā kad man sanāk 4 enkoder dekoderi 40LE (bez virziena) es neko daudz ietaupīt nevarēšu  ::  un pat ja ietaupu 50% 20Le tad man liekās kad tas ir par maz lai sāktu kautko domāt tajā virzienā un šitas kods ko tagat taisu man ietaupīs vairākus 100 Loģikas ja ne visus 1000LE beigās kad saslēgšu vissus signālus pie mikromašīnas Pavisam cits Loģikas apjoms un tad ir vērts padomāt, bet 20Le ir pa maz lai motivētu  :: , jo es jau vienreiz optimizējo no tiem 7Le un 4clock un tad es dabūju 4X ātrāk un 2Le mazāk (4x ātruma uzlabojums ir ievērjoams panākums).
jo man FPGA lģika ir virs 8000 LE (lielajā virs 17 000) un 20Le ir pilines jūrā bet 1000 jau ir nopietns aPpjoms ar kuru jāreiķinās, priekš Mazām CPLD ir svādāk tur patrs Le ir nopietns arguments, lai ietpītu.



> PWM sapratu tāds pats ka Pikos un atmeļos. sarežģīts. Vai vērts kopēt?


 Ar tiem Gatavajiem Taimera un PWM IP-Core ir tā kad viņi ir baigi lielie un aizņem daudz Loģikas (+ visādas papildus fičas kas reāli plikam PWM ģenerētajam nav vajadzīgas tadēļ pašam savējais ir daudz labāks + mazāks pēc Loģikas apjoma un ja es viņu dabūšu iekš  mikromašīnas tad vispār būs labi  ::

----------


## Epis

Nu beidzot sataisīju pirmo koda gabalu kas Stabili ieraksta Ram atmiņā 32bit Ātrumu un kā solīju tad šeti bilde (es tur savilku līnijas lai vare redzēt kā dati plūst un nokurienes viņi ņemās un tur arī ir tie SLĒDži kas slēdz tos Datu līniju Dalītājus MUX, un tur arī var redzēt kā es no RAM atmiņas nolasu ierakstītos Datus vienīgi Visi dati man raktās vienā RAM adresē 72 jo nav tas adrešu palielinātājs (programm Counteris) uzcepts bet to vēlāk. 

Tagat pa pašu procesu tad sākās viss ar Encoker signālu 1 tad viņu dekodē un rezūltāts ir Step_T ("T"->Test signāls) Tālāk iedarbinās mana pirmā SM kas dekodē kurš no enkoderiem iedarbojās un rezūltātā SM izdod E_IRQ_Adress_T kas arī ir Ram adrese kurā tiks saglbāts Ātrums un 
Taimer_R_T ir enkodera taimera Reģistrs kurā saglabājās tā taimera vērtība pie kuras signāls parādījās un tad to 32bit taimeri tad arī dalīs uz 2x 16b reģistriem kas tālāk ies caur 2x MUX +1Reģistrs un tad RAM atmiņā .
un singāli kas slēdz MUX iejas ir Taimer_mux_SWITCH_T slēdz pirmo MUX kas sadala 32bit taimera vērtību 2vos 16bit (HI un LO) bitos (ja Taimer_mux_SWITCH_T = 0 tad slēdz Lo ja 1 tad HI),  tālāk
nāk Taimer_RAM_mux_switch, kas ir pēdējais slēdzis pirms signāls ieies RAm atmiņā un kāredzams slēdzis ir aktīvs kad ir 1 un pēc tam lai tiktu Dati nostabilizēti izmantoju parasto Reģistru jo es mēģināju bez reģistra un man nekas nesanāca dati RAmā nerakstījās bet ar reģistru viss notiek  ::  reģistram nekādus slēdžus nevaig viņš darbojās visu laiku uz Rising clock edge. 
Tas arī viss  :: , 
Lai šito dabūtu gatavu izmēģināju veselu kaudzi ar visādiem variantiem + Mux slēdzu signāliem liku vairākus delay(aiztures) reģistrus lai viņu ieslēgšanās laiks būtu īstajā vietā  ::  
Tālāk jau viss pārējais kods aizies daudz vieglāk tas pašā sākumā ir tas lielais čakars kamēr neko vēl īsti nemāk.
Superīgi tas kad vissu dekodēšanas process aizņem 50ns (līdz ātrums tiek saglabāts RAM atmiņā Tas dod cerības kad beigās mana mikromašīna strādāsbaigi ātri  ::  (ceru iekļautiem 1 Mhz)

----------


## Epis

Šodien uztaisīju to PC(programm Counteri) vai arī Adrešu palielinātāju pa 1 +pārveidoju bišķi tos MUX slēdžus tagat viss astrādā ātrāk un aizņem mazāk Loģikas (es papētīju Tos Mux un cik viņi Loģikas aizņēma un izvēējos Labāko šeti bilde jaunajam variantam (MUX + ievilku arī pāris SM signālus) vēl domāju izmantot papildus RAm read portu (būs 3 portu RAMs viens Write ports un 2 read porti) Es tagat domāju kā tos datus lai Optimālāk bīda un kādā secībā, un arī par to datus apmaiņas processu jo skaidrs ir viens kad lai kādu informāciju nolasītu no Ram vajadzīga tās adresi. 
man ir tāda sajūta kad es beigās nonākšu pie tā procesora veidošanas un vaidzēs RAM atminā nelielu kodu iegrūst lai tā mikromašīna tad pēc viņa strādātu (un tur arī būtu tās nākošās Atmiņas Adreses, jo ir grūi tikai ar vienu PC(Programm Counteri) ģenerēt tās visas vajadzīgās adreses, jo gribās izmantot to iespēju kad var no ram nolasīt uzreiz 2 16b, vērtības kas būtu ideāli priekš Datu sūtīšanas Nios II procesoram caur Avalon datu līniju 32bitu varētu uzreiz aizsūtīt  :: 



Zaļās līnijas parādā kā darbojās Programm Counteris(PC) ģenerējot nākošo adresi (+1) īstanībā īstā procesorā PC ģenerē adresi nākošai instrukcijai un es domāju tagat uztaisīt nelielu viltību lai viņš varētu ģenerēt uzreiz 2 adreses(vienai būs papildus bits klāt kā 1 kas nekad nemainīsies un tad snāk divi cipari un viens no viņiem būs par 1 bitu lielāks  ::  līdz ar to sanāk 2 adreses viena programmas nolasīšanai otra datu glabāšanai, vai no šitā kautkas sanāk to rādīs laiks  :: 

Man liekas kad ir pazudušas pāris iepriekšējās atbildes!

----------


## Epis

Šodien pamēģināju uztaisīt primo Procesoru pēc vienas pamācības 16bit datu līnija ar 4 instrukcijām ADD,STORE,LOAD,JUMP un instrukcijas izskatās tā 15-8bits -> Opcods (instrukcijas kods) un 7-0-> Adrese. 
Lai šito procesoru palaistu nācās bišķi pasvīst jo viņš bīj rakstīts priekš Citas FPGA (FLEX10K) un viņai laikam bīj cita tipa RAM atmiņa jo sākumā man nekas negāja tad saprastu kad jāpieliek laika aizture attēlā es to aizturi attēloju ar +1 zīmi un tad viss iedarbojās. pēc tā parauga uzrakstīju mazu ASM kodu ( A=B+C jeb 5+3=8 ) kuru ierakstīju RAM atmiņā pirms simulācijas un tad procis visu apreiķināja un rezūltātu ierakstīja ramā  ::  
S = Galvenā procesora STate machine un tur var redzēt instrukcijas kādas procis liek pildīt. 
mīnus tāds šim procim kad viņš ir īsts bremze ! lai izpildītu vienu instrukiju viņam vaig 5-7 pūlkstens ciklus, tas bremzīgums saistīts ar to RAM atmiņas ātrumu (tur ir 1 porta Ram atmiņa (single PORT), bet procesors aizņem reāli maz Loģikas tikai 68 LE  ::  (praktiski necik!), protams viņa izpildāmo instrukciju daudzums arī ir niecīgs 4 instrukcijas  ::  bet man pašlaik vairāk nevaig (vēl "-" vaig) 
Lai uztaisītu ātrāk ejošu proci domāju uzmantot 3 Portu RAM (nolasīt varēs uzreiz 2 Ram adreses, bet tur viss būs daudz sarezģitāk un nez vai vispār sanāks!

----------


## Raimonds1

Ko šis praksē varētu izdarīt ar soļiniekiem, citiem izpildmehānismiem?

----------


## Epis

> Ko šis praksē varētu izdarīt ar soļiniekiem, citiem izpildmehānismiem?


 Ta piemērs ir tāds nenormāli primitīvs kas parāda procesora pamat darbību un pats procesora kods ir ļoti mazs pamācībā kods bija tikai uz 2 lapām.

Viņš varētū Reāli apkalpot citas perifērijas kā tie PWM, enkoder dekoderi PID LOģiku un tā tālāk. jo priekš lielākiem darbiem instrukciju noteikti ir par maz.  
un to darbības ātrumu varētu palielāt izmantojot pilnvērtībāk to RAM atmiņu (paņemot 2 portu RAM vai 3portu(es tagat taisu ar šito)).

----------


## Raimonds1

Interesanti ir tas, ka daudzām tehniskām ierīcēm pat tik daudz nevajag. Ir firma, kas ražo visādus mēģeņu kratītājus, centrifūgas, sildītājus analīžu laboratorijām, tur vispār ir tikai kāds 10 darbības veicamas.  Tas pats attiecas uz apkures automatizāciju un enerģijas rekuperāciju.

CNC mašīnu grafiskais variants, ka tāds, kurš neprot programmēt, saliek stabiņus vai saraksta milimetrus un viss notiek. Tajā skaitā ar 3 dimensiju dažādiem virzienu maiņām utt.

----------


## Epis

Pārsvarā jau visa lielākā daļa elekto ierīces ir ļoti primitīvas kurām pietiek ar mazu lētu 8-16-32bit procesoru un izdevīgāk ir panemt lēto proci nekā veidot to programmu uz Loģikas (74xx vai arī programmējamās Loģikas), bet programējamā Loģika ir laba tad ja pats īsti nezin ko grib! un vaig paeksperimentēt jo es uz  PL skatos kā uz platformu kur var realizēt visas trakās idejas kādas vien ienāk prātā (sākot ar primitāvā Loģikām (enkder dekoderis) beidzot ar savu Optimizēto speciāli pielāgoto mikromašīnu).

Tagat man sanāk tā kad tā mikromašīnas pirmās darbības būs cieti iekodētas(logikā) tas ir uzreiz saglabās Taimera 32bit informāciju Ramā un pēctam pērējās darbības ietu pēc programmas kā tam mazajam procim, bet to mazo proci negribās ņemt viņš ir baigi bremzīgs vaig kautko ātrāku! un tagat domāju kā tās darbības lai paātrina laikam būs jātaisa savas speciālās instrukcijas kā 32bitu atņemšana un saskaitīšana (ar 16bitu ALU) un protams gribās lai tās darbības notiktu pēc iespējas ātrāk (no ram tiktu nolasīti Dati nepārtraukti(bez aizstures un arī tiktu irakstīts nepārtraukti) un tas būtu kautkas līdzīgs procim ar Pipline ( 1 instrukcija 1 pūlkstens ciklā, (nevis kā tagat no5-7cikliem)). 
Un lai tas procis skrietu ar max Ram ātrumu 192Mhz  ::  => 192MIPS (vismaz iekš simulātora) 
Diez vai izdosies sasniegt tos 192MIPS bet pamēģināt vaig  ::

----------


## Epis

Vakar itkā uzliku procim pāris instrukcijas (tā lai pārbaudītu vai State machinas Reset,Fetch, decode, ADD un tā tālāk instrukcijas strādā (vai pate State machine ieiet tajos ciklos) un konstatēju kad uz ADD isntrukciju viņa nelec  ::  pēc Decode iet uz Fetch un tā pa apli) un sākās kārtējais čakars domāju kur problēma ņēmu kā paraugu to mazo proci un skatījos konstatēju kad mazajam procim kodā Reset stāvoklis instrukcija nemaz nestrādā un tad arī konsttēju kad procesors sāk darbu uzreiz pēc pirmā Pūlkstens cikla, bet es gribēju lai viņš sāk strādāt tad kad viņam ir darbs nevis pa tukšo skrien un vienīgais veids kā to varēju panākt bīj uzlikt procesors Clock signālam Enable signālu, kas ieslēdz pūlkstens signālu un izslēdz līdz ar to ja procesoram nav pūlkstens tad arī viņš protams nevar tīri fiziski strādāt  ::  un ja viņš nestrādā tad arī netiek patērēta nekāda enerģija (vienīgi tā statistiskā enerģija ko vaig lai uzturētu Fpga Loģiku pie dzīvības, bet Flash fpga gadījumā nekas netiktu patērēts) pēc tam atkal ķēros klāt pie lielā proča un atkal kārtējā cīņa ar Erroriem un nācās visu State machine sākumu (jeb palaišanās kodu pārtaisīt) un izveidot papildus stāvokli -> CPU_start, kas seko Reset stāvoklim un tad tajā Cpu start iegrūdu visu to starta cieti sakodēto Logikas gabalu(komandas) un pectam Fetch instrukcijā tā cietā Loģika seko, bet tikai pirmajā Fetch instrukcijā viņa tiek izpildīta tālāk viss notiek pēc koda kāds ir salikts RAm atmiņā + veicu vēl vienu nelielu uzlabojumu lai samazinātu kodu un vieglāk būtu viņā ojentētie izveidoju Delay apakš kodu ar izvēles iespējām pagarināt aizturi pa 1,2,3 pūlkstens cikliem,jo man tur vaig kādās 5 vietās veidot to aizturi un katru reizi rakstīt savu kodu tai aizturei veidojās baigi garais kods un tagat ar vienkāršu instrukciju: 

RAM_Delay_2_clock : Delay
Port MAP (clock=>clock, a=> enable, a_D=> enable_delay_2); 

es varu uztaisīt enable signālam 2 pūlkstens ciklu aizturi  ::  un rezūtā'ts ir enable_delay_2 signāls kas seko pēc 2 ūlkstens cikliem un ir tāds pats kā bāzes signāls delay  :: 
 šitie ir tie mazie kodēšanas knifi ar kuriem to milzīgo kodu var saskaldīt mazākos gabaliņos un veidot pārskatāmāku mazāku kodu

----------


## GuntisK

> Pārsvarā jau visa lielākā daļa elekto ierīces ir ļoti primitīvas kurām pietiek ar mazu lētu 8-16-32bit procesoru un izdevīgāk ir panemt lēto proci nekā veidot to programmu uz Loģikas (74xx vai arī programmējamās Loģikas),


 Nesen uz mājām atstiepu rūpnieciskas CNC virpas vadības bloka atliekas.  ::  Redzētu cik tur ir tās "smalkās" loģikas -neviena kontroliera, tikai K155XX sērija.  ::  Visi savienojumi veikti ar wire wrappingu,vadu vesela kaudze.  ::   ::   ::  Un programmēšana notika ar klaviatūras palīdzību-kaut kāds krievu G-code analogs laikam...
Trūkumu protams daudz: cik man stāstīja tie kas ar tām virpām strādāja, tad programmas diezgan bieži gļukoja:tikko paliek silts tā visa sistēma uzkarās.  ::

----------


## Epis

Jā Intresanti kā agrāk tie elektroniķi uz Loģikām procesorus veidoja noteikti kad tā pat kā es tikai pēc tam to visu Lodēja kopā  ::  

Šodien riktīgi nochakarējos un beigās vispār nekas vairs negāja un tad domāju, domāju un izodmāju kad šitas variants nav neko labs un tiek izdarīta lieka darbība (sākotnējā Taimera vērtības saglabāšana RAM atmiņā) tagat es to taimera vērtību pa taisno bīdīšu ALU(Aritmetic Logic unite) un tur atņemšu(-) no viņas veco taimera vērtību un rezūtlātu RAmā, pēc tam caur to pašu ALU to vērtību izbīdīsu cauri (saskaitot ar 0) un rezūtlātu saglabāšu Ramā (vecā taimera vērtība priekš nākošās atņemšanas) un tā būs daudz vienkāršāk un arī ātrāk. 

Vispār šitas procesors būs ta'ds baigais hibrīds kas domāts priekš 32bit datu apstrādes bet kuram ir 16bit datu līnijas un 16bit instrukcijas platums un arī 16bit ALU, kad procis būs gatavs un izpētīšu cik ātri viņš tad var pavilkt tam ir ideja pamēģināt viņu vēl vairāk samazināt. teorētiski to var izdarīt nesamazinot apstrādes ātrumu, Palielinot paša procesora pūlkstens frekvenci līdz 300Mhz un tad Ram frekvence būtu 150Mhz bet enkodera 50 vai 1Mhz un 
Ideja ir tāda kad varētu izmantot 8bit datu līnijas un arī 8bit ALU +pārējie reģistri arī būtu 8bitu + MUX arī 8bitu un šo daļu reiķina varētu ietaupīt, bet pašas Ram atmiņa būs 16bit un tad tos 16 bit sadalam uz 2 un laižam iekš ALU pēc kārtas un ja būs 2X augstāka pūlkstens frekvence tad reāli nekas no tā nemainīsies tiks izdarīts tik pat daudz cik iepriekš ar 16bit datu līniju platumu. 
Tad varētu teikt kad procesors ir Pilnīgs Hibrīds kad domāts 32bitiem bet ar 16bit RAM, 16b instrukcijām, un 8bit ALU un citām līnijām  ::

----------


## Raimonds1

kā praksē varētu izskatīties state machine, ja to ieliktu tam līnijas  robotam , skat tēmu - robots seko līnijai
50 mikrosekundēs tas jādabū iekšā  un jāapstrādā

000000 000010 000100 000110 001000 001010 001100 001110 
010000 010010 010100 010110 011000 011010 011100 011110 
100000 100010 100100 100110 101000 101010 101100 101110 
110000 110010 110100 110110 111000 111010 111100 111110

jāatpazīst līnija taisna, uz stūra, līka, izmaiņas pēc kustības 
taisna būs gan 000001 010011 100101 110111, gan 001011 011011 101011 111011

līka būs, piemēram 001111 011101 101011 111101 vai
000001 000011 010101 100101 110011

1- sensors redz melnu 0- sensors redz baltu

----------


## Epis

Raimond1 tava ideja ir skaidra par tiem sensoriem un State machine kas detektētu kādas izmaiņas tajos 32 sensoros varētu uztaisīt mierīgi (pēc tā paša principa kāds ir mans Pārtraukuma vekotra State machine kas visu laiku pārbauda vai kāds no Enkoderiem nav izlaidis jaunu signālu un tad nosūta attiecīgo adresi tālāk) bet tas ir viens no posmies tā izmaiņu detektēšana no 32 avotiem tālāk jau ir jādomā ko ar to informāciju darīt ! un kādu rezūltātu mēs no viņas gribam (leņķi, laika intervālu starp sensoru izmaiņām, vai arī kādu citu koeficentu) laika intervālu starp izmaiņām var mierīgi uztaisīt atkal dublējot jau gatavo manu nekoder kodu (ar taimeri vienīgi šeit lai taimeris skaita laiku līdz izmaiņas brīdim unt ad nonullējās un atkal skaita laiku no nulles līdz nākošam brīdim) un par to Lenķ tad noteikti kad vaig programmā ielikt (atmiņā RAMā vai reģistros) kādām kombinācijām atbilst kāds leņķis apmeŗam tā: 
rinda0   Rinda1
000000 000011: Līnija0 
010001 010010: Līnija 1 Būs lenķis +30 grādi

rinda 7  Rinda8
001101 001110: Līnija 0
011100 011111:  Līnija1 būs lenķis -30 grādi

un citas kobinācijas kur pa diognāli -> (rinda(n), līnija(n)) salīdzinam ar rindu(n+1(vai-1)) un līniju(n+1) notiek kādas izmaiņas tad būstas lenķis 30 ja izmaiņas notiek plašākā lokā +2rindas tad attiecīgi lenķis 2X lielāks 60grādi un ja izmaiņas ir šaurākā lokā kā Rinda +1 bet līnija +2 tad lenķis  tikai 15 grādi un ja vēl šaurāk rinda +1 līnija +3 tad tikai 7,5 grādi. 

nu kā ir ideja pareiza ??

Vakar gandrīz visu dienu dienu nochakarējos ar to ALU atņemšanas darbību pētīju kas ir ar tiem Cary bitiem (cary in un cary Out) un atcerējos kad lai nav tik vienkārši atņemt 32bitus no 32 ar 16 bitu atņēmēju tā atņemšanas operācija ir šāda 
Sākam ar Lo 16 bitu atņemšanu (A16Lo-B16Lo=Clo ja tad ir Cary (karogs tad seko šada darbība kad A16Hi -1 jāsamazina hi bits no tiek atņemta vērtība un tālāk A16hi-B16Hi=Chi iegūstam rezultātu Chi,Clo(32 bitus) 
Ā ja cary pēc primās darbības nav tad turpinam izlaižam nākošo un pārejam uz pēdējo A16hi-B16hi=Chi, 
Un ir vēlviena lieta ja pēdējā darbībā parādās cary karogs tad tas nozīmē kad skaitlis no kura atņemam A ir mazāks par atņemamo skaitli B apmeŗam šādi 6-8=-2 un rzūltāts binārajā būs baigi liels (jo manai Loģikai nav - zīmes tākā būs FFFFFFFD(hex.) un tas man neder man vaig 00000002 (hex.) līdz ar to nāksies vēlreiz to rezultātu atņemt bet tagat būs tā 0-Clo=Clo(īstais) , 0-Chi=Chi īstais tākā principā garākaj'variantā sanāk jāveic 5 operācijas lai iegūtu pozītīvu vērtību  ::  (īsākajā tikai 2) 
Pagaidām es īstanībā nezinu vai vispār izdosies ietaupīt Loģiku izmantojot to 16 bit ALU(~52Le) 32bit ALU(~102Le) vietā starbība ir liela ~50LE, vārdsakot būs jāskatās. 

Vakar lasīju Presē jaunumus un xilinx izlaida jaunu Extreme DSP fpga sēriju kurai parasto 18x18multiplier bloku vietā būs advancēti DSP bloki 
Sēit bilde no xilinx spartan3A DSP mikrenes DSP48A Slice shēma Tas ir tas kas tur atrodās un bloka funkcionalitāte ir nenormāli leila (jau izlasīju visu pamācību) man vaidzētu tādu 1 bociņu priekš sava State machine  :: 
Būtu labi ja viņi vēlāk izlaistu to Spartas 3Adsp mikreni ar mazāk resursies piemēram kādiem 8 DSP48A blokiem un 4000 Loģikām (man pietiktu  ::  (nevis kā tagat mazākai mikrenei  XC3SD1800A ir 84 DSP48A un 33,280 LUTs (tas ir pa daudz !) jāpiemin kad šitai  ir 21,250 GMACS un lielajai spartan 3A DSP 30 GMACS) 
Tas tā nelies tehnoloģskais Fpga mikreņu pavērsiens un DSP mikreņu tirgus iekarošana.  ::

----------


## Raimonds1

ja atņemot sanāk negatīvs rezultāts un ar tā apstrādi, glabāšanu utt ir problēmas, tad pirms matemātiskās atņemšanas jāizdara salīdzinašana un ja gaidāms negatīvs rezultāts, tad jāatņem nevis 2-ais skaitlis no pirmā bet gan otrādi un tas maiņas fakts kaut kur jāieprogrammē - tāda doma

par to robotu - laikam visvienkāršāk būtu notiekt izmaiņas starp diviem mērīšanas faktiem - tātād -  bija 1 uz sensoriem, kas teica, ka līnija uz stūra, pakustējās notiektā virziena'(kods!!!), līnija pavirzījās uz vidu/uz malu - sekas motoram 1 platāks vai šaurāks impulss, vai abiem vienādi

----------


## Epis

Tev ideja ir pareiza bet, un es ari tā sākumā domāju kad vaig salīdzināt tos 2 skaitļus un tad turpināt bet  priekš atsevišķas salīdzināšanas ir nepieciešama Papildus Loģika tākā atsevišķu salīdzinātāju nav izdevīgi taisīt un tas pats ar to ciparu mainīšanu vietām A-b uz B-A jo tā maiņa prasīs kārtējo Lieko MUX(slēdzi) uz abiem kanāliem līdz ar to vaidzēs papildus 2x 2:1 MUX =32Le 
un atrisinājums ir izmantot to ALU priekš tās salīdzināšanas jo atņemot sākumā primos Lo bitus var jau redzēt pēc tā Cary bita un veicot pēdējo HI daļas atņemšanu ja tas AHI<BHI tad vaidzēs to rezūltātu apgriezt otrādies  0-C= C īstais vienīgi vai griezt abus Chi;Clo vai tikai Chi (laikam kad jāgriež būs abi un tad vaidzēs to rezūltātu barot ALU B iejā(jātaisa būs tiai 1 papildus MUX un laikam vaidzēs papildus Reģistru priekš (Clo vērtības sagābāšanas) 
būs jāmēģinā kautkā igrozīties. 

Pa to robotu tad es domāju kad visu to vadību uz Loģikas nav vērts taisīt vaig tikai to pašu ienākošo signālu priekšapstrādi uz Loģikas taisīt un tad barot iekšā kādā procesorā kur varētu to galveno programmu rakstīt jo tos 32 signālus bez Loģikas būtu reāli grūti apstrādāt jo parasti mazajām mikrenēm AVR,PIC nav tik daudz IO līniju un pats galvenais Pārtraukuma avotu kas būtu vektorizēti līdz ar to Loģikai ir liela priekšrocība bet tālākā signālu apstrāde (datu platums nebūs lielāks par 8 bitiem tad 8bit mikrene ir ideāls variants tālākai programmas veidošanai un tur vairs no Loģikas nekāds lielais labums nebūs. jo tās 40us reakcijas laiks ir pietiekami liels lai parastais PIC,avr tiktu ar programmu galā  :: , uz Loģikas varētu taisīt to procesu ja vaidzētu ātrumu 1-4us  (tas būtu normāls priekš Loģikas) bet priekš PIC,avr atkal pa ātru un viņas to nevāretu pacelt!

----------


## Raimonds1

vajadzētu izdomāt tos algoritmus un sākt to programmu tam robotam rakstīt  ::

----------


## Epis

pagaidām jau vēl nav īsti skaidrs kādus sensorus un ko izmantot (tas viss tā tikai idejas līmenī) un jaunākā ideja ir nopirkt Web kameru pa 10LS ar 640*480 30kadri sekundē USB pislēgums un tad taisīt uz štiās to līnijas filtrēšanu un tā tālāk ja varētu to USB protokolu atkost un dabūt pikseļu informāciju iekš mikrenes tad tālāk jau tos pikseļus apstrādāt kautkādīgies varētu un izfiltrēt jo ir vietas kur ir gatavi Logikas kodi, bet ja reāli tad šitā ideja ir baigi sarežģitā un pagaidām es nēsu tik liels profs ka varētu to realizēt un vaidzētu baigi daudz laika (ap puss gadu)  ::

----------


## Raimonds1

tāpēc vajag salikt 8 fotodiodes 8 rindās un fotooblektīvu un mēģināt ar to.
Foto filmas kadrs 24x36mm

----------


## Epis

Tākā tagat ir svētki tad es šito State machine domāju tālāk kodēt nākošnedēļ  :: 

pirms kautko uz tām fototranzistoriem taisu gribu pamēģināt vai vispār viņi strādā kā ir domāts (un kādu vienu gabalu nopirkt un tajā fotoaparātā ielikt un skatītes vai ivņš to līniju no atāluma uzķers vai nē! 

bišķi pa Fpga mikrenēm.
Es pirmstam ieliku to jauno xilinx spartan 3A DSP zīmejumu un teicu kad tas ir tāds baigais pavērsiens visā tehnikā izrādās kad tā ideja nav nekāda jaunā  pirms viņiem Lattice izlaida savu EPc2 fpga sēriju ar sysDSP bloku kuram ir šāda iekšēja shēma šeit bilde  :: 
 
un šeit arī ir reizinātājs pēc reizinātā saskaitītājs un atņēmējs un akumulātors(viss vienā) un tad vēlviens saskaitītājs un viss tas bloks skrien virs 350Mhz 
man šitai State machine vaidzētu tādu vienu bloku un tad varētu ietaupīt kādus 200-300 LUT vai pat vairāk jo tam sysDSP blokam ir pašam savi Reģistri (līdz ar to nevaig Loģikā veidot tos reģistrus) 
skatoties reāli tad man šitias lattice čips patīk labāk nekā jaunais xilinx spartan3ADSP jo viņiem piedāvājumā viss mazākā mikrene ir 
ECP2-6 kurai ir 
 6000 LUT loģikas un 
3 šādi sysDSP bloki (kopā 12 -18x18 reizinātāji) 

un  sitās mikrenes jau lakam ražo un vairumā tirgo (pagaidām mazumtirdziecībā nekur nav  ::  un slikti tas kad tai mazākajai mikrenei iepakojums ir BGA256 līdz ar to parasts hoby elektroniķis nevarēs to čipu pielodēt ja nu vienīgi uztaisa speciālu lodējamo krāsni. 

Notiekti kad nākotnē būs vairāk fpga mikrenes ar šiem DSP blokiem (un mazāk Loģiku jo to Loģiku nemaz tik daudz nevaig !!

----------


## Raimonds1

ko kura mikrenes daļa dara un ko ar to var izdarīt labak, nekā ar citām?

----------


## Epis

nupat apskatījos kas ir ar tām viss viss jaudīgājakām fpga un tur jau šitie uzlabotie dsp bloki multiply add sub, accumulate jau ir sen piemēram pirmajai Stratix fpga tādi bloki jau bīj iekšā vienīgi es tam nepievērsu nekādu uzmanību jo man tās dārgās fpga neintresēja, bet lētajām fpga šādu bonusu protams kad nebīj un tagat kad lētajās jau sāk likt iekšā tad es arī sāku skatītes kas tie par blokiem un kāda jēga no viņiem. Lētajām fpga līdz šim bīj tikai parasts reizinātājas iekš tā DSP bloka, bet tiem papildus add sub acumulate, vai arī fpga vispār bez tiem DSP blokiem tikai plika Loģika. 
šitās reizināšanas bloki ļoti ietupa loģiku jo lai ar Loģiku izveidotu šādus reizinātājus vaig baigi daudz loģikas un ātrums beigās arī būs mazs tāpēc cietā Loģika labāka.  ::  

bet ja vispār salīdzina šitos DSP blokus ar parastām mikrenēm tad atšķirība tāda kad parastās mikrenēs šie reizinātāji, saskaitītāji un citi ir pilnīgi iekš cietās loģikas (neko nevar mainīt un procesorā jau kā tādā neko nevar izmainīt viņš ir tāds kāds viņš ir un ja kautkas nepatīk (neaprmierina tad jāpērk cits) bet šiet to dsp bloku var izmantot un slēgt dažādš kombinācijās (arī vairākus dsp blokus var saslēgt kopā) un tā ir tā paralēlā procesēšana kad vienlaikus var notikt vairākas darības (parstajā procesorā vienlaikus tiek izpildīta tikai 1 intrukcija (ja ir pipline tad tik cik saiet tajā pipline), līdz ar to ar štiiem gataviem fpga DSP blokiem var veidot ātri šos DSP algoritmus  īpaši neiedziļinoties Loģikas līmenī  ::  
un par tām cenām tad līdz šim reāli onlineshopā nopērkamā lētākā fpga kurā ir šie funkcioālie DSP bloki maksā virs 215$ (stratix II lētākā mikrene) un xilinx ir tās virtex mikrenes, bet tās arī dārgās, tākā tas ir tik dargi kad nav pat jēga skatītes tajā virzienā, (man intresē mikrene kas nav dārgāka par 20$  un nāktonē viens no reālākajiem un ātrākajiem variantiem kā tikt pie tādas jau agstāka līmeņa mikrenes ir tā:
 Lattice ECP2-6 ar 6000 LUT loģikas un 3 šādi sysDSP bloki 
un mazuma cena cerams kad varētu būt zem tiem 30-20$ 
vispār sītās supertehnolōgījas paliek ar katru gadu lētākas tādēļ arī ir vērts šo programmējamo loģiku apgūt jo nākotnē cenas būs vēl zemākas un jauda vēl lielāka, un šajā mikreņu sekorā ir ļoti liels progress, daudz inovāciju (jaunu risinājumu (arhitektūru)) utt. 
Tākā šitā ir perspektīva tehnoloģija uz kuras bāzēt savas elektronikas intelektuālo daļu.

----------


## Epis

Turpinājums pa State machine ->

es vakar bišķi pakodēju un uztaisīju šitādu aritmētiku: 
A;B;C - 32bit cipari
AH [31..16]bitam   AL [15..0] bitam tā arī pārējiem 

pirmā darbība ir AL-BL=CL tālāk skatās cary bitu:
-- ja cary ir 1 tad 
Ah-1=Ah un 
Ah-Bh=Ch 
-- Ja cary ir 0 tad 
AH-Bh=Ch 
 tālāk netiku, bet ja pēc Ah-Bh=Ch cary bits būtu 1 tad vaidzētu izpildīt vēl šādu darbību 0-CL=CL un 0-CH=CH (apgriezt CL un CH bitus otrādies šito varētu izdarīt arī ar XOR funkciju salīdzinot bitu masku FFFF xor CL un FFFF xor CH piemēram ja CL <= "1111111111010101" tad pēc XOR būs  "0000000000101010" apgriezts skaitlis otrādies  :: 

es tagat izdomāju kad jāpaņem 32bit taimera vietā jāieliek 16bit taimeri (tas atbildīs vairāk realitātei) un nevaidzēs to nenormālo 32bit atņemšanu taisīt bet ja būs negatīvs rezultāts tad viņu vaidzēs pārveidot un + vaidzēs uztaisīt tādu speciālu overflow bitu kas norādītu uz to kad enkoderis nav kustējies ilgāk par ~64tūkstošiem impulsu tas ir kad taimeris būs noskaitījis līdz galam vienreiz un tad ja nokošreiz viņš noskaita un signāla nav no enkodera tas nozīmē kad zūd precizitāte un vairs nav iespējams laiku apreiķināt! (ja vien nepagarina 16 bitus uz 17 un vairāk līdz 32 bet negribās sarežģīt visu jo man jau tā sarežģitība apnika, tagat visu vienkāršosu   ::

----------


## Raimonds1

paskaidro sīkāk par carry un owerflow bitiem

----------


## Epis

Es te mēģināju uzrakstīt bet tad pats saputrojos un pameklēju google šeit labs links kā notiek binārā atņemšana un citas binārās darbības  :: 
http://courses.cs.vt.edu/~cs1104/Buildi ... s/TOC.html

tas cary bits norāda vai rezultāts ir pozitīvs vai negatīvs piemēram 7-5=0 cary ir 0(rezultāts pozitīvs) ja ir 7-9=-2 tad cary 1 (negatīvs) īstanībā es aizmirsu vai negatīvs bīj 1 vai 0 bet jebkurā gadījumā tas bits norāda to vai ir pozitīvs vai negatīvs.

overflow bits rodās tad kad taimeris skaita līdz (16bit taimeris skatia līdz FFFF hex.) un tad taimeris sāk atkal skaitīt no 0000 un tad arī ir tas owerflow bits kas itkā pasaka kad sākas skaitīšana no sākuma šito bitu var izmantot lai palielinātu taimera bitu daudzumu vienkārši ja ir overflow bits tad uzstādam counteri kas skaita tos overflow bitus un ja mums ir 16b owerflow counteris tad mēs dabūnam kopā 32bit taimeri  ::  
ceru ka viss skaidrs  ::

----------


## Raimonds1

[quote="Epis"] ***fpga ,  ****uzlabotie dsp bloki multiply add sub, ****accumulate Stratix fpga , fpga līdz šim bīj tikai parasts**** reizinātājas iekš tā DSP bloka, bet tiem papildus **** add sub acumulate, vai arī fpga vispār bez tiem DSP blokiem tikai plika Loģika. 
šitās reizināšanas bloki ļoti ietupa loģiku jo lai ar Loģiku izveidotu šādus reizinātājus vaig baigi daudz loģikas un ātrums beigās arī būs mazs tāpēc cietā Loģika labāka.  ::  

 bet šeit to dsp bloku var izmantot un slēgt dažādās kombinācijās (arī vairākus dsp blokus var saslēgt kopā) un tā ir tā paralēlā procesēšana kad vienlaikus var notikt vairākas darības (parstajā procesorā vienlaikus tiek izpildīta tikai 1 intrukcija (ja ir ****** pipline tad tik cik saiet tajā pipline), līdz ar to ar štiiem gataviem fpga DSP blokiem var veidot ātri šos *****DSP algoritmus  īpaši neiedziļinoties Loģikas līmenī  ::  

jā, to sapratu, tagad vēl tos terminus ar zvaigznītēm

----------


## Epis

šeit bilde no Lattice ECP2 fpga datasheeta kur var redzēt tā sysDSP bloka reizinātāju ātrumu un salīdzinājumu cik vaidzētu Lut(loģikas) lai veiktu to pašu darbību un arī loģikas ātums un var redzēt kad ieguvums ir nenomrāli leils salīdzinot ar loģiku citetais sysDSP bloks iet daudz ātrāk + nepatērē loģiku un japieliek klāt tās pārējās funkcijas  add(saskaitīšana) sub(atņemšana) tad tas ieguvums no šāda sysDSP bloka ir vēl lielāks  :: 


Par pipline tad šeit wikipēdījā ir aprasksts saistībā ar RISC procesoru arhitektūru 
http://en.wikipedia.org/wiki/Classic_RISC_pipeline
bet šeit iekš tiem DSP blokiem tiek lietoti šite Pipeline Registri un tos reģistrus var redzēt tajos attēlos un viņi ir starp tām aritmētiskajām opeācijām pildot datu glabātāja funkciju šeit no wikipēdijas vies citāts kas apraksta šo pipline reģistru:
"The Pipeline stages are independent from each other so they should be decoupled to prevent any interference between the stages. This is done by separating the pipeline stages from each other using the pipeline registers. At the end of each stage the results are stored back into this register and then the following stage works on what is inside this register. This decoupling allows for passing values between stages as there is no hard wire with the stage itself but rather with its result."

piemēram Atmegas procesoram ir 4 līmeņu dziļš pipline (datasheetā ir arī aprakstīts kā tās instrukcijas iet caur to piplinu )

----------


## Epis

Uztaisīju savu jauno 16bit proča varianta puss speciālo SUB (-) atņemšanas instrukciju) opkods 0001. pus instrukciju tādēļ kad viņa pagaidām atņemot A-B=C strādā kad rezultāts ir pozitīvs un tad to rezultātu saglabā RAM atmiņā , kā parastā - instrukcija, un otra instukcijas puse (palikusi no vecā varianta) kur ja rezultāts ir negatīvs vaidzēs rezultātu apgriezt otrādies un tad arī saglabāt atmiņā. 

un tagat intresantākais man nupat ienāca prātā tāda doma! 
Tākā man vaig šauri specializētas instrukcijas un katra instrukcija ir kā sava veida atsevišķa State machine tad skaidrs kad tiek patērēta papildus loģika un jo vairāk tādas specializētās instrukcijas jo vairāk loģikas aiziet un ideja kas ienāca prātā ir tāda kad varētu pameģināt uztaisīt pavisam cita tipa procesoru kuram instrukciju opkodu vietā būtu slēdzamo MUX,Reģistru aktivizācijas biti piemēram instrukcijas platums 32 biti un katrs bits ir pa taisno piesaistīts kādam no šiem procesora slēdžiem un nolasot instrukciju no ram tiek aktivizēti pa taisno šie slēdzi un šādi manipulējot ar šiem slēdžiem varētu viedot kādu instrukciju vien es gribu, līdz ar to priekš jaunas instrukcijas izveides man vairs nevaidzētu likt instrukciju klāt pie procesora kā loģiku, bet vienkārši iekodēt viņu Ram atmiņā un tad kad atmiņa tiks nolasīta tad arī visi procesi notiks  :: , vienīgi tad procesoram instrukcijas glabāt vaidzētu atsevišķā ram atmiņā (kopā būs 2 atmiņas viena datiem otra instrukcijām. 

es par šito aizdomājos tādēļ kad man jau tas procis aizņem kopā 235Le un izskatās kad tas apjoms vēl palielnāsies (liekot klāt papildus instrukcijas) un pastāv arī problēma ar to instrukciju pievienošanu jo pievienojot klāt jaunu instrukciju mainās kopējais loģikas ātrums un kad es simulātorā palaižu savu test kodu tad ir tā kad sāk rādītes brīnumu lietas (nekas vairs neiet), jo kādā no loģikām tas signāls iet jau lēnāk un viņu vienkārši vairs nevar noķert nākošā loģika un tad sanāk kad atkal jāpārbīda daži sigāli un kautkas jāpiekoriģē, lai atkal ietu, un šitās kļūdu meklēšanas prasa daudz laiku tādēļ arī domāju kad jaunais variants varētu strādāt ļoti labi un uz tā varētu droši veidot dažādas instrukcijas neuztraucoties par loģiku jo loģiku tad es vairs nemainīšu, jo tās instrukcijas vairs nebūs iekš Loģikas state machine bet iekš ram atmiņas  ::  
varianta mīnus ir tāds kad būs jāizmanto vēlviens rams (vienā būs grūti to realizēt lai gan mēģināt jau var), un pate to instrukcīju rakstīšana nebūs viegls process, bet es domāju kad tas būs daudz vieglāk nekā veidot loģikas state machine priekš instrukcijas + cīnīties ar signālu pislīpēšanu.

principā šāda tipa procesors kādu es tagat izdomāju realitātē neviens neizmanto jo viņš pats pēc būtības ir neefektīvs ja tādu veidotu iekš silikona, bet iekš fpga es domāju kad viņš varētu būt labs un + kad varētuviegli izveidot nepieciešamo instrukciju ar maz patērētu loģiku (salīdzinājumā ar parastiem fpga pročiem). 

ja neviens neko nesaprata tad vēlāk uzīmēšu shēmu, kur būs attēlotas tās  instrukcijas reģistrs kurš visu tur slēgs iekš proča.

----------


## Epis

varbūt dažš uzskatīs mani pa traku, bet man ir tāda sajūta kad šitā ideja varētu būt pamats īsti konfigurājamai procesora arhitektūrai -> un ar vārdu konfigurējams ir domāts tas kad var veidot tādas instrukcijas kāds vien gribi un kā zināms tad specializētās instrukcijas iet ~3-10x vai varākas reizes ātrāk nekā ja viņas būtu veidotas ar standart RISC instrukcijām + pats procesora kodols (lielā State machine) būtu daudz vienkāršāks pēc uzbūves un varētu viņš iet ar vēl lielāku ātrumu  :: . un šādam procim varētu arī izveidot C kompilātoru, kas kādu sarežģitu C funkciju pārvērtīs specializētājā isntrukcijā (kā hardware accelerators, piemeram (nios II H2C)) un protams kad izveiot standart bāzes instrukcijas no tā visa nebūs grūti  ::  

galvenā idejai jau ir, lai vieglāk, ātrāk var izveidot tās procesora pamat insturkcijas  :: , un lai mazāk problēmu ar loģiku un to State machine.

----------


## Raimonds1

Loģikas samazināšana un ātrdarbības palielināšana ir būtiska lieta, bet cik es saprotu, tad tās liekās loģikas gan jau ka tik daudz nemaz ar nemaksā. Ātrdarbība gan ir labs mērķis. Man domājas, ka vislabākais mērķis ir to procesu grafiski vai kā citādi tā novienkāršot, ka apmācīts strādnieks saliek ciparus un atķeksē darbību secību, piemēram tai CNC virpai, lokāmajai mašīnai vai metināšanas automātam, un , ja kas neiet, PATS SPĒJ TIKT GALĀ, NELIENOT PROGRAMMĒŠANAS VALODĀS.  Daļa šī virziena izglītības sistēmu  uz to arī iziet - iemācīt mainīt gatavus blokus un pārbaudīt sistēmu darbību ar standarta iebūvētām programmām, tā kā tas darbgaldu operators tāds gatavu sistēmu pārbaudītājs un iestatītājs vien ir.

----------


## Epis

es vakar uztaisīju koda kopīju kuru tad pārtaisīju pēc jaunās idejas izdarīju primitīvo signālu pārbīdīšanu un pievienoju jaunu Ram atmiņu un kopā man sanāk kad būs 13 signāli ar kuriem slēgt pa taisno visus procesora datu līnij slēdžus + vēl 6 papildus signāli kuriem būs īpaša funkcija (un kuri paliek rezervē jo vaidzēs izdomāt vēl kādu kontrolles mehānismu(domāju kad tādi būs)  :: . 
pa CNC tad G-kods ir ļoti labs programmas ievadīšanas un uzstādīšanas veids un vaidzētu tikai uztaisīt tā koda dekoderi (interpolātoru) kas no tā koda ģenerētu motoru kustības trjektorijas (ātrumus un kordinātes) un ja ir koda ievadīšanas funkcija tad arī vaig kādu monitoru pieslēgt klāt (kur var redzēt ko pats esi ievadījis). un es ticu kad šitās visas darbības var ielikt uz 1 fpga mikrenes (kādas no viss mazākajām) piemēram ar 5000-10 000 elementiem. 
Par gataviem blokiem tad var jau teorētiski uztaisīt šādus funkcionālus loģikas blokus (piemēram bloks soļu motoru kontrolei, servo motoru, un visādi citādi speciālizēti loģikas bloki kurus varētu tad pēc vajadzības izvēlēties (arī pēc skaita) un ielādēt iekš 1 fpga tik daudz bloku cik vaig un tādus kādus vaig vienīgi tad vaidzētu arī tai pārējai elektronikai kas pie fpga spēdzās klāt būt modulārai lai viņa varētu atbalstīt dažādus motorus un citas ierīces. lai kautko tādu uztaisītu var paiet vairāki gadi, bet ja sāk ar vienu soļu mtoru un pēc vajadzības liek klāt citus un tad laikam ejot sakrāsies tā kodu kaudze un būs vesela kodu bibloteka visām dzīves situācijām (visādiem motoriem un sistēmām). 

Jaunā cyclone III 65nm fpga nākotnē vairumā maksās sākot no 4$ (E3C5 ~5000LE) un mazumtirdziecības cena noteikti kad būs kādas 3x lielāka ~12-14$ tas ir tikai kādi 6-7Ls par 5000 loģikām. Man liekās kad tas ir vairāk kā super lēti priekš tādas jaudas un funkcionalitātes.
vispār nākotnē loģikai cenas kritīsies jo viņas iekaro ar viel lielāku mikreņu tirgus daļu un arī ražo lielākos apjomos līdz ar to cenām jākrīt!  ::

----------


## Epis

pagājušas jau 8 dienas kopš pēdējā komentāra un mans progres par šito laiku ir bījis ļoti mazs  ::  kopā par 8 dineām labi ja 12h sanāca pakodēt un sanāca bigais čakars ar tiem singāliem -> visu laiku kad pieliku klāt galvenai State machine kādu jaunu signālu simulātors sāka visādu brīnumus rādīt (kad kautkur kautkas neiet!) un kad es izlaboju tos neejošos signālus (pēc kādas stundas), tad kad lieku atkal kautko jaunu klāt, atkal kautkas neiet! un šodien pieleca kad vaig pazemināt max frkevenci un no 180Mhz nolaidu līdz 140Mhz un kā brīnums, problēma atrisinājās, vairāk proga nestreiko, un kā jau pirmstam minēju tas ir dēļ tā kad loģika sarežģījās un ātrums samainās, tagat pēc šitās mācības es pārbaudīšu to logīkas darbību ar zemākiem Mhz un kad būs gatavs tad simulātorā skatīšos cik ātri iet gatavais kods, jeb cik var izspiest  ::  
šodien es beidzot uztaisīju to galveno loģikas pamatu (ieliku Instrukcijas adresei savu caunteri (n=n+1) un tālāk vaidzēs darboties ar to Ram atmiņu un sākt programmēt tās instrukcijas  ::  tas būs intresantākais darbs.

----------


## Epis

uztaisīju pāris bildes primā ir tā proča jaunā shēma, lai var redzēt kas jauns uzbūvē  :: 


šeit sākot no PC_EN_T signāla līdz IAC_EN_T singālam šie signāli ir tie kas slēdz visas tās MUX, un citas datu līnijas, kurus tad es nolasīšu no RAm atmiņas, un tur beigās var redzēt kad nolasot ram atmiņu tie signāli attiecīgi ieslēdzās (es ramā ieliku testam  1111 pēctam vēl paŗis 11111 tur var redzēt kad vis darbojās signāli slēdzās tagat tikai jātaisa šīs signālu kombinācijas lai tos datus bīdītu caur ALU un citiem slēdžiem  :: 
Sarkanā līnija r'da kā bīdās informācija pa datu maģistrālēm
zilā rāda slēdžu signālus un ko tad viņi tur slēdz
zaļā State machine stāvokļus
tur bildē nav visi signāli atēloti (jo viņu ir baigi daudz!)
mans koda garums jau ir pie 700 rindām tas tāpēc kad vēl nav veikta ģenerālā koda tīrīšana no vecajiem signāliem un kodu gabaliem.

----------


## Epis

beidzot uztaisīju pirmo proča instrukciju  ::  un instrukcija īstanībā sastāv no vairākām darbībām šeit tad darbību secība.
A,B,Taimeris - 16bit skaitļi
0. nolasa A vērtību no RAM A adreses.
1. Taimeris - A = B
2.1.  Ja B=pozitīvs,Tad B saglabā RAM atmiņā B adresē un pilda 3.1
Ja B= negatīvs tad 0 - B=B un izpilda 3.2 instrukciju
3.1. saglabā Taimeri Ram atmiņā A adresē
3.2.   B saglabā RAM atmiņā B adresē
4.2. saglabā Taimeri Ram atmiņā A adresē

sanāk kad 1 mana instrukcija izpilda no 3-4 darbībām  ::  (neskaitot vērtību nolasīsānu no RAM atmiņas) 
un šitās operācijas izpildās 4-5 clock pūlksteņos pagaidām simulātorā testēju ar 140Mhz pūlksteni (teorētiskais max. ir 180Mhz (ram atmiņas ātrums pāri kuram ātrāk neies.) 
bet nu tas protams būs specializēts procis kurš to vien darīs kā veiks šo te vienu (vai 2-4 intrukcijas),
Domāju kad ar šito jauno proča isntrukciju uzbūvi esu sasniedzis to savu galveno mērķi -liels ātrums + vieglāk izveidot šīs instrukcijas un kā jau prognozēju tad būvējot instrukcijas problēmas ar Loģikas sarežģitību un max ātrumu nebija  :: , jo pate bāzes State machine kodā vairs netiek veiktas nekādas izmaiņas (mainās RAM sakodētā informācija)
Vēl protams ir daudz darba pie paša koda (jaatīra no liekajiem gabliem + vēl pāris uzlabojumu būs jāveic lai uztaisītu PWM ģenerātor instrukciju un jāpieslēdz pie galvenā proča (nios II)
takā vēl daudz darāmā, bet galvenais gandarījums kad ideja pamatu pamatos ir realizēta un viss strādā.

----------


## Raimonds1

Kā pārbaudi, kas iet, kas neiet?
Kā ir ar augstā līmeņa valodām?

----------


## Epis

Šodien attīrīju kodu no liekajiem signāliem un uztaisīju tādu bāzes moduli (pašu proča kodolu, bez enkoder perifērijām) un šis kodols tad aizņem 148LE un 2x 4kb RAM atmiņas. 
Lejā ir pats kods tur ir arī Ram atmiņas fails, kuru atšifrēt nebūs īpaši grūti (pirmā rinda adrese, otrā dati) 
šito kodu var nokopēt ielikt Notepadā un saglabāt (nosaukums ir dots katra koda sākumā un tad ar QuartusII 6.0 vai jaunāku nokompilēt kodu un uzģenerēt to proci. 
tākā kods ir veidots no variākiem failiem (failu hirarhija) tad visi faili  iekš Quartus jāieliek projektā!

nuko ja kāds grib es varu uz E-pastu aizsūtīt jau gatavu saarhivētu projekta failu.
ceru kad vismaz pāris cilvēki sapratīs kas tur kodā ir sakodēts  :: 

ja kautkas nav skaidrs tad jautājat !!!

Epi_16bit_core.vhdl


```
--  Quartus II Version 6.0 
-- Created on Fri MAI 4, 2007

LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_unsigned.all;

--  Entity Declaration

ENTITY Epi_16bit_Core IS
	-- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
	PORT
	(	clock, clr : IN STD_LOGIC;
		writedata : IN STD_LOGIC_VECTOR(15 downto 0);
		Encoder : IN STD_LOGIC_VECTOR(7 downto 0);
		Reset_n : OUT STD_LOGIC;
		Q : IN STD_LOGIC_VECTOR(7 downto 0);
		Taimer : IN STD_LOGIC_VECTOR(15 downto 0);
		Step_IN : IN STD_LOGIC;
--Test Kodi
		Test_RAM : OUT STD_LOGIC_VECTOR(15 downto 0);
		IRQ_SM0_T : OUT STD_LOGIC_VECTOR(3 downto 0);
		RAM_write_Reg_T : OUT STD_LOGIC_VECTOR(15 downto 0);
		PC_OUT_T : 	OUT STD_LOGIC_VECTOR(6 downto 0);
		PC_EN_T : OUT STD_LOGIC;
		RAM_RD_enable_B_R_T: OUT STD_LOGIC;
		R_A_R_T : 	OUT STD_LOGIC_VECTOR(6 downto 0);
		R_A_B_R_T : OUT STD_LOGIC_VECTOR(6 downto 0);
		ALU_A_T : OUT STD_LOGIC_VECTOR(15 downto 0);
		ALU_B_T : OUT STD_LOGIC_VECTOR(15 downto 0);
		ALU_rez_T: OUT STD_LOGIC_VECTOR(15 downto 0);
		ALU_B_MUX_T : OUT STD_LOGIC;
		ALU_B_reg_clr_T : OUT STD_LOGIC;
		IR_EN_T : OUT STD_LOGIC;
		Ram_W_MUX_T : OUT std_logic;
		PC_Load_S_T: OUT STD_LOGIC;
		PC_IN_T : 	OUT STD_LOGIC_VECTOR(6 downto 0);
		PC_MUX_T : OUT STD_LOGIC;
		Cary_T : OUT STD_LOGIC;
		Ram_W_Reg_en_T : OUT STD_LOGIC;
		IAC_en_T : OUT STD_LOGIC;
		wren_T : OUT STD_LOGIC;
		ALU_Bit_T : OUT STD_LOGIC;
		X_MUX_T : OUT STD_LOGIC;
		IAC_load_T: OUT STD_LOGIC;
		INST_done_T : OUT STD_LOGIC;
		X_IR_R_T: OUT STD_LOGIC_VECTOR(12 downto 0);
		X_ram2_A_T: OUT STD_LOGIC_VECTOR(15 downto 0);
		X_ram2_B_T: OUT STD_LOGIC_VECTOR(15 downto 0);
		X_S_IR_T: OUT STD_LOGIC_VECTOR(5 downto 0);
		IAC_T : OUT STD_LOGIC_VECTOR(6 downto 0);
		Opcode_T : OUT STD_LOGIC_VECTOR(3 downto 0);
		ALU_A_MUX_T : OUT STD_LOGIC_VECTOR(1 downto 0);
		IR_T : OUT STD_LOGIC_VECTOR(15 downto 0)	
	);
	-- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!
	
END Epi_16bit_Core;


--  Architecture Body

ARCHITECTURE Epi_16bit_Core_architecture OF Epi_16bit_Core IS

component RAM_3_port
	PORT
	(
		clock		: IN STD_LOGIC ;
		data		: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
		rdaddress_a		: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
		rdaddress_b		: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
		rden_a		: IN STD_LOGIC  := '1';
		rden_b		: IN STD_LOGIC  := '1';
		wraddress		: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
		wren		: IN STD_LOGIC  := '1';
		qa		: OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
		qb		: OUT STD_LOGIC_VECTOR (15 DOWNTO 0)
	);
end component;

component RAM2
	PORT
	(
		clock		: IN STD_LOGIC ;
		data		: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
		rdaddress_a		: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
		rdaddress_b		: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
		wraddress		: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
		wren		: IN STD_LOGIC  := '1';
		qa		: OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
		qb		: OUT STD_LOGIC_VECTOR (15 DOWNTO 0)
	);
end component;
-- AD/SUB  PORTI
component ADD_SUB_Logika
	PORT
	(
		add_sub		: IN STD_LOGIC ;
		dataa		: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
		datab		: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
		cout		: OUT STD_LOGIC ;
		overflow		: OUT STD_LOGIC ;
		result		: OUT STD_LOGIC_VECTOR (15 DOWNTO 0)
	);
end component;
-- Enkoder Modulis 
Component Delay_3_clk IS
	PORT
	(
		Clock, A		: IN	STD_LOGIC;
		A_D3,A_D2,A_D1	: OUT	STD_LOGIC
	);
End component;

--/////  SIGNĀLI //////////////////////////////
-- //////STATE MACHINE signali/////////
		type CPU is (Reset,IRQ_State,IRQ_State2,Fetch,Fetch_D1,
		Fetch_D2, Fetch_D3,END_instruction );
		
		signal S : CPU; -- pROČA sTATE MACHINE 
		signal clk_en : std_logic; -- PULKSTEŅA ENABLE BITS
		signal clk : std_logic; -- PROČA PŪLKSTENIS 
-- State  MUX slēdžu singāli !!
	signal ALU_Bit : std_logic;
	signal ALU_owerflow : std_logic;
	signal RAM_RD_enable_R : std_logic; -- Nolasam RAM
	signal RAM_RD_enable_B_R : std_logic; -- otrs RAM nolasam :)
	signal RAM_Ren_B_i : std_logic; -- Starta B ram enable signāls
	
-- ALU Signāli 
	signal ALU_A : std_logic_vector(15 downto 0);
	signal ALU_B : std_logic_vector(15 downto 0);
	signal ALU_rez : std_logic_vector(15 downto 0);
	signal REZ : std_logic_vector(15 downto 0);
	signal ALU_B_MUX : std_logic;
	signal Cary : std_logic;
	signal IF_Cary_F : std_logic;
	signal ALU_A_R : std_logic_vector(15 downto 0);
	signal ALU_B_R : std_logic_vector(15 downto 0);
	signal ALU_A_clr : std_logic; -- ADD Reģistra Enable singāls ja 1 tad ieraksta :)
	signal ALU_B_reg_clr : std_logic;
		
-- RAM read, write signāli
	signal wren : std_logic;
	signal RAM_read_R : std_logic_vector(15 downto 0);
	signal RAM_read_R_R : std_logic_vector(15 downto 0); -- ReģistrētĀ izeja
	signal RAM_read_B_R : std_logic_vector(15 downto 0);
	signal RAM_write_R : std_logic_vector(15 downto 0);
	signal RAM_write_B_R : std_logic_vector(15 downto 0);
	signal RAM_write_Reg : std_logic_vector(15 downto 0); -- Reģistrs kurā dati nostabilizējās :)
	signal W_A_R : std_logic_vector(6 downto 0);
	signal R_A_R : std_logic_vector(6 downto 0);
	signal R_A_B_R : std_logic_vector(6 downto 0);
	signal Ram_W_MUX : std_logic;
	signal Ram_W_MUX_F : std_logic;
	signal Ram_W_MUX_i : std_logic;
	signal Ram_W_Reg_en: std_logic;
	signal Ram_W_Reg_en_i: std_logic;
	signal Ram_W_Reg_en_F: std_logic;
	signal ALU_A_MUX : std_logic_vector(1 downto 0);
	signal ALU_A_MUX_i : std_logic_vector(1 downto 0);
	signal X_ALU_A_MUX : std_logic_vector(1 downto 0);

--//Encoder signāli
	--signal Reset_n :std_logic;
	signal Taimer_R : std_logic_vector(15 downto 0);
	signal E_IRQ_Adress : std_logic_vector(7 downto 0);
	signal IRQ_SM : std_logic_vector(3 downto 0);
	signal Step : std_logic;
	signal Step_delay : std_logic;-- aizture

-- Programm Counter ( PC )
	signal PC : std_logic_vector(6 downto 0);
	signal PC2 : std_logic_vector(6 downto 0);
	signal PC_IN : std_logic_vector(6 downto 0);
	signal PC_OUT : std_logic_vector(6 downto 0);
	signal PC_en : std_logic;
	signal PC_en_i : std_logic;
	signal PC_en_i_D : std_logic;
	signal PC_en_final : std_logic;
	signal PC_Load : std_logic;
	signal PC_Load_S : std_logic;
	signal PC_Load_S_i : std_logic;
	signal PC_MUX : std_logic; -- Adereses MUX A
	signal PC_MUX_F : std_logic;
	signal PC_MUX_i : std_logic;
	signal PC_reset : std_logic;
	
-- Instruction Register caunter ( IAC )
		signal IAC :std_logic_vector(6 downto 0);
		signal IAC_load : std_logic;
		signal IAC_EN_F : std_logic;
		signal IAC_en : std_logic;
		signal IAC_en_i : std_logic;
		signal INST_done  : std_logic;
		signal done  : std_logic;

-- Decode 
	signal IR_en : std_logic; -- Adres Reģistra EN (reģistrs atrodās A Ram_read_R!
	signal IR_en_i : std_logic;
	signal IR_en_F : std_logic; 
	signal IR : std_logic_vector(15 downto 0); -- Instrukcij Reģistrs :)
	signal Opcode : std_logic_vector(3 downto 0); -- OPkods 
	
-- RAM 2 
	signal X_R_A_A :  std_logic_vector(6 downto 0); -- Adres A
	signal X_R_A_B :  std_logic_vector(6 downto 0); -- Adress B
	signal X_RAM2_A : std_logic_vector(15 downto 0); -- Ram2 A read
	signal X_RAM2_B :  std_logic_vector(15 downto 0); -- Ram2 B read
	signal X_MUX : std_logic;
	signal X_MUX_i : std_logic;
	signal X_MUX_F : std_logic;
	signal X_IR :  std_logic_vector(12 downto 0); -- 13 instrukcij slēdži
	signal X_IR_R :  std_logic_vector(12 downto 0); -- reģistrs
	signal X_S_IR : std_logic_vector(5 downto 0); -- Papild instrukcijas !!!


-- /////////////// KODS SĀKĀS ŠEIT UN IET LĪDZ PAŠĀM BEIGĀM //////////////////
BEGIN	

--******************************************************************************
--//// CPU IESTARTĒŠANAS kodS /////////////

 Step <= Step_IN; --Step signāla inputs :)
-- STEP Delay 1 clock
STEP_2_delay : Delay_3_clk 
	PORT Map ( Clock => Clock, A=> Step, A_D1=> Step_delay);
-- CLOCK Enable signāls CLK_EN
Process(clk_en)
begin
	if clk_en ='1' then
	CLK <= Clock;
	else CLK <='0';
	end if;
	end process;
-- STOP / START Signāls
PROCESS (clock)
	BEGIN
		if rising_edge(clock) then
			if Step_delay = '1' then
				clk_en <='1';
			else if clr ='1' then 
			clk_en <='0';
		end if;
	end if;
	end if;
	end process;
	
-- ///////////////////// CPU GALVENĀ STATE MACHINE////////////////////
process (clk,clk_en)
  begin
if clk_en ='0' then
 elsif rising_edge(clk) then
	S <= Reset;
	Case S is 
			when Reset => 
				PC_EN_i <= '0';
				S<= IRQ_State;
						
			when IRQ_State =>
				PC_MUX_i <='0';
				PC_Load_S_i <='1'; -- PC Load ADRESS
				S <= IRQ_State2;
				
			when IRQ_State2 =>
				ALU_A_MUX_i <="01";
				PC_Load_S_i <='0';
				PC_en_i <= '1';--priekš PC_enable bita pagarināšnaas sākumā
				RAM_Ren_B_i <='1';--//Special ///
				S<= Fetch;	
			
			when Fetch => -- VIss pārējais :)
				IAC_EN_i <='0'; -- Instruction Adres caunter
				ALU_A_MUX_i <="00";
				PC_en_i <='0'; -- Pagarinatajs
				PC_MUX_i <='1';
				S <= Fetch_D1;
			
			when Fetch_D1 => 
				IR_en_i <='1'; --instrukcij reģistra enable bits
				S <= Fetch_D2;

			when Fetch_D2 => 
				RAM_Ren_B_i<='0'; 
				X_mux_i<='0';
				IAC_Load <='1';
				IR_en_i <='0'; -- clear
				S <= Fetch_D3;
			
			when Fetch_D3 =>
				X_mux_i<='1';
				IAC_Load <='0'; IAC_EN_i <='1';
				S<= END_instruction;
				
			when END_instruction=>
				if INST_done ='1' then
					S <= Fetch;
					else S<= END_instruction;
				end if;
			
			when Others => S <= Fetch;
		End case;
		end if;
end process;

--Test Signāli
Test_RAM <= RAM_write_R;
IRQ_SM0_T <= IRQ_SM;  -- Pārbaudu signālus priekš RAM

--////// RAM 2 UZSTĀDĪŠANA ///////////////////
Instruction_RAM : RAM2
	PORT MAP(clock => clock, data => "0000000000000000",wraddress =>"0000000",	rdaddress_a	=> X_R_A_A,	rdaddress_b	=> X_R_A_B,
		qa => X_ram2_A,	qb => X_ram2_B);
-- SIGNĀALU SADALĪJUMS
X_R_A_A(5 downto 0)<= IAC(5 downto 0); -- pagaidu read adress pielieku pie 1 rama adreses
X_R_A_A(6) <='0';
X_R_A_B(5 downto 0) <= IAC(5 downto 0); -- Read adresi pielieku pie 2 rama adreses
X_R_A_B(6) <='1';
X_MUX <= X_mux_i xor X_mux_F;
X_MUX_T <= X_MUX;
--/// RAM2 INSTRUKCIJU MUX ///////////
process(clock)
	begin
		Case X_mux is 
			when '1'=> X_IR <= X_Ram2_A(12 downto 0); 
			when '0'=> X_IR <= X_Ram2_B(12 downto 0);
	when others => X_IR <= X_Ram2_A(12 downto 0);
		END Case;
end process;
X_ram2_A_T<=X_ram2_A;
X_ram2_B_T<=X_ram2_B;
X_IR_R_T <= X_IR_R; --Test
process (clock)
 begin
   if rising_edge(clock) then
		X_IR_R <=X_IR; -- instrukciju biti data bus
		X_S_IR(2 downto 0) <=X_Ram2_A(15 downto 13); -- speciālās instrukcijas biti :)
		X_S_IR(5 downto 3) <=X_Ram2_B(15 downto 13); --
		end if;
	end process;

--///////// INSTRUKCIJU SIGNĀLU ATRAŠANĀS VIETAS ///////////
PC_EN <= X_IR_R(0); -- programm counter caunt enable bit +1
PC_load_S <= X_IR_R(1); -- programm counter Load enable bits :)
ALU_Bit <= X_IR_R(2); ALU_Bit_T <= ALU_bit; --Test-- Add_sub bits !
Ram_W_mux <= X_IR_R(5); 
Ram_W_reg_EN <= X_IR_R(6);
wren <= X_IR_R(7);
X_ALU_A_MUX(1 downto 0) <= X_IR_R(9 downto 8);
ALU_B_MUX <= X_IR_R(10);
ALU_B_Reg_clr <= X_IR_R(11);
IR_en <= X_IR_R(12);

IAC_en <= X_S_IR(0); --Instruction Adres Enable bits (ko var kontrollēt
INST_done <= X_S_IR(1); -- Special instruction End bits ja ir 1 tad intstrukcija beidzās!
IF_Cary_F <= X_S_IR(2); -- Cay IF Function, ja cary ir 1 tad X_MUX =1 else X_MUX =0
ALU_A_Clr <= X_S_IR(3); -- ALUA reģistrs ir <="0000000000000000"
-- TEST SIGNĀLI
X_S_IR_T <=X_S_IR; --Test
INST_done_T<= INST_done;

--///////// PAPILDUS 1. INSTRUKCIJAS SPECIFISKĀ LOĢIKA /////////
process(clock)
	begin
	if rising_edge(clock) then
		if IF_Cary_F ='1' then 
			 if cary = '0' then
				 X_mux_F <= '1';
				else X_mux_F <= '0';
				END if;
			
		else if INST_done = '1' then 
		X_mux_F <= '0';   -- Atgriež sākotnējā stāvoklī !!
		end if;	
			END if;
	END if;
end process;

process(clock)
	begin
	if rising_edge(clock) then
		if IF_Cary_F ='1' then 
			 if cary = '0' then
				Ram_W_Reg_en_i <='1';
				Ram_W_mux_i <='1'; 
				else Ram_W_Reg_en_i <='0';
				Ram_W_mux_i <='0';
				END if;
		else if done = '1' then 
		Ram_W_Reg_en_i <='0';
		Ram_W_mux_i <='0';   -- Atgriež sākotnējā stāvoklī !!
		end if;	
			END if;
	END if;
end process;
cary_dalay : Delay_3_clk 
	PORT Map ( Clock => Clock, A=> IF_cary_F, A_D1=>done );

--///////DATU   RAM1 Uzstādīšana /////////
SM_RAM_M4_16_bit : RAM_3_port
PORT MAP(clock => Clock,data => RAM_write_Reg,rdaddress_a => R_A_R,
rden_a => RAM_RD_enable_R,wraddress => W_A_R,wren => wren, qa => RAM_read_R,rdaddress_b => R_A_B_R, -- Otrais Read Adress
rden_b => RAM_RD_enable_B_R, qb => RAM_read_B_R); -- Otrais Read DATA


wren_T <= wren; -- Test
RAM_RD_enable_B_R <= RAM_Ren_B_i; 
RAM_RD_enable_R<='1'; --Read RAM A = 1 (lasa visu laiku)
RAM_RD_enable_B_R_T <= RAM_RD_enable_B_R;--Test signli
R_A_R_T <= R_A_R; --Test signli
R_A_B_R_T <= R_A_B_R;--Test signļi

-- /////////// ADD_SUB uzstādīšana /////////
SM_ADD_SUB_16BIT : ADD_SUB_Logika
PORT MAP(add_sub => ALU_Bit,--clock=> clock,
dataa=> ALU_A,datab=> ALU_B,cout => Cary,overflow=> ALU_owerflow,result=> ALU_rez);
Cary_T<= cary; --test

--/////// INSTGRUCTION ADRESS COUNTER -> IAC KODS //////////////////
process(clock)
begin	
	if Rising_edge(clock) then
	if IAC_en_f ='1' then
			IAC <= IAC + 1;
		else if IAC_Load = '1' then
			IAC <= IR(6 downto 0); 
			end if;
			end if;
		end if;
end process;
IAC_en_F <= IAC_en xor IAC_en_i;
--Test signāli
IAC_EN_T <= IAC_en_F;
IAC_T <= IAC;
IAC_load_T <= IAC_load;

--//////// PC (GALVENAIS Programm Counter) ///////////////////////
PC_EN_final <= PC_en_i xor PC_en; -- izmaiņas
PC_OUT <= PC; -- nolasa adresi :)
PC_load <= PC_load_S xor PC_load_S_i;

process(clock)
begin	
	if Rising_edge(clock) then
	if PC_en_final ='1' then
			PC <= PC + 1;
		else if PC_Load ='1' then
			PC <= PC_IN; 
			end if;
			end if;
		end if;
end process;
PC2(5 downto 0) <= PC(5 downto 0);
PC2(6) <= '1';

--// PC // input MUX ////// 
PC_mux <='0'; -- Pagaidām ir uzlikts uz 0 jo nebīj vajadzības kodā pēc jump instrukcijas.
PC_MUX_F <= PC_mux xor PC_MUX_i;
 E_IRQ_Adress <= Q;
process(clock)
	begin
		Case PC_MUX_F is 
			when '1' => PC_IN(5 downto 0) <= IR(9 downto 4); --Instrukcijas Vidējie biti
						PC_IN(6)<= '0'; -- B porta adrese (
			when '0' => PC_IN <= E_IRQ_Adress(6 downto 0);
			when others => PC_IN(5 downto 0) <= IR(9 downto 4);PC_IN(6)<= '0';
		END Case;
end process;
-- TEST SIGNĀLI
PC_EN_T <= PC_EN_final; -- Programm counter Enable --Test sigāli
PC_OUT_T <= PC_OUT; --Tests
PC_Load_S_T <= PC_Load; --Test
PC_IN_T <= PC_IN;--Test
PC_MUX_T<= PC_MUX_F;--Test

-- 2 RAM BLOKA ADRESES IR PIELIKTAS PIE 1 BLOKA ADRESĒM
R_A_B_R <= PC2;
R_A_R <= PC;


--/////  RAM WRITE MUX ////
W_A_R <= PC_OUT;
RAM_W_MUX_F <=RAM_W_MUX xor RAM_W_MUX_i;
REZ <= ALU_rez; 
process(clock)
	begin
		Case Ram_W_MUX_F is 
			when '0' => RAM_write_R <= writedata;
			when '1' => RAM_write_R <= rez;
			when others => RAM_write_R <= writedata;
		END Case;
end process;
-- TEST SIGNĀLI 
ALU_rez_T <= ALU_rez;
Ram_W_MUX_T <= Ram_W_MUX_F; -- Test MUX signālu

--DATU stabilizēšnas reģistrs pirms ieraksta ram atmiņā ir obligāts 
--(savādāk nekās neierakstās ramā)
Ram_W_Reg_en_F <= Ram_W_Reg_en_i xor Ram_W_Reg_en;

process (clock)
 begin
   if rising_edge(clock) then
		if Ram_W_Reg_en_F ='1' then
		RAM_write_Reg <= RAM_write_R; -- Stabilizē Datus :) 16 DFF aizņem :(
	end if;
end if;
end process;
-- TEST SIGNĀLI
RAM_write_Reg_T <= RAM_write_Reg; -- Test Stabilitātes Reģistrs :)
Ram_W_Reg_en_T <= Ram_W_Reg_en_F; --Test

--/////////// ALU A MUX //////////
ALU_A_MUX <= ALU_A_MUX_i xor X_ALU_A_MUX; 
Taimer_R <= Taimer; 
process(clock)
	begin
		Case ALU_A_MUX is 
			when "01" => ALU_A_R <= RAM_read_R; -- A rams
			when "10" => ALU_A_R <= Taimer_R; 
			when "00" => ALU_A_R <= rez;
			when others => ALU_A_R <= RAM_read_R;
		END Case;
end process;
-- REĢISTRS
process (clock)
 begin
   if rising_edge(clock) then
		if ALU_A_Clr = '1' then
			ALU_A <="0000000000000000";
		else 
		ALU_A <= ALU_A_R; -- A ieja
	end if;
end if;
end process;
--TEST SIGNĀLI
ALU_A_MUX_T <= ALU_A_MUX; --Test pin
ALU_A_T <= ALU_A; --Test

--///////////// ALU B MUX //// ///////////////////
process(clock)
	begin
		Case ALU_B_MUX is 
			when '0' => ALU_B_R <= RAM_read_B_R;
			when '1' => ALU_B_R <= rez;
			when others => ALU_B_R <= RAM_read_B_R;
		END Case;
end process;
--REĢISTRS 
process (clock)
 begin
	if ALU_B_reg_clr ='1' then 
	ALU_B <= "0000000000000000";
		elsif rising_edge(clock) then
			ALU_B <= ALU_B_R; -- Reģistrā B ieaj
	end if;
end process;
-- TEST SIGNĀLI
ALU_B_T <= ALU_B; --Tests B
ALU_B_reg_clr_T <=ALU_B_reg_clr; --Test pin
ALU_B_MUX_T <= ALU_b_mux; --test pin

--///////// IR(instrukciju) REĢISTRS ///////////
IR_en_F <= IR_EN xor IR_en_i; -- bez DELAY
process (clock)
 begin
   if rising_edge(clock) then
	if IR_en_F = '1' then
	IR <= RAM_read_B_R;
	end if;
		end if;
end process;
Opcode <= IR(3 downto 0); -- Opcoda Vads :)
 --Test signāli
OPCODE_T <= Opcode;
IR_en_T <=IR_en_F;
IR_T <= IR; 

--/// Reset_n uzstādīšana////////
process (clock)
  begin
    if rising_edge(clock) then
	reset_n <='1';
	end if;
	end process;

END Epi_16bit_Core_architecture;
```

 
šeit memory fails kas jāsaglabā kā Memory_Fails.mif


```
-- Quartus II generated Memory Initialization File (.mif)

WIDTH=16;
DEPTH=128;

ADDRESS_RADIX=UNS;
DATA_RADIX=UNS;

CONTENT BEGIN
	0    :   0;
	1    :   193;
	[2..6]  :   0;
	7    :   23;
	8    :   24;
	[9..70]  :   0;
	71   :   130;
	72   :   9;
	73   :   14;
	[74..127]  :   0;
END;
```

 Ram2_memory.mif


```
-- Quartus II generated Memory Initialization File (.mif)

WIDTH=16;
DEPTH=256;

ADDRESS_RADIX=UNS;
DATA_RADIX=BIN;

CONTENT BEGIN
	0    :   0000000000001011;
	1    :   0000000000000001;
	2    :   0000001000000000;
	3    :   1000010001100001;
	4    :   0000101010001010;
	5    :   0000000001100000;
	6    :   0000000010000000;
	7    :   0100000000000000;
	[8..64]  :   0000000000000000;
	[65..66]  :   0000000000001011;
	67   :   0010000000000000;
	68   :   0000000000000000;
	69   :   0000000010000010;
	[70..255]  :   0000000000000000;
END;
```

 ADD_SUB_logika.vhdl


```
LIBRARY ieee;
USE ieee.std_logic_1164.all;

LIBRARY lpm;
USE lpm.all;

ENTITY ADD_SUB_Logika IS
	PORT
	(
		add_sub		: IN STD_LOGIC ;
		dataa		: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
		datab		: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
		cout		: OUT STD_LOGIC ;
		overflow		: OUT STD_LOGIC ;
		result		: OUT STD_LOGIC_VECTOR (15 DOWNTO 0)
	);
END ADD_SUB_Logika;


ARCHITECTURE SYN OF add_sub_logika IS

	SIGNAL sub_wire0	: STD_LOGIC ;
	SIGNAL sub_wire1	: STD_LOGIC ;
	SIGNAL sub_wire2	: STD_LOGIC_VECTOR (15 DOWNTO 0);



	COMPONENT lpm_add_sub
	GENERIC (
		lpm_direction		: STRING;
		lpm_hint		: STRING;
		lpm_type		: STRING;
		lpm_width		: NATURAL
	);
	PORT (
			dataa	: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
			add_sub	: IN STD_LOGIC ;
			datab	: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
			overflow	: OUT STD_LOGIC ;
			cout	: OUT STD_LOGIC ;
			result	: OUT STD_LOGIC_VECTOR (15 DOWNTO 0)
	);
	END COMPONENT;

BEGIN
	overflow    <= sub_wire0;
	cout    <= sub_wire1;
	result    <= sub_wire2(15 DOWNTO 0);

	lpm_add_sub_component : lpm_add_sub
	GENERIC MAP (
		lpm_direction => "UNUSED",
		lpm_hint => "ONE_INPUT_IS_CONSTANT=NO,CIN_USED=NO",
		lpm_type => "LPM_ADD_SUB",
		lpm_width => 16
	)
	PORT MAP (
		dataa => dataa,
		add_sub => add_sub,
		datab => datab,
		overflow => sub_wire0,
		cout => sub_wire1,
		result => sub_wire2
	);



END SYN;
```

 RAM2.vhdl


```
LIBRARY ieee;
USE ieee.std_logic_1164.all;

LIBRARY altera_mf;
USE altera_mf.all;

ENTITY RAM2 IS
	PORT
	(
		clock		: IN STD_LOGIC ;
		data		: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
		rdaddress_a		: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
		rdaddress_b		: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
		wraddress		: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
		wren		: IN STD_LOGIC  := '1';
		qa		: OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
		qb		: OUT STD_LOGIC_VECTOR (15 DOWNTO 0)
	);
END RAM2;


ARCHITECTURE SYN OF ram2 IS

	SIGNAL sub_wire0	: STD_LOGIC_VECTOR (15 DOWNTO 0);
	SIGNAL sub_wire1	: STD_LOGIC_VECTOR (15 DOWNTO 0);



	COMPONENT alt3pram
	GENERIC (
		indata_aclr		: STRING;
		indata_reg		: STRING;
		intended_device_family		: STRING;
		lpm_file		: STRING;
		lpm_type		: STRING;
		outdata_aclr_a		: STRING;
		outdata_aclr_b		: STRING;
		outdata_reg_a		: STRING;
		outdata_reg_b		: STRING;
		rdaddress_aclr_a		: STRING;
		rdaddress_aclr_b		: STRING;
		rdaddress_reg_a		: STRING;
		rdaddress_reg_b		: STRING;
		rdcontrol_aclr_a		: STRING;
		rdcontrol_aclr_b		: STRING;
		rdcontrol_reg_a		: STRING;
		rdcontrol_reg_b		: STRING;
		width		: NATURAL;
		widthad		: NATURAL;
		write_aclr		: STRING;
		write_reg		: STRING
	);
	PORT (
			qa	: OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
			outclock	: IN STD_LOGIC ;
			qb	: OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
			wren	: IN STD_LOGIC ;
			inclock	: IN STD_LOGIC ;
			data	: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
			rdaddress_a	: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
			wraddress	: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
			rdaddress_b	: IN STD_LOGIC_VECTOR (6 DOWNTO 0)
	);
	END COMPONENT;

BEGIN
	qa    <= sub_wire0(15 DOWNTO 0);
	qb    <= sub_wire1(15 DOWNTO 0);

	alt3pram_component : alt3pram
	GENERIC MAP (
		indata_aclr => "OFF",
		indata_reg => "INCLOCK",
		intended_device_family => "Cyclone II",
		lpm_file => "RAM2_memory.mif",
		lpm_type => "alt3pram",
		outdata_aclr_a => "OFF",
		outdata_aclr_b => "OFF",
		outdata_reg_a => "OUTCLOCK",
		outdata_reg_b => "OUTCLOCK",
		rdaddress_aclr_a => "OFF",
		rdaddress_aclr_b => "OFF",
		rdaddress_reg_a => "INCLOCK",
		rdaddress_reg_b => "INCLOCK",
		rdcontrol_aclr_a => "OFF",
		rdcontrol_aclr_b => "OFF",
		rdcontrol_reg_a => "UNREGISTERED",
		rdcontrol_reg_b => "UNREGISTERED",
		width => 16,
		widthad => 7,
		write_aclr => "OFF",
		write_reg => "INCLOCK"
	)
	PORT MAP (
		outclock => clock,
		wren => wren,
		inclock => clock,
		data => data,
		rdaddress_a => rdaddress_a,
		wraddress => wraddress,
		rdaddress_b => rdaddress_b,
		qa => sub_wire0,
		qb => sub_wire1
	);



END SYN;
```

 RAM_3_port.vhdl


```

LIBRARY ieee;
USE ieee.std_logic_1164.all;

LIBRARY altera_mf;
USE altera_mf.all;

ENTITY RAM_3_port IS
	PORT
	(
		clock		: IN STD_LOGIC ;
		data		: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
		rdaddress_a		: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
		rdaddress_b		: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
		rden_a		: IN STD_LOGIC  := '1';
		rden_b		: IN STD_LOGIC  := '1';
		wraddress		: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
		wren		: IN STD_LOGIC  := '1';
		qa		: OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
		qb		: OUT STD_LOGIC_VECTOR (15 DOWNTO 0)
	);
END RAM_3_port;


ARCHITECTURE SYN OF ram_3_port IS

	SIGNAL sub_wire0	: STD_LOGIC_VECTOR (15 DOWNTO 0);
	SIGNAL sub_wire1	: STD_LOGIC_VECTOR (15 DOWNTO 0);



	COMPONENT alt3pram
	GENERIC (
		indata_aclr		: STRING;
		indata_reg		: STRING;
		intended_device_family		: STRING;
		lpm_file		: STRING;
		lpm_type		: STRING;
		maximum_depth		: NATURAL;
		outdata_aclr_a		: STRING;
		outdata_aclr_b		: STRING;
		outdata_reg_a		: STRING;
		outdata_reg_b		: STRING;
		ram_block_type		: STRING;
		rdaddress_aclr_a		: STRING;
		rdaddress_aclr_b		: STRING;
		rdaddress_reg_a		: STRING;
		rdaddress_reg_b		: STRING;
		rdcontrol_aclr_a		: STRING;
		rdcontrol_aclr_b		: STRING;
		rdcontrol_reg_a		: STRING;
		rdcontrol_reg_b		: STRING;
		width		: NATURAL;
		widthad		: NATURAL;
		write_aclr		: STRING;
		write_reg		: STRING
	);
	PORT (
			qa	: OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
			outclock	: IN STD_LOGIC ;
			qb	: OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
			wren	: IN STD_LOGIC ;
			inclock	: IN STD_LOGIC ;
			data	: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
			rden_a	: IN STD_LOGIC ;
			rdaddress_a	: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
			wraddress	: IN STD_LOGIC_VECTOR (6 DOWNTO 0);
			rden_b	: IN STD_LOGIC ;
			rdaddress_b	: IN STD_LOGIC_VECTOR (6 DOWNTO 0)
	);
	END COMPONENT;

BEGIN
	qa    <= sub_wire0(15 DOWNTO 0);
	qb    <= sub_wire1(15 DOWNTO 0);

	alt3pram_component : alt3pram
	GENERIC MAP (
		indata_aclr => "OFF",
		indata_reg => "INCLOCK",
		intended_device_family => "Cyclone II",
		lpm_file => "Memory_Fails.mif",
		lpm_type => "alt3pram",
		maximum_depth => 128,
		outdata_aclr_a => "OFF",
		outdata_aclr_b => "OFF",
		outdata_reg_a => "OUTCLOCK",
		outdata_reg_b => "OUTCLOCK",
		ram_block_type => "M4K",
		rdaddress_aclr_a => "OFF",
		rdaddress_aclr_b => "OFF",
		rdaddress_reg_a => "INCLOCK",
		rdaddress_reg_b => "INCLOCK",
		rdcontrol_aclr_a => "OFF",
		rdcontrol_aclr_b => "OFF",
		rdcontrol_reg_a => "INCLOCK",
		rdcontrol_reg_b => "INCLOCK",
		width => 16,
		widthad => 7,
		write_aclr => "OFF",
		write_reg => "INCLOCK"
	)
	PORT MAP (
		outclock => clock,
		wren => wren,
		inclock => clock,
		data => data,
		rden_a => rden_a,
		rdaddress_a => rdaddress_a,
		wraddress => wraddress,
		rden_b => rden_b,
		rdaddress_b => rdaddress_b,
		qa => sub_wire0,
		qb => sub_wire1
	);



END SYN;
```

 



```
LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY Delay_3_clk IS
	PORT
	(
		Clock, A		: IN	STD_LOGIC;
		A_D3,A_D2,A_D1	: OUT	STD_LOGIC
	);
END Delay_3_clk;

ARCHITECTURE Delay OF Delay_3_clk IS
	SIGNAL A1,A2,A3 : STD_LOGIC; -- Delay signāli :)
	
BEGIN

process (clock)
 begin
   if rising_edge(clock) then
		if A = '1' then 
				A1 <='1'; 
			else A1  <='0';
		end if;
	end if;
end process;
A_D1 <=A1; -- Delay 1 :)

process (clock)
 begin
   if rising_edge(clock) then
		if A1 = '1' then 
				A2 <='1'; 
			else A2  <='0';
		end if;
	end if;
end process;
A_D2 <=A2; -- Delay 2 :)
process (clock)
 begin
   if rising_edge(clock) then
		if A2 = '1' then 
				A3 <='1'; 
			else A3  <='0';
		end if;
	end if;
end process;
A_D3 <=A3; -- Delay 3 :)
END Delay;
```

 šeit var redzēt kā izskatās parastais RISC procesors ar 4 instrukcijām ADD,Store,LOAD,Jump kāda viņam bīj arhitektūra es aizmirsu bet šitas kods ir ņemts no vienas pamācības (bišķi pielabots, priekš cyclone II fpga  ::  



```
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY cpu1 IS
	PORT( clock, reset,clr,i2 : IN STD_LOGIC;
		program_counter_out: OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 );
		register_AC_out : OUT STD_LOGIC_VECTOR(15 DOWNTO 0 );
		memory_data_register_out : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
		memory_address_register_out : OUT STD_LOGIC_VECTOR(7 DOWNTO 0 );
		instruction_register_out: OUT STD_LOGIC_VECTOR(15 DOWNTO 0 );
	clk_T,Start_T, i_T : OUT STD_LOGIC);
	END cpu1;

ARCHITECTURE a OF cpu1 IS
	TYPE STATE_TYPE IS ( reset_pc, fetch, decode, add,add_d1, 
	add_d2,add_d3, load,load_DELAY, load_DELAY2,
	store,store3, store2, jump );
	
	SIGNAL S: STATE_TYPE;
	SIGNAL instruction_register, memory_data_register: STD_LOGIC_VECTOR( 15 DOWNTO 0 );
	SIGNAL register_AC: STD_LOGIC_VECTOR(15 DOWNTO 0 );
	SIGNAL program_counter: STD_LOGIC_VECTOR( 7 DOWNTO 0 );
	SIGNAL memory_address_register: STD_LOGIC_VECTOR( 7 DOWNTO 0 );
	SIGNAL memory_write : STD_LOGIC;
	SIGNAL start : STD_LOGIC;
	Signal CLK,i: std_logic;
-- RAM Atmiņas inicializēšana Šeit
component CPU2_RAM
	PORT
	(
		address		: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
		clock		: IN STD_LOGIC ;
		data		: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
		wren		: IN STD_LOGIC ;
		q		: OUT STD_LOGIC_VECTOR (15 DOWNTO 0)
	);
end component;

BEGIN
-- Use LPM function for computer's memory (256 16-bit words)
memory: CPU2_RAM
PORT MAP( data => Register_AC, 
address => memory_address_register,
	wren => memory_write, clock => clock, q => memory_data_register );
-- Test Signāli

memory_address_register_out <= memory_address_register; -- test
program_counter_out <= program_counter;-- test
register_AC_out <= register_AC;-- test
memory_data_register_out <= memory_data_register;-- test
instruction_register_out <=instruction_register; --Test
--Sākās proga šeit :)
i_T <= i; --TEST pin

Process(Start)
begin
	if Start ='1' then
	CLK <= Clock;
	else CLK <='0';
	end if;
	end process;
CLK_T <= CLK;
Start_T<= Start;

PROCESS (clock )
	BEGIN
		if rising_edge(clock) then
			IF reset = '1' THEN
			Start <='1';
			else if clr ='1' then 
			Start <='0';
		end if;
	end if;
	end if;
	end process;


Process(clk,start)
begin
	if Start ='0' then
	
	else IF rising_edge(CLK) THEN
		S <= reset_pc;
	CASE S IS
		WHEN reset_pc =>
-- reset the computer, need to clear some registers
			program_counter <= "00000000";
			register_AC <= "0000000000000000";
			memory_write <= '0';
			memory_address_register <= "00000000";
			S <= fetch;
-- Fetch instruction from memory and add 1 to PC
		WHEN fetch =>
		if i2 ='1' then
	i<='0';
	end if;
			instruction_register <= memory_data_register;
			program_counter <= program_counter + 1;
			memory_write <='0';
			S <= decode;
-- Decode instruction and send out address of any data operands
		WHEN decode =>
			memory_address_register <= instruction_register( 7 DOWNTO 0);
			CASE instruction_register( 15 DOWNTO 8 ) IS
				WHEN "00000000" =>
					S <= add;
				WHEN "00000001" =>
					S <= store;
				WHEN "00000010" =>
					S <= load;
				WHEN "00000011" =>
					S <= jump;
				WHEN OTHERS =>
					S <= fetch;
				END CASE;
	-- Execute the ADD instruction
		WHEN add =>
		i<='1';
		S <= add_d1;
		WHEN add_d1 => -- Delay 1 clock
			register_ac <= register_ac + memory_data_register;
		S <= add_d2;
		WHEN add_d2 =>	 -- Delay 1 clock	
			memory_address_register <= program_counter;
			S <= add_d3;
		WHEN add_d3 =>	-- Delay 1 clock	
			S <= fetch;
-- Execute the STORE instruction
-- (needs three clock cycles for memory write)
-- write register_A to memory
			
		WHEN store =>
			memory_write <= '1';
			S <= store2;
-- This state ensures that the memory address is
-- valid until after memory_write goes inactive
		WHEN store2 =>
			memory_write <= '0';
			S <= store3;
			
-- Execute the LOAD instruction
		WHEN store3 => 
			memory_address_register <= program_counter;
			S <= fetch;
		
		WHEN load => -- dElay 1 Cikls :)
		 S <= load_DELAY;
		WHEN load_DELAY => 
			register_ac <= memory_data_register;
			memory_address_register <= program_counter;
		S <= load_DELAY2;
		WHEN load_DELAY2 => -- dElay vēl +1 Clock :)	
			S <= fetch;
-- Execute the JUMP instruction
		WHEN jump =>
			memory_address_register <= instruction_register( 7 DOWNTO 0 );
			program_counter <= instruction_register( 7 DOWNTO 0 );
			S <= fetch;
		WHEN OTHERS =>
			memory_address_register <= program_counter;
			S <= fetch;
		END CASE;
	END IF;
	END IF;
	--END IF;
END PROCESS;

END a;
```

 CPU2_RAM.vhdl


```
LIBRARY ieee;
USE ieee.std_logic_1164.all;

LIBRARY altera_mf;
USE altera_mf.all;

ENTITY CPU2_RAM IS
	PORT
	(
		address		: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
		clock		: IN STD_LOGIC ;
		data		: IN STD_LOGIC_VECTOR (15 DOWNTO 0);
		wren		: IN STD_LOGIC ;
		q		: OUT STD_LOGIC_VECTOR (15 DOWNTO 0)
	);
END CPU2_RAM;


ARCHITECTURE SYN OF cpu2_ram IS

	SIGNAL sub_wire0	: STD_LOGIC_VECTOR (15 DOWNTO 0);



	COMPONENT altsyncram
	GENERIC (
		clock_enable_input_a		: STRING;
		clock_enable_output_a		: STRING;
		init_file		: STRING;
		intended_device_family		: STRING;
		lpm_hint		: STRING;
		lpm_type		: STRING;
		numwords_a		: NATURAL;
		operation_mode		: STRING;
		outdata_aclr_a		: STRING;
		outdata_reg_a		: STRING;
		power_up_uninitialized		: STRING;
		widthad_a		: NATURAL;
		width_a		: NATURAL;
		width_byteena_a		: NATURAL
	);
	PORT (
			wren_a	: IN STD_LOGIC ;
			clock0	: IN STD_LOGIC ;
			address_a	: IN STD_LOGIC_VECTOR (7 DOWNTO 0);
			q_a	: OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
			data_a	: IN STD_LOGIC_VECTOR (15 DOWNTO 0)
	);
	END COMPONENT;

BEGIN
	q    <= sub_wire0(15 DOWNTO 0);

	altsyncram_component : altsyncram
	GENERIC MAP (
		clock_enable_input_a => "BYPASS",
		clock_enable_output_a => "BYPASS",
		init_file => "CPU_MEM.mif",
		intended_device_family => "Cyclone II",
		lpm_hint => "ENABLE_RUNTIME_MOD=NO",
		lpm_type => "altsyncram",
		numwords_a => 256,
		operation_mode => "SINGLE_PORT",
		outdata_aclr_a => "NONE",
		outdata_reg_a => "UNREGISTERED",
		power_up_uninitialized => "FALSE",
		widthad_a => 8,
		width_a => 16,
		width_byteena_a => 1
	)
	PORT MAP (
		wren_a => wren,
		clock0 => clock,
		address_a => address,
		data_a => data,
		q_a => sub_wire0
	);



END SYN;
```

----------


## Raimonds1

es tik saprotu tik, ka aiz ;  var ierakstīt, kas ar šo rindu ir pateikts un to proga neņem vērā, bet atvbieglo uzreiz saprast, kas tur ir, ja aksjalabo. Vai pareizi?
;

----------


## Epis

tā ir aiz : beidzās attiecīgā kodu rinda 
piemēram A<= B xor C; (A singāls ir izeja XOR vārtiem kuru iejas ir B un C ar <= zīmi savieno signālus 
-- ir komentārs 

var arī rakstīt šitādā stilā tā es varētu samazināt to koda izmēru bet būtu grūtāk orjentēties kodā.
a<= B AND C; D<= Q not R; -- un tā tālāk visu kodu vienār garā rindā jo ; zīme norāda kad beidzās kods un tad sakās jaunais

šitā ir VHDL kodu valoda,

----------


## Raimonds1

tad to progu ar copy/paste var iedabuut kompii un tad ieprogrammet, kur vajag, vai tā?

saits tai valodai?

----------


## Epis

Jā nokopē kodu ieliec notpad saglabā kā .vhdl failu un tad ņemam Quartus II 6.0 progu un uztaisam jaunu projektu ieliekam šitos failus iekšā un uzģenerējam. 

pamācības VHDL valodai ir daudz google uz atslēgvārda "vhdl tutorial " un izvēlies kura pamācība tev labāk patīk + arī ir Alteras mājaslapā lab Exercise 
http://www.altera.com/education/univ/ma ... anual.html
tur ir VHDL, un Verilog kodu piemēri un vingrinājuma uzdevumi sākot nu parasta slēdža līdz procim litratūras ir ļoti daudz un var arī Xilinx mājaslapā atrast VHDL tutorialus priekš viņu fpga mikrenēm un progas. (katrs ražotājs piedāvā savas pamācības  :: 
man agrāk bīj saglabāti linki uz tām pamācībām kas man viss labāk patika bet kompis nobruka un un visa linku bibloteka pazuda  ::

----------

