Sebuah ARM7v4 IP Core.

M

mathswork

Guest
Hi, semua
Saya telah mengembangkan ARMv4 IP core.Belum ARM khas bus, tetapi bekerja dengan baik.Aku perlu bantuan dari siapapun untuk membungkus sebagai inti IP yang khas, atau dukungan setiap testcase bagi saya.Inti ini sangat kecil: a. V file kurang dari 2000 baris.Setiap orang dapat menggunakannya, aku hanya butuh saran Anda untuk mengembangkan dengan baik.

Aku ingin meletakkannya untuk opencores.org, tapi itu ditolak.

Inti IP ini adalah ARM clone.Ini memiliki arsitektur yang sama ARM v4.Fitur utamanya daftar:

- Tidak mendukung instruksi Coprocessor

- Tidak mendukung set instruksi THUMB

- Semua menyela didukung

- Instruksi-instruksi ini didukung, kecuali Coprocessor instruksi.
LDR; ldrb; str; strb; ldrh; strh; ldrsb; ldrsh; SWP; swpb; LDM; stm; b; bx; dp; mult; multl; Swi; mrs; MSR;

- Little-endian format.

- Inti IP ini sangat kompak: kawasan ASIC kurang dari 30.000 gerbang (2 input gerbang NAND).

- Jalur kritis adalah salah satu yang memiliki 32 bit-32 bit pengali dan 64bit - 64bit adder, yang mengakumulasikan milik mengalikan instruksi panjang.

- Semua IP inti adalah satu-satunya. V file, yang memiliki panjang pendek: kurang dari 2000 baris.

- Hal ini dapat dibuka atau beku oleh menegaskan satu port input "cpu_en" untuk tingkat tinggi atau rendah, yang akan membantu mengurangi kekuatan lebih.Selain itu, jika membaca dari RAM membutuhkan lebih banyak siklus, inti IP bisa dibekukan sampai data dari ram disiapkan; jika hanya satu bus yang ada, itu juga dapat dibekukan sampai data atau instruksi siap.

- Tiga tahap pipa digunakan: fetch, decode, jalankan.Membaca dari ram akan membutuhkan lebih satu siklus karena ketika mengirimkan alamat untuk RAM, data harus disiapkan dalam siklus berikutnya.Pada waktu itu jika mengambil data yang digunakan sebagai salah satu operand, instruksi berikutnya harus ditinggalkan dan satu siklus cadangan terjadi.
Maaf, tapi Anda harus login untuk melihat lampiran

 
Sangat menarik.mathswork kau punya testbench, tes file ROM untuk pergi dengan itu?Kompiler macam apa yang Anda gunakan untuk mengkompilasi dari C kode?

 
Hi, kel8157
Tentu saja aku memiliki banyak testbench untuk itu dan Masing-masing ditujukan untuk instruksi tunggal.Ini adalah satu-satunya cara untuk memeriksa sebelumnya.Tapi sekarang, aku punya "Keil untuk lengan" diproduksi "Hex" file.Aku tahu sedikit untuk diembed pemrograman, dan saya harus belajar C programing untuk membuatnya bekerja.

Baru-baru ini, saya telah sukses besar.Aku dikompilasi satu contoh "Blinky" dari "Keil untuk lengan", dan simulasi di modelsim.It works perfectly.Langkah berikutnya, saya akan mendownload ke FPGA.

Jika Anda memiliki "Keil untuk lengan".Anda dapat dengan mudah menemukan contoh ini di "D: \ Keil \ ARM \ RV30 \ Contoh \ Blinky".Sebelum mengkompilasi, membuat "PLL_SETUP EQU 0" dan "MAM_SETUP EQU 0" di baris 117 dan 37 dari "startup.s".

Aku punya versi bagi Anda untuk mensimulasikan, jika Anda instresting.

Register internal, yang saya sebut saja "reg_r0" untuk "reg_rf", Anda dapat menarik gelombang itu ke jendela.Dan juga, Anda dapat menemukan "reg_re_usr", "cpsr_i", "cpsr_m".
Maaf, tapi Anda harus login untuk melihat lampiran

 
Hi mathswork,

diagram file dalam format jpg yang Anda berikan tampaknya akan disusutkan.Atau mungkin hanya saya alami seperti bug?

 
Ok, i have fixed it.re-download.Teks untuk menjelaskan hal itu di blog saya: h ** p: / / free-arm.blog.163.com

 
mathswork wrote:

Ok, i have fixed it.
re-download.
Teks untuk menjelaskan hal itu di blog saya: h ** p: / / free-arm.blog.163.com
 
mathswork wrote:

Hi, kel8157

Tentu saja aku memiliki banyak testbench untuk itu dan Masing-masing ditujukan untuk instruksi tunggal.
Ini adalah satu-satunya cara untuk memeriksa sebelumnya.
Tapi sekarang, aku punya "Keil untuk lengan" diproduksi "Hex" file.
Aku tahu sedikit untuk diembed pemrograman, dan saya harus belajar C programing untuk membuatnya bekerja.Baru-baru ini, saya telah sukses besar.
Aku dikompilasi satu contoh "Blinky" dari "Keil untuk lengan", dan simulasi di modelsim.
It works perfectly.
Langkah berikutnya, saya akan mendownload ke FPGA.Jika Anda memiliki "Keil untuk lengan".
Anda dapat dengan mudah menemukan contoh ini di "D: \ Keil \ ARM \ RV30 \ Contoh \ Blinky".
Sebelum mengkompilasi, membuat "PLL_SETUP EQU 0" dan "MAM_SETUP EQU 0" di baris 117 dan 37 dari "startup.s".Aku punya versi bagi Anda untuk mensimulasikan, jika Anda instresting.Register internal, yang saya sebut saja "reg_r0" untuk "reg_rf", Anda dapat menarik gelombang itu ke jendela.
Dan juga, Anda dapat menemukan "reg_re_usr", "cpsr_i", "cpsr_m".
 
Hai,
Saya senang mendengar bahwa Anda menaruh perhatian pada inti ip lenganku.Mungkin, Anda adalah orang kedua untuk mensimulasikan itu aku tahu.

Sedangkan 32x32 Pengganda, itu adalah komponen kunci dalam inti saya.Hampir setiap instruksi ARM membutuhkannya.Ia digunakan tidak hanya sebagai RmxRs Rn untuk mul instruksi, tetapi juga Rm>> Rs Rn untuk sebagian besar instruksi yang register geser.Ada barel shifter di dalamnya.Ketika saya ingin menggeser Rm kiri: LSL # 5, saya akan menetapkan Rs = 32'b1_0000, semakin rendah 32-bit dari RmXRs akan menjadi hasil.Jika saya ingin mendapatkan logis bergeser ke kanan: LSR # 5, saya akan menetapkan Rs = ~ 5 1 = 27, 32 bit yang lebih tinggi dari RmXRs adalah apa yang saya inginkan.

Jadi, jalur kritis yang panjang ini tidak begitu mudah untuk menghapusnya.Pada versi berikutnya, saya akan menggunakan 32x8 untuk menggantikannya.Jadi mul atau instruksi UMLA akan mengambil empat siklus untuk menerapkannya.Beberapa mux diperlukan untuk melaksanakan operasi pergeseran menggunakan pengali 32x8 ini.

yang Keil yang saya gunakan adalah download dari: http://www.atarm.com/software/Keil303a.rar.Hal ini hanya 60 MB.Jika Anda membuat Anda CID melalui "File" -> "Lisensi Manajemen" -> CID, input ke "keygen_edge.exe".Versi ini mudah digunakan.

Aku menarik dengan pas ke dalam FPGA.

 
cool ..terima kasih atas upaya mathswork ..sejauh ini saya melihat dua potensi peningkatan, satu adalah SRAM, saya perhatikan kebutuhan inti port ganda RAM, adalah sulit untuk recode inti untuk menggunakan satu port SRAM?Kedua adalah masalah pengali, mengurangi jalur kritis untuk 40ns pada Spartan-E ..

 
Hi, kel8157
Sangat mudah untuk memiliki inti ini terhubung dengan satu port RAM.Saya familar dengan dual port RAM, sehingga versi ini dibuat untuk itu.Aku bisa memodifikasi beberapa baris.Mudah.

Jalur kritis memberiku masalah besar yang sangat banyak.Saya pikir itu sebabnya nama ARM inti inti berdaya rendah.Mereka harus tidak memiliki pilihan untuk imcrease frekuensinya.Jadi ARM9 memiliki lima-tahap pipa, yang telah lebih dari 2 pipa ARM7.Pikirkan itu, 40 ns dibagi dengan 3, masa depan saya "arm9" akan memiliki jalur kritis 40 / 3 = 13 ns.

Aku punya versi lain.Hal ini didasarkan pada mantan.Mantan's multiplier adalah 32x32.Saya menggunakan 8x8 pengganda untuk menggantinya, yang berarti mul / SMUAL insturction akan membutuhkan lebih banyak siklus untuk melaksanakan daripada yang pertama.Untuk ASIC, versi ini sangat berhasil.Dalam SMIC 0,18 mm, mantan bisa memiliki lebih dari 15 ns, namun versi ini akan berjalan 6 ~ 7 ns.Tapi untuk FPGA, gagal untuk mengurangi jalur kritis secara signifikan.Karena 32x32 pengali adalah komponen yang berdedikasi di FPGA, sebuah 8x8 multipiler beberapa MUXs tidak begitu lebih baik daripada pengganda 32x32.

 
mathswork wrote:

Hi, kel8157

Sangat mudah untuk memiliki inti ini terhubung dengan satu port RAM.
Saya familar dengan dual port RAM, sehingga versi ini dibuat untuk itu.
Aku bisa memodifikasi beberapa baris.
Mudah.Jalur kritis memberiku masalah besar yang sangat banyak.
Saya pikir itu sebabnya nama ARM inti inti berdaya rendah.
Mereka harus tidak memiliki pilihan untuk imcrease frekuensinya.
Jadi ARM9 memiliki lima-tahap pipa, yang telah lebih dari 2 pipa ARM7.
Pikirkan itu, 40 ns dibagi dengan 3, masa depan saya "arm9" akan memiliki jalur kritis 40 / 3 = 13 ns.Aku punya versi lain.
Hal ini didasarkan pada mantan.
Mantan's multiplier adalah 32x32.
Saya menggunakan 8x8 pengganda untuk menggantinya, yang berarti mul / SMUAL insturction akan membutuhkan lebih banyak siklus untuk melaksanakan daripada yang pertama.
Untuk ASIC, versi ini sangat berhasil.
Dalam SMIC 0,18 mm, mantan bisa memiliki lebih dari 15 ns, namun versi ini akan berjalan 6 ~ 7 ns.
Tapi untuk FPGA, gagal untuk mengurangi jalur kritis secara signifikan.
Karena 32x32 pengali adalah komponen yang berdedikasi di FPGA, sebuah 8x8 multipiler beberapa MUXs tidak begitu lebih baik daripada pengganda 32x32.
 
Jenis usaha apa yang dapat Anda masukkan ke inti ARM desain?Dalam rangka untuk melaksanakan inti dengan komponen standar seperti ROM & SRAM, yang testbench harus dimodifikasi.Jika saya mengubah antarmuka untuk ROM / RAM akses, apakah Anda pikir Anda dapat memodifikasi agar sesuai inti di dalam kotak?

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

Kode:`define DEL 1

`skala waktu 1 ns / 1 ns

modul tb_test;reg CLK;

reg terlebih dulu;

reg cpu_en;

reg cpu_restart;

reg irq;

reg fiq;kawat rom_en;

kawat [31:0] rom_addr;

reg [31:0] rom_data;

reg rom_abort;kawat ram_en;

kawat ram_wr_en;

kawat [31:0] ram_addr;

kawat [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];lengan u_arm (

. CLK (CLK), / / System clock

. terlebih dulu (terlebih dulu), / / System reset pin, berlaku tinggi

. cpu_en (cpu_en), / / Cpu mengaktifkan sinyal, berlaku tinggi, tingkat rendah menunda cpu.

. cpu_restart (cpu_restart), / / Untuk restart cpu, berlaku tinggi.

. irq (irq), / / IRQ mengganggu mengaktifkan sinyal, berlaku tinggi

. fiq (fiq), / / FIQ mengganggu mengaktifkan sinyal, berlaku tinggi. rom_en (rom_en), / / Instruksi romĄŻs alamat 32-bit

. rom_addr (rom_addr), / / Instruksi romĄŻs alamat 32-bit

. rom_data (rom_data), / / Instruksi yang tersimpan dalam ROM

. rom_abort (rom_abort), / / perintah ini tidak sah jika sinyal ini tetap tinggi.. ram_en (ram_en), / / Ram membaca mengaktifkan sinyal, rendah = pilih

. ram_wr_en (ram_wr_en), / / Ram menulis mengaktifkan sinyal, rendah = menulis, tinggi = membaca

. ram_addr (ram_addr), / / Ram alamat dibaca

. ram_wr_data (ram_wr_data), / / Ram menulis data sinyal.

. ram_rd_data (ram_rd_data), / / Ram membaca data sinyal

. ram_rd_abort (ram_rd_abort) / / data pada suatu ° ram_rd_dataĄą tidak valid jika tetap tinggi

)mulai awal

CLK = 1'b0;

cpu_en = 1'b0;

cpu_restart = 1'b0;

rom_abort = 1'b0;

irq = 1'b0;

fiq = 1'b0;

terlebih dulu = 1'b0;

# 10 terlebih dulu = 1'b1;

# 20 terlebih dulu = 1'b0;

cpu_en = 1'b1;

cpu_restart = 1'b1;

# 10 cpu_restart = 1'b0;akhirselalu CLK = # 5 ~ CLK;/ / ROM bagian, perlu untuk menggunakan sinyal Aktifkan, yang lebih mudah untuk bekerja dengan flash atau PROM.

/ / The membaca dari kode ROM ketika ram_addr [31:28] == 4'h0 perlu modifikasi,

/ / Jika tidak arbitrase dengan ROM harus dilaksanakan.

selalu @ (posedge CLK) mulai

if (rom_en) mulai

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

akhir

akhir/ / RAM bagian, dengan menggunakan satu standar port RAM.

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

integer i;

mulai awal

ram_rd_abort = 1'b0;

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

ram_data = 8'h0;

akhirselalu @ (posedge CLK) mulai

if (ram_en & (ram_wr_en == 1'b1)) mulai

if (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) / / Jika baca ini akan dipindahkan ke antarmuka ROM, akan lebih mudah bagi RAM.

ram_rd_data <= # `DEL ram_rd_data_from;

lain;

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

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

akhir

akhir/************************************************* *************/

Parameter memLoadFile = "./data_test/keil_03.bin";integer n, j;

reg [127:0] tmp;

mulai awal

if (memLoadFile! = "") mulai

$ readmemh (memLoadFile, rom_tmp); / / Untuk menggunakan ini, salin dan isi bagian HEX byte kosong di baris terakhir dengan xx

for (n = 0; n <2048; n = n 1) mulai

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 ( "DI% h", tmp);

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

akhir

/ / $ Readmemh (memLoadFile, rom_all);

akhir

akhir
endmodule
 
kel8157,
hi, aku bisa melakukan itu.
Attatched adalah beberapa versi saya lakukan baru-baru ini.

Setiap masalah silahkan mail me.
Maaf, tapi Anda harus login untuk melihat lampiran

 
mathswork wrote:

kel8157,

hi, aku bisa melakukan itu.

Attatched adalah beberapa versi saya lakukan baru-baru ini.Setiap masalah silahkan mail me.
 
Hi, kel8157,

Aku telah didownload ke papan FPGA saya: digilent's spartan-3e starter kit.

Saya menggunakan UART untuk men-download file bin ROM, dan bisa melihatnya bekerja segera.Itu berarti dewan FPGA menjadi developping ARM papan.

Inti baru telah membaik.Jalur kritis hanya 26 ns (sebelum adalah 40 ns).

Bagaimana dengan Anda?perlu bantuan?

 
mathswork wrote:

Hi, kel8157,Aku telah didownload ke papan FPGA saya: digilent's spartan-3e starter kit.Saya menggunakan UART untuk men-download file bin ROM, dan bisa melihatnya bekerja segera.
Itu berarti dewan FPGA menjadi developping ARM papan.Inti baru telah membaik.
Jalur kritis hanya 26 ns (sebelum adalah 40 ns).Bagaimana dengan Anda?
perlu bantuan?
 

Welcome to EDABoard.com

Sponsor

Back
Top