An ARM7v4 IP Core.

M

mathswork

Guest
Sveiki, visi
Aš sukūrė ARMv4 IP Core.Jis nėra tipiškas ARM autobusu, bet jis veikia gerai.Man reikia pagalbos niekam wrap kaip tipiškų TL branduolys, arba paremti bet testcase man.Šis branduolys yra labai mažas: a. Prieš failas yra mažesnis kaip 2000 eilučių.Nors galima naudoti, tik reikia savo pasiūlymą sukurti gerai.

Norėčiau įdėti į opencores.org, tačiau jis buvo atmestas.

Šis IP branduolys yra ARM klonas.Ji turi tą patį architektūros ARM V4.Jos pagrindinis bruožas sąrašus:

- Ne parama koprocesor instrukcijos

- Ne parama Thumb komandų rinkinys

- Visos pertraukinėja palaikoma

- Šie nurodymai yra palaikomos, išskyrus koprocesor instrukcijas.
ldr; ldrb; g.; strb; ldrh; strh; ldrsb; ldrsh; TDD; swpb; LDM; stm; b; bx; dp; mult; multl; swi; mrs; TAS;

- Little-endian formatu.

- Šis IP branduolys labai kompaktiškas: AGRINDINĖS plotas yra mažesnis negu
30000 vartų (2 įėjimai NAND vartai).

- Kritinis kelias yra toks, kad turi 32 bitų, 32 bitų daugiklis ir 64bit - 64bit padidinimas, kuris priklauso dauginti kauptis ilgą instrukciją.

- Visos TL branduolys yra tik vienas. Prieš byla, kuri per trumpą ilgis mažesnis kaip 2000 eilučių.

- Jis gali būti atviras arba įšaldyto teigė vienas įvesties uoste "cpu_en" aukšto lygio arba žemas, kurie padės sumažinti daugiau galios.Be to, jei skaitant iš atminties reikia daugiau ciklų IP branduolys gali būti įšaldytos, kol duomenimis ram yra pasirengusi, jei tik vieną autobusą, ji taip pat gali būti įšaldytos, kol duomenys arba instrukcijos yra pasirengę.

- Trijų pakopų vamzdyno naudojama: paimti, decode, vykdyti.Skaitymas iš barana reikia daugiau vienas ciklas, nes, kai siuntimo adresą RAM, duomenys turi būti parengta kitą ciklą.Tuo metu, kai duomenys fetched yra naudojamas kaip vienas operando, šalia instrukcija turi būti atsisakyta ir atsarginių ciklas įvyko.
Atsiprašome, bet jums reikia prisijungti, kad galėtumėte peržiūrėti šį priedą

 
Labai įdomu.mathswork jūs turite testbench, bandymo ROM failus eiti su ja?Kokį kompiliatorių Jūs naudojate siekiant sudaryti iš C kodus?

 
Sveiki, kel8157
Žinoma aš daug testbench ji ir kiekvienas tikslas yra viena komanda.Tai buvo vienintelis būdas tai patikrinti prieš.Bet dabar, aš turiu "Keil" už rankos "pagamintas" Hex "failą.Žinau nedaug, embeded programavimo, ir aš išmokti C programavimas, kad jis darbo.

Pastaruoju metu, aš labai sėkmingas.Aš sudarytas vienas pavyzdys "Blinky" ir "Keil už rankos", ir sumodeliuotais jį ModelSim.Jis dirba puikiai.Kitas žingsnis, ir bus paimti jį į FPGA.

Jei turite "Keil" už rankos ".Jūs galite lengvai rasti, pavyzdžiui, "D: \" Keil \ ARM \ RV30 \ Pavyzdžiai \ Blinky ".Prieš sudarant, padaryti "PLL_SETUP EQU 0" ir "MAM_SETUP EQU 0" linija 117 ir 37 "startup.s".

Aš turiu versija galima imituoti, jei esate instresting.

Vidaus registruose, kurie pavadinti ją "reg_r0" į "reg_rf", galite vilkite jį į bangų lange.Ir taip pat galite rasti "reg_re_usr", "cpsr_i", "cpsr_m".
Atsiprašome, bet jums reikia prisijungti, kad galėtumėte peržiūrėti šį priedą

 
Max mathswork,

diagramos failo formatu jpg, kurį tiekia būtų sutrumpintas.Arba gali būti tik aš patirtį tokių klaidų?

 
Ok, I have fixed it.iš naujo jį atsisiųsti.Kai tekstą paaiškinti mano dienoraštis: h ** p: / / free-arm.blog.163.com

 
mathswork rašė:

Ok, I have fixed it.
iš naujo jį atsisiųsti.
Kai tekstą paaiškinti mano dienoraštis: h ** p: / / free-arm.blog.163.com
 
mathswork rašė:

Sveiki, kel8157

Žinoma aš daug testbench ji ir kiekvienas tikslas yra viena komanda.
Tai buvo vienintelis būdas tai patikrinti prieš.
Bet dabar, aš turiu "Keil" už rankos "pagamintas" Hex "failą.
Žinau nedaug, embeded programavimo, ir aš išmokti C programavimas, kad jis darbo.Pastaruoju metu, aš labai sėkmingas.
Aš sudarytas vienas pavyzdys "Blinky" ir "Keil už rankos", ir sumodeliuotais jį ModelSim.
Jis dirba puikiai.
Kitas žingsnis, ir bus paimti jį į FPGA.Jei turite "Keil" už rankos ".
Jūs galite lengvai rasti, pavyzdžiui, "D: \" Keil \ ARM \ RV30 \ Pavyzdžiai \ Blinky ".
Prieš sudarant, padaryti "PLL_SETUP EQU 0" ir "MAM_SETUP EQU 0" linija 117 ir 37 "startup.s".Aš turiu versija galima imituoti, jei esate instresting.Vidaus registruose, kurie pavadinti ją "reg_r0" į "reg_rf", galite vilkite jį į bangų lange.
Ir taip pat galite rasti "reg_re_usr", "cpsr_i", "cpsr_m".
 
Labas,
Man malonu girdėti, kad jums yra atkreipti dėmesį į mano ranką ip branduolys.Galbūt, jūs antras žmogus imituoti tai aš žinau.

Kaip 32x32 daugiklis, ji yra pagrindinė sudedamoji dalis mano branduolio.Beveik kiekvieną ARM instrukcijų reikia.Jis naudojamas ne tik kaip RmxRs Rn už MUL instrukcija, bet Rm>> R Rn daugumai instrukcijos, kurios turi poslinkio registrus.Nėra barelį poslinkio ji.Jei aš noriu perkelti Rm kairės: LSL # 5 Aš priskirti R = 32'b1_0000,
apatinis 32-bit of RmXRs bus rezultatas.Jei aš noriu gauti logiška poslinkio teisę: LSR # 5 Aš priskirti R = ~ 5 1 = 27,
tuo didesnė 32 bitų RmXRs tai, ko aš noriu.

Taigi šį ilgą kritiškas kelią nėra taip paprasta ją pašalinti.Į kitą versiją, aš naudoti 32x8 ją pakeisti.Taigi MUL arba UMLA instrukcijos bus keturių ciklų ją įgyvendinti.Kai mux reikia įgyvendinti poslinkio operacija naudojant šią 32x8 daugiklis.

su Keil naudoti atsisiųsti iš: http://www.atarm.com/software/Keil303a.rar.Jis yra tik 60 MB.Jei jums CID per "File" -> "License valdymas" -> CID,
įveskite ją į "keygen_edge.exe".Ši versija yra paprastas naudoti.

Man įdomu su įrengimo į FPGA.

 
cool ..ačiū už pastangas mathswork ..kiek matau du galimus tobulinimo, viena yra SRAM, aš stebėti pagrindinius poreikius dvejopo uosto RAM, tai sunku recode pagrindiniu naudoti vieną uostą SRAM?Antrasis yra daugiklis problemą, ji sumažina kritinį kelią 40ns dėl Spartietis-E ..

 
Sveiki, kel8157
Tai labai paprasta, kad šis pagrindinių susijusių su vienu uosto RAM.Aš familar su dvejopo uosto RAM, todėl šis variantas yra, kad.Aš galėtų pakeisti kai kurias linijas.Tai lengva.

Kritinis kelias man didelė problema labai.Manau, kad todėl ARM pavadinimų pagrindinei mažos galios branduolys.Jie neturi pasirinkimo imcrease jos dažnį.Taigi ARM9 iš penkių etapų vamzdynu, kuris turi daugiau kaip 2 vamzdynams nei ARM7.Pagalvokite, kad, 40 ns, padalinta į 3, savo ateitį "arm9" turės ypatingos svarbos kelias 40 / 3 = 13 ns.

Aš turiu kitą versiją.Jis remiasi buvusių.Buvusioji's daugiklis yra 32x32.Aš naudoju 8x8 dauginamąjį ją pakeisti, kuris reiškia MUL / SMUAL insturction reikia daugiau ciklų atlikti nei buvusios.Dėl AGRINDINĖS, ši versija yra labai sėkmingas.Į SMIC 0,18 um, buvusios gali turėti daugiau kaip 15 ns, bet ši versija bus rodomi 6 ~ 7 ns.Tačiau FPGA, ji nesugeba sumažinti kritinių kelių žymiai.Kadangi 32x32 daugiklis yra skirta komponentų FPGA, yra 8x8 multipiler
Some MUXs ne taip geriau nei 32x32 daugiklis.

 
mathswork rašė:

Sveiki, kel8157

Tai labai paprasta, kad šis pagrindinių susijusių su vienu uosto RAM.
Aš familar su dvejopo uosto RAM, todėl šis variantas yra, kad.
Aš galėtų pakeisti kai kurias linijas.
Tai lengva.Kritinis kelias man didelė problema labai.
Manau, kad todėl ARM pavadinimų pagrindinei mažos galios branduolys.
Jie neturi pasirinkimo imcrease jos dažnį.
Taigi ARM9 iš penkių etapų vamzdynu, kuris turi daugiau kaip 2 vamzdynams nei ARM7.
Pagalvokite, kad, 40 ns, padalinta į 3, savo ateitį "arm9" turės ypatingos svarbos kelias 40 / 3 = 13 ns.Aš turiu kitą versiją.
Jis remiasi buvusių.
Buvusioji's daugiklis yra 32x32.
Aš naudoju 8x8 dauginamąjį ją pakeisti, kuris reiškia MUL / SMUAL insturction reikia daugiau ciklų atlikti nei buvusios.
Dėl AGRINDINĖS, ši versija yra labai sėkmingas.
Į SMIC 0,18 um, buvusios gali turėti daugiau kaip 15 ns, bet ši versija bus rodomi 6 ~ 7 ns.
Tačiau FPGA, ji nesugeba sumažinti kritinių kelių žymiai.
Kadangi 32x32 daugiklis yra skirta komponentų FPGA, yra 8x8 multipiler Some MUXs ne taip geriau nei 32x32 daugiklis.
 
Kokių pastangų galite pradėti ARM branduolio dizainą?Siekiant įgyvendinti pagrindinius su standartinių komponentų, pavyzdžiui, ROM
ir SRAM, kad testbench turi būti pakeistas.Jei pakeisti sąsajos ROM / RAM prieigą, jūs manote, kad Jums gali pakeisti pagrindinius zmieścić į lauką?

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Labai laimingas" border="0" />

Kodas:"apibrėžti DEL 1

"laikotarpį 1 ns / 1 ns

modulis tb_test;reg CLK;

reg RST;

reg cpu_en;

reg cpu_restart;

reg irq;

reg fiq;viela rom_en;

viela [31:0] rom_addr;

reg [31:0] rom_data;

reg rom_abort;viela ram_en;

viela ram_wr_en;

viela [31:0] ram_addr;

viela [31:0] ram_wr_data;

reg [31:0] ram_rd_data;

reg ram_rd_abort;reg [127:0] rom_tmp [2047:0];

reg [7:0] rom_all [32767:0];rankos u_arm (

. CLK (CLK), / / Sistemos laikrodis

. RST (RST), / / Sistemos atkurti smeigtukai, aukštas svarbių

. cpu_en (cpu_en) / / CPU kad signalas, aukštos svarbūs, žemas sustabdo cpu.

. cpu_restart (cpu_restart), / / Perkraukite cpu, aukštos svarbūs.

. IRQ (IRQ), / / IRQ nutraukti kad signalas, aukštas svarbių

. fiq (fiq), / / FIQ nutraukti kad signalas, aukštas svarbių. rom_en (rom_en), / / Instrukcija romĄŻs 32 bitų adresas

. rom_addr (rom_addr), / / Instrukcija romĄŻs 32 bitų adresas

. rom_data (rom_data), / / instrukcija saugoma rom

. rom_abort (rom_abort) / / Šis nurodymas negalioja, jei šis signalas išlaiko aukštą.. ram_en (ram_en), / / Ram skaityti kad signalas, mažos = pasirinkite

. ram_wr_en (ram_wr_en), / / Ram parašyti kad signalas, mažos = parašyti, aukštos = skaityti

. ram_addr (ram_addr), / / Ram skaityti adresą

. ram_wr_data (ram_wr_data), / / Ram parašyti duomenų signalus.

. ram_rd_data (ram_rd_data), / / Ram skaityti duomenis signalai

. ram_rd_abort (ram_rd_abort) / / Duomenys apie ° ram_rd_dataĄą yra negaliojanti, jeigu ji išlaiko aukštą

);pradinis pradėti

CLK = 1'b0;

cpu_en = 1'b0;

cpu_restart = 1'b0;

rom_abort = 1'b0;

irq = 1'b0;

fiq = 1'b0;

GR = 1'b0;

# 10 GR = 1'b1;

# 20 GR = 1'b0;

cpu_en = 1'b1;

cpu_restart = 1'b1;

# 10 cpu_restart = 1'b0;pabaigavisada CLK = 5 ~ CLK;/ / ROM skyrių, reikia naudoti Enable signalas, kuri palengvina darbą su flash ir PROM.

/ / Skaitymui iš ROM kodu ram_addr [31:28] == 4'h0 reikia modifikuoti,

/ / Kitaip, arbitražo su ROM turi būti įgyvendintos.

visada @ (posedge CLK) pradėti

jei (rom_en) prasideda

rom_data <= "DEL (rom_all [rom_addr 2 d3], rom_all [rom_addr 2 d2], rom_all [rom_addr 2 d1], rom_all [rom_addr]);

else if (ram_addr [31:28] == 4'h0)

ram_rd_data_from rom <= "DEL (rom_all [ram_addr 2 d3], rom_all [ram_addr 2 d2], rom_all [ram_addr 2 d1], rom_all [ram_addr]);

pabaiga

pabaiga/ / RAM skyriuje, naudojant standartinę vieno uosto RAM.

reg [7:0] ram_data [2047:0];

integer i;

pradinis pradėti

ram_rd_abort = 1'b0;

for (i = 0; i <2048; i = i 1)

ram_data = 8'h0;

pabaigavisada @ (posedge CLK) pradėti

jei (ram_en & (ram_wr_en == 1'b1)) prasideda

jei (ram_addr [31:28] == 4'h4)

ram_rd_data <= "DEL (ram_data [ram_addr [10:0] 3], ram_data [ram_addr [10:0] 2], ram_data [ram_addr [10:0] 1], ram_data [ram_addr [10:0 ]]);

else if (ram_addr [31:28] == 4'h0) / / Jei taip yra perkelta į ROM sąsaja, todėl lengviau RAM.

ram_rd_data <= "DEL ram_rd_data_from;

kitur;

pabaigajei (ram_en & (ram_wr_en == 1'b0) & (ram_addr [31:28] == 4'h4)) prasideda

ram_data [ram_addr [10:0] 3] <= "DEL ram_wr_data [31:24];

ram_data [ram_addr [10:0] 2] <= "DEL ram_wr_data [23:16];

ram_data [ram_addr [10:0] 1] <= "DEL ram_wr_data [15:8];

ram_data [ram_addr [10:0]] <= "DEL ram_wr_data [7:0];

pabaiga

pabaiga/************************************************* *************/

parametras memLoadFile = "./data_test/keil_03.bin";sveikasis skaičius n, j;

reg [127:0] tmp;

pradinis pradėti

jei (memLoadFile! = "") prasideda

$ readmemh (memLoadFile, rom_tmp); / / Norėdami naudoti, kopijuoti HEX skyrių ir užpildyti laisvas baitų paskutinė eilutė su xx

for (n = 0, n <2048; n = n 1) pradėti

Tmp = rom_tmp [n];

rom_all [n * 16 15] = tmp [07:00];

rom_all [n * 16 14] = tmp [15:08];

rom_all [n * 16 13] = tmp [23:16];

rom_all [n * 16 12] = tmp [31:24];

rom_all [n * 16 11] = tmp [39:32];

rom_all [n * 16 10] = tmp [47:40];

rom_all [n * 16 9] = tmp [55:48];

rom_all [n * 16 8] = tmp [63:56];

rom_all [n * 16 7] = tmp [71:64];

rom_all [n * 16 6] = tmp [79:72];

rom_all [n * 16 5] = tmp [87:80];

rom_all [n * 16 4] = tmp [95:88];

rom_all [n * 16 3] = tmp [103:96];

rom_all [n * 16 2] = tmp [111:104];

rom_all [n * 16 1] = tmp [119:112];

rom_all [n * 16 0] = tmp [127:120];

$ ekranas ( "IN% h", Tmp);

$ rodyti (OUT% O% O% O% O% O% O% O% O% O% O% O% O% O% O% O% h ",

rom_all [n * 16 0]

rom_all [n * 16 1],

rom_all [n * 16 2],

rom_all [n * 16 3],

rom_all [n * 16 4],

rom_all [n * 16 5],

rom_all [n * 16 6],

rom_all [n * 16 7],

rom_all [n * 16 8],

rom_all [n * 16 9],

rom_all [n * 16 10],

rom_all [n * 16 11],

rom_all [n * 16 12],

rom_all [n * 16 13],

rom_all [n * 16 14],

rom_all [n * 16 15]);

pabaiga

/ / $ Readmemh (memLoadFile, rom_all);

pabaiga

pabaiga
endmodule
 
kel8157,
hi, aš galėsiu tai padaryti.
Attatched yra kai kuriose versijose aš neseniai.

Bet problema, rašykite man.
Atsiprašome, bet jums reikia prisijungti, kad galėtumėte peržiūrėti šį priedą

 
mathswork rašė:

kel8157,

hi, aš galėsiu tai padaryti.

Attatched yra kai kuriose versijose aš neseniai.Bet problema, rašykite man.
 
Sveiki, kel8157,

Aš atsisiųsti ją į savo FPGA laive: digilent's Spartan-3e Starter Kit.

Aš naudoju UART atsisiųsti bin failą ROM ir gali pamatyti tai veikia nedelsdamas.Tai reiškia, FPGA laive tapti ARM plėtoja laive.

Naujų pagrindinių pagerėjo daugiau.Kritinis kelias yra tik 26 ns (iki 40 ns).

How about you?reikia pagalbos?

 
mathswork rašė:

Sveiki, kel8157,Aš atsisiųsti ją į savo FPGA laive: digilent's Spartan-3e Starter Kit.Aš naudoju UART atsisiųsti bin failą ROM ir gali pamatyti tai veikia nedelsdamas.
Tai reiškia, FPGA laive tapti ARM plėtoja laive.Naujų pagrindinių pagerėjo daugiau.
Kritinis kelias yra tik 26 ns (iki 40 ns).How about you?
reikia pagalbos?
 

Welcome to EDABoard.com

Sponsor

Back
Top