O ARM7v4 IP-Core.

M

mathswork

Guest
Max, toate
I s-au dezvoltat o ARMv4 IP miezuri.Nu a tipice ARM autobuz, dar acesta funcţionează bine.Am nevoie de ajutor de la cineva wrap-o ca pe un tipic IP de bază, sau de orice sprijin testcase pentru mine.Această bază este foarte mic: o. V fişier de mai puţin de 2000 de linii.Orice se poate folosi, tocmai am nevoie de sugestiile
dvs. pentru a dezvolta bine.

Vreau să-l pun la opencores.org, dar acesta a fost respins.

Această bază de IP este un braţ clona.Are aceeaşi arhitectura ARM v4.Principala sa caracteristică liste:

- Nu suport coprocessor instrucţiuni

- Nu suport thumb set de instrucţiuni

- Toate întrerupe sprijinite

- Aceste instrucţiuni sunt acceptate,
cu excepţia coprocessor instrucţiuni.
ldr; ldrb; str.; strb; ldrh; strh; ldrsb; ldrsh; swp; swpb; LDM; stm; b; BX; dp; mult; multl; swi; D-na; msr;

- Little-endian format.

- Acest IP de bază este foarte compact: ASIC suprafaţă mai mică de
30000 porti (2 intrări NAND poarta).

- Calea de critică este una care are un 32 bit-32 biţi de multiplicare şi 64bit - 64bit Adder, care se fac pentru a multiplica acumula lungi de instrucţiuni.

- Toate IP de bază este doar unul. V fişier, care are o lungime de scurtă: mai puţin de 2000 de linii.

- Nu poate fi deschis sau congelate de a afirmat un port de intrare "cpu_en" la nivel înalt sau scăzut,
ceea ce va ajuta la reducerea mai multă putere.Mai mult decât atât,
în cazul în lectură de la memoria RAM are nevoie de mai multe cicluri, IP de bază ar putea fi îngheţate până la date de la ram sunt pregătite; dacă există doar un singur autobuz, de asemenea, ar putea fi îngheţate până la date sau instrucţiuni sunt gata.

- O perioadă de trei etape de conducte este utilizat: fetch, decodeze, executaţi.Citind de la RAM va avea nevoie de un ciclu de mai multe, pentru că atunci când a trimite la adresa de RAM, datele trebuie să fie pregătit în următorul ciclu.La acea dată, dacă preluat de date este utilizat ca un operand,
alaturi de instruire a trebuit să fie abandonate şi un ciclu de rezervă este apărut.
Ne pare rău, dar ai nevoie de autentificare pentru a vizualiza acest ataşament

 
Foarte interesant.mathswork aveţi vreo testbench, ROM imagini de test pentru a merge cu ea?Ce fel de compilator vrei să folosiţi pentru a compila codurile de la C?

 
Bună, kel8157
Desigur, am multe testbench pentru el şi fiecare are ca scop unic de instruire.Aceasta a fost singura cale de a verifica, înainte de aceasta.Dar acum, am "Keil pentru braţ" produs "Hex" fişier.Ştiu puţin la embeded de programare, şi i-au, pentru a afla C Programare pentru a face să funcţioneze.

Recent, am mare succes.Am compilat un exemplu "Blinky" de "Keil pentru braţ", şi a simulat o în modelsim.Funcţionează perfect.În etapa următoare, i se va descărca la FPGA.

Dacă aţi "Keil pentru braţ".Puteţi găsi uşor în acest exemplu "D: \ Keil \ ARM \ RV30 \ Exemple \ Blinky".Înainte de compilare,
a face "PLL_SETUP EQU 0" şi "MAM_SETUP EQU 0" în linia de 117 şi 37 din "startup.s".

Am o versiune pentru tine pentru a simula, dacă sunt instresting.

Interne de registre, care am numele acesta "reg_r0" la "reg_rf", aveţi posibilitatea să glisaţi-l în val fereastra.Şi, de asemenea, puteţi găsi "reg_re_usr", "cpsr_i", "cpsr_m".

 
Max mathswork,

diagrama de fişier în format jpg pe care le-aţi furnizat pare să fi trunchiate.Sau poate fi doar am experienta unei astfel de bug-ul?

 
OK, am reparat-o.re-l descarci.Unele de text pentru a explica în blog-ul meu: h ** p: / / free-arm.blog.163.com

 
mathswork a scris:

OK, am reparat-o.
re-l descarci.
Unele de text pentru a explica în blog-ul meu: h ** p: / / free-arm.blog.163.com
 
mathswork a scris:

Bună, kel8157

Desigur, am multe testbench pentru el şi fiecare are ca scop unic de instruire.
Aceasta a fost singura cale de a verifica, înainte de aceasta.
Dar acum, am "Keil pentru braţ" produs "Hex" fişier.
Ştiu puţin la embeded de programare, şi i-au, pentru a afla C Programare pentru a face să funcţioneze.Recent, am mare succes.
Am compilat un exemplu "Blinky" de "Keil pentru braţ", şi a simulat o în modelsim.
Funcţionează perfect.
În etapa următoare, i se va descărca la FPGA.Dacă aţi "Keil pentru braţ".
Puteţi găsi uşor în acest exemplu "D: \ Keil \ ARM \ RV30 \ Exemple \ Blinky".
Înainte de compilare, a face "PLL_SETUP EQU 0" şi "MAM_SETUP EQU 0" în linia de 117 şi 37 din "startup.s".Am o versiune pentru tine pentru a simula, dacă sunt instresting.Interne de registre, care am numele acesta "reg_r0" la "reg_rf", aveţi posibilitatea să glisaţi-l în val fereastra.
Şi, de asemenea, puteţi găsi "reg_re_usr", "cpsr_i", "cpsr_m".
 
Salut,
Mă bucur să aud că eşti atent pe mâna mea IP de bază.Poate, sunteţi cea de-a doua persoană a simula-l ştiu.

Ca de 32x32 de multiplicare, aceasta este componenta cheie în mea de bază.Aproape fiecare ARM instruire nevoie de ea.Este folosit nu numai ca RmxRs RN MUL pentru instruire, dar de asemenea, Rm.>> Rs RN pentru cele mai multe instrucţiuni care a registrelor de schimbare.Nu există nici un baril shifter în el.Când vreau să schimbare
Rm. stânga: LSL # 5, I se va aloca Rs = 32'b1_0000, cu atât este mai mică pe 32 de biţi de RmXRs va fi rezultatul.Dacă vreau să iau o logică schimbare dreapta: LSR # 5, I se va aloca Rs = ~ 5 1 = 27, cu cât este mai mare de 32 biţi RmXRs este ceea ce vreau.

Deci acest drum lung critică nu este atât de uşor pentru a elimina.În următoarea versiune,
voi folosi o 32x8 să o înlocuiască.Aşadar, o MUL sau UMLA de instruire va avea patru cicluri de punere în aplicare a acesteia.Unele mux este necesară pentru punerea în aplicare a operaţiunii de schimbare folosind acest 32x8 de multiplicare.

Eu folosesc de Keil este descarcat de la: http://www.atarm.com/software/Keil303a.rar.Este doar 60 MB.Dacă te CID prin "File" -> "License Management" -> CID, de intrare este de a "keygen_edge.exe".Această versiune este uşor de utilizat.

Sunt interesante cu montare în FPGA.

 
misto ..vă mulţumesc pentru efortul mathswork ..măsura i vezi doi potenţial de îmbunătăţire, este un SRAM, am observa nucleul are nevoie de o dublă port RAM, este dificil să se recode de bază pentru a folosi un singur port SRAM?În al doilea rând este de multiplicare problemă, reduce critice pe cale de a 40ns spartan-E ..

 
Bună, kel8157
Este foarte uşor să aibă această bază în legătură cu un singur port de RAM.Sunt familar cu RAM dual port, astfel încât această versiune este facut pentru asta.Aş putea modifica unele linii.Este usor.

Critice calea dă-mi o mare problemă foarte mult.Cred ca asta este motivul pentru ARM numele său de bază scăzute de energie de bază.Ei nu trebuie să aibă posibilitatea de a imcrease sale de frecvenţă.Deci, ARM9 are cinci etape de conducte, care are mai mult de 2 conducte ARM7.Gândiţi-vă de faptul că, 40 ns împărţit prin 3, viitorul meu "arm9" va avea un critic cale de 40 / 3 = 13 ns.

Am o altă versiune.El se bazează pe fostul.Fosta
lui multiplicare este 32x32.Eu folosesc un 8x8 de multiplicare pentru a înlocui,
ceea ce înseamnă o MUL / SMUAL insturction va avea nevoie de mai multe cicluri de a efectua decât fostul.Pentru ASIC, aceasta versiune este de foarte mare succes.În SMIC 0.18 um, fostul ar putea avea mai mult de 15 ns, dar aceasta versiune va rula 6 ~ 7 ns.Dar pentru FPGA, acesta nu pentru a reduce în mod semnificativ calea critică.Pentru ca un factor de multiplicare 32X32 este dedicat componente în FPGA, un 8x8 multipiler unele MUXs nu este atât de 32x32 mai bun decât un factor de multiplicare.

 
mathswork a scris:

Bună, kel8157

Este foarte uşor să aibă această bază în legătură cu un singur port de RAM.
Sunt familar cu RAM dual port, astfel încât această versiune este facut pentru asta.
Aş putea modifica unele linii.
Este usor.Critice calea dă-mi o mare problemă foarte mult.
Cred ca asta este motivul pentru ARM numele său de bază scăzute de energie de bază.
Ei nu trebuie să aibă posibilitatea de a imcrease sale de frecvenţă.
Deci, ARM9 are cinci etape de conducte, care are mai mult de 2 conducte ARM7.
Gândiţi-vă de faptul că, 40 ns împărţit prin 3, viitorul meu "arm9" va avea un critic cale de 40 / 3 = 13 ns.Am o altă versiune.
El se bazează pe fostul.
Fosta lui multiplicare este 32x32.
Eu folosesc un 8x8 de multiplicare pentru a înlocui, ceea ce înseamnă o MUL / SMUAL insturction va avea nevoie de mai multe cicluri de a efectua decât fostul.
Pentru ASIC, aceasta versiune este de foarte mare succes.
În SMIC 0.18 um, fostul ar putea avea mai mult de 15 ns, dar aceasta versiune va rula 6 ~ 7 ns.
Dar pentru FPGA, acesta nu pentru a reduce în mod semnificativ calea critică.
Pentru ca un factor de multiplicare 32X32 este dedicat componente în FPGA, un 8x8 multipiler unele MUXs nu este atât de 32x32 mai bun decât un factor de multiplicare.
 
Ce fel de efort pot sa-ti pui în ARM core design?În scopul de a pune în aplicare de bază cu componente standard precum ROM & SRAM, de testbench trebuie să fie modificate.Dacă aş schimba interfata pentru ROM / RAM de acces, crezi că ai putea modifica de bază pentru a se potrivi în cutie?

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

Cod:`define DEL 1

1 ns `de timp / 1 ns

modul tb_test;reg clk;

reg prima;

reg cpu_en;

reg cpu_restart;

reg irq;

reg fiq;sârmă rom_en;

sârmă [31:0] rom_addr;

reg [31:0] rom_data;

reg rom_abort;sârmă ram_en;

sârmă ram_wr_en;

sârmă [31:0] ram_addr;

sârmă [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];braţ u_arm (

. clk (clk), / / Sistem de ceas

. prima (prima), / / Sistem de reiniţializare insigne, ridicat valabil

. cpu_en (cpu_en), / / cpu permite semnal, valabil ridicat, nivel redus suspendă CPU.

. cpu_restart (cpu_restart), / / Pentru a reporni cpu, ridicat valide.

. irq de întrerupere (IRQ), / / IRQ întrerupe semnalul permite, de înaltă valabil

. fiq (fiq), / / FIQ întrerupe semnalul permite, de înaltă valabil. rom_en (rom_en), / / romĄŻs de instrucţiuni pe 32 de biţi, adresa

. rom_addr (rom_addr), / / romĄŻs de instrucţiuni pe 32 de biţi, adresa

. rom_data (rom_data), / / de instrucţiuni stocate într-ROM

. rom_abort (rom_abort), / / Această instrucţiune nu este valabil în cazul în care acest semnal menţine ridicat.. ram_en (ram_en), / / Ram citit permite semnal, mici = selectaţi

. ram_wr_en (ram_wr_en), / / Ram scrie permite semnal, mici = scrie, mare = citeşte

. ram_addr (ram_addr), / / Ram citit adresa

. ram_wr_data (ram_wr_data), / / scrie date de semnale Ram.

. ram_rd_data (ram_rd_data), / / Ram citeşte semnale de date

. ram_rd_abort (ram_rd_abort) / / date pe o ° ram_rd_dataĄą nu este valabil în cazul în care acesta ţine de înaltă

);iniţială a începe

clk = 1'b0;

cpu_en = 1'b0;

cpu_restart = 1'b0;

rom_abort = 1'b0;

irq = 1'b0;

fiq = 1'b0;

prima = 1'b0;

# 10 prima = 1'b1;

# 20 prima = 1'b0;

cpu_en = 1'b1;

cpu_restart = 1'b1;

# 10 cpu_restart = 1'b0;finalîntotdeauna clk = # 5 ~ clk;/ / ROM secţiune, nevoia de a utiliza un semnal de Activare, care mai uşor să lucreze cu flash sau PROM.

/ / De citit de la ROM cod atunci când ram_addr [31:28] == 4'h0 nevoie de modificări,

/ / Altfel de arbitraj cu ROM trebuie să fie puse în aplicare.

mereu @ (posedge clk) începe

dacă (rom_en) începe

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]);

final

final/ / RAM secţiune, folosind standardul singur port de RAM.

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

integer i;

iniţială a începe

ram_rd_abort = 1'b0;

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

ram_data = 8'h0;

finalmereu @ (posedge clk) începe

dacă (ram_en & (ram_wr_en == 1'b1)) începe

dacă (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) / / În cazul în care acest citi este mutat într-ROM interfaţă, este mai uşor de RAM.

ram_rd_data <= # "DEL ram_rd_data_from;

altceva;

finaldacă (ram_en & (ram_wr_en == 1'b0) şi (ram_addr [31:28] == 4'h4)) începe

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];

final

final/************************************************* *************/

parametru memLoadFile = "./data_test/keil_03.bin";integer n, J;

reg [127:0] tmp;

iniţială a începe

dacă (memLoadFile! = "") începe

$ readmemh (memLoadFile, rom_tmp); / / Pentru a utiliza acest lucru, copiaţi şi completaţi secţiunea HEX vacant octeţi în ultimul rând cu xx

pentru (n = 0; n <2048; n = n 1) începe

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];

$ display ( "în% h", tmp);

$ display ( "Out% h% h% h% h% h% h% h% h% h% h% h% h% h% h% h% 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]);

final

/ / $ Readmemh (memLoadFile, rom_all);

final

final
endmodule
 
kel8157,
Buna, am putut face asta.
Attatched este unele versiuni am făcut în ultima vreme.

Orice problemă, vă rugăm să-mi mail.
Ne pare rău, dar ai nevoie de autentificare pentru a vizualiza acest ataşament

 
mathswork a scris:

kel8157,

Buna, am putut face asta.

Attatched este unele versiuni am făcut în ultima vreme.Orice problemă, vă rugăm să-mi mail.
 
Bună, kel8157,

Am descarcat-o într-mea fpga bord: digilent
de spartan-3e Starter Kit.

Eu folosesc UART bin pentru a descărca fişierul pentru a ROM, şi ar putea vedea dacă funcţionează imediat.Asta înseamnă că FPGA bord deveni un braţ dezvoltarea de bord.

Noul bază sa îmbunătăţit mai mult.Critice cale este de numai 26 ns (înainte este de 40 ns).

Cât despre tine?Aveţi nevoie de ajutor?

 
mathswork a scris:

Bună, kel8157,Am descarcat-o într-mea fpga bord: digilent de spartan-3e Starter Kit.Eu folosesc UART bin pentru a descărca fişierul pentru a ROM, şi ar putea vedea dacă funcţionează imediat.
Asta înseamnă că FPGA bord deveni un braţ dezvoltarea de bord.Noul bază sa îmbunătăţit mai mult.
Critice cale este de numai 26 ns (înainte este de 40 ns).Cât despre tine?
Aveţi nevoie de ajutor?
 

Welcome to EDABoard.com

Sponsor

Back
Top