OpenCores
URL https://opencores.org/ocsvn/mips789/mips789/trunk

Subversion Repositories mips789

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 3 to Rev 4
    Reverse comparison

Rev 3 → Rev 4

/branches/mcupro/bench/led/mips_led.v
0,0 → 1,76
 
 
module mips_led (clk,key2,rst,cop_data,irq_addr,seg7led1,seg7led2) ;
input clk;
wire clk;
input key2;
wire key2;
input rst;
wire rst;
input [31:0] cop_data;
wire [31:0] cop_data;
input [31:0] irq_addr;
wire [31:0] irq_addr;
output [6:0] seg7led1;
wire [6:0] seg7led1;
output [6:0] seg7led2;
wire [6:0] seg7led2;
 
wire [31:0] cop_addr;
wire [3:0] cop_mem_ctl;
wire [31:0] data2cop;
wire [31:0] data2core;
wire [31:0] data2mem;
wire [31:0] ins2core;
wire [31:0] mem_Addr;
wire [31:0] pc;
wire [3:0] wr_en;
 
mips_core1 mips_core_
(
.clk(clk),
.cop_addr_o(cop_addr),
.cop_data_o(data2cop),
.cop_dout(cop_data),
.cop_mem_ctl_o(cop_mem_ctl),
.irq_addr(irq_addr),
.irq_i(key2),
.rst(rst),
.zz_addr_o(mem_Addr),
.zz_din(data2core),
.zz_dout(data2mem),
.zz_ins_i(ins2core),
.zz_pc_o(pc),
.zz_wr_en_o(wr_en)
);
 
 
 
mem_array ram_4k
(
.clk(clk),
.din(data2mem),
.dout(data2core),
.ins_o(ins2core),
.pc_i(pc),
.rd_addr_i(mem_Addr),
.wr_addr_i(mem_Addr),
.wren(wr_en)
);
 
 
 
mips_seg7led seg7led
(
.addr_i(cop_addr),
.clk(clk),
.din(data2cop),
.dmem_ctl_i(cop_mem_ctl),
.rst(rst),
.seg7led1(seg7led1),
.seg7led2(seg7led2)
);
 
 
 
endmodule
/branches/mcupro/doc/mips_struct.pdf Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
branches/mcupro/doc/mips_struct.pdf Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/mcupro/verilog/device/seg7led.v =================================================================== --- branches/mcupro/verilog/device/seg7led.v (nonexistent) +++ branches/mcupro/verilog/device/seg7led.v (revision 4) @@ -0,0 +1,49 @@ +`define SEG7LED_ADDR 'H80_00_00_10 +`define DMEM_SB 1 + +module mips_seg7led ( + input [31:0] addr_i, + input clk, + input [31:0] din, + input [3:0]dmem_ctl_i, + input rst, + output [6:0]seg7led1, + output [6:0]seg7led2 +); + +reg [7:0] data; + +wire wr_seg7led; +assign wr_seg7led= (addr_i==`SEG7LED_ADDR)&&(dmem_ctl_i==`DMEM_SB ) ; +always @(posedge clk) + if (wr_seg7led) + data<=din[7:0]; //no matter big-endian or little + + assign seg7led1= seg(data[3:0]) ; + assign seg7led2= seg(data[7:4]) ; + + function [7:0] seg; + input [3:0] addr; + begin + case(addr) + 0: seg = 7'b0111111; + 1: seg = 7'b0000110; + 2: seg = 7'b1011011; + 3: seg = 7'b1001111; + 4: seg = 7'b1100110; + 5: seg = 7'b1101101; + 6: seg = 7'b1111100; + 7: seg = 7'b0000111; + 8: seg = 7'b1111111; + 9: seg = 7'b1100111; + 10: seg = 7'b1110111; + 11: seg = 7'b1111100; + 12: seg = 7'b1011000; + 13: seg = 7'b1011110; + 14: seg = 7'b1111001; + 15: seg = 7'b1110001; + default: seg = {7{1'b0}}; + endcase + end + endfunction +endmodule \ No newline at end of file Index: branches/mcupro/verilog/mips_core/cal_cpi.v =================================================================== --- branches/mcupro/verilog/mips_core/cal_cpi.v (revision 3) +++ branches/mcupro/verilog/mips_core/cal_cpi.v (revision 4) @@ -42,9 +42,9 @@ //// //// //// Version: 0.0.1 //// //// //// -//// Description: //// +//// Description: For simulations only to calculate the CPI //// +//// Cycles Per Instruction //// //// //// -//// //// ///////////////////////////////////////////////////////////////////// //// //// //// Change log: //// Index: branches/mcupro/tools_source_code/convert_sp.c =================================================================== --- branches/mcupro/tools_source_code/convert_sp.c (nonexistent) +++ branches/mcupro/tools_source_code/convert_sp.c (revision 4) @@ -0,0 +1,294 @@ +/* convert.c by Steve Rhoads 4/26/01 */ +/* Now uses the ELF format (get gccmips_elf.zip) */ +/* set $gp and zero .sbss and .bss */ +/* Reads test.axf and creates code.txt */ +/*modified by Liwei 2007-8-29*/ +#include +#include +#include +#define BUF_SIZE (1024*1024*4) +/*Assumes running on PC little endian*/ +#ifndef USE_BIG_ENDIAN +#define ntohl(A)(((A)>>24)|(((A)&0x00ff0000)>>8)|(((A)&0xff00)<<8)|((A)<<24)) +#define ntohs(A)(unsigned short)((((A)&0xff00)>>8)|((A)<<8)) +#else +#define ntohl(A)A +#define ntohs(A)A +#endif + +#define EI_NIDENT 16 +#define SHT_PROGBITS 1 +#define SHT_STRTAB 3 +#define SHT_NOBITS 8 + +typedef struct +{ + unsigned char e_ident[EI_NIDENT]; + unsigned short e_e_type ; + unsigned short e_machine ; + unsigned long e_version ; + unsigned long e_entry ; + unsigned long e_phoff ; + unsigned long e_shoff ; + unsigned long e_flags ; + unsigned short e_ehsize ; + unsigned short e_phentsize ; + unsigned short e_phnum ; + unsigned short e_shentsize ; + unsigned short e_shnum ; + unsigned short e_shstrndx ; +} +ElfHeader ; + +typedef struct +{ + unsigned long p_type ; + unsigned long p_offset ; + unsigned long p_vaddr ; + unsigned long p_paddr ; + unsigned long p_filesz ; + unsigned long p_memsz ; + unsigned long p_flags ; + unsigned long p_align ; +} +Elf32_Phdr ; + +typedef struct +{ + unsigned long sh_name ; + unsigned long sh_type ; + unsigned long sh_flags ; + unsigned long sh_addr ; + unsigned long sh_offset ; + unsigned long sh_size ; + unsigned long sh_link ; + unsigned long sh_info ; + unsigned long sh_addralign ; + unsigned long sh_entsize ; +} +Elf32_Shdr ; + +typedef struct +{ + unsigned long ri_gprmask ; + unsigned long ri_cprmask[4]; + unsigned long ri_gp_value ; +} +ELF_RegInfo ; + +#define PT_MIPS_REGINFO 0x70000000 +#define SHT_MIPS_REGINFO 0x70000006 + +void set_low(unsigned char*ptr,unsigned long address,unsigned long value) +{ + unsigned long opcode ; + opcode=*(unsigned long*)(ptr+address); + opcode=ntohl(opcode); + opcode=(opcode&0xffff0000)|(value&0xffff); + opcode=ntohl(opcode); + *(unsigned long*)(ptr+address)=opcode ; +} + +/*the two functions listed between are added by Liwei 2007-8-29*/ + char HEX[]="0123456789ABCDEF" ; + char hex[]="0123456789abcdef" ; +unsigned char hex2byte( char hex_char) +{ + unsigned char i ; + for(i=0;i<16;++i)if(HEX[i]==hex_char)return i ; + for(i=0;i<16;++i)if(hex[i]==hex_char)return i ; + return 0 ; +} +unsigned int par2u32(char*par) +{ + unsigned int i,ret=0 ; + if(par==NULL)return ; + if((0==strncmp(par,"0x",2))||(0==strncmp(par,"0X",2))) + for(i=2;;++i) {if(par[i]=='\0')return ret ; ret=ret*16+hex2byte(par[i]);} + else + for(i=0;;++i) {if(par[i]=='\0')return ret ; ret=ret*10+hex2byte(par[i]);} + return 0 ; +} +/****************************/ + +int main(int argc,char*argv[]) +{ + FILE*infile,*outfile,*txtfile ; + unsigned char*buf,*code ; + long size,stack_pointer; + long stack_limit=0 ; + unsigned long length,d,i,gp_ptr=0,gp_ptr_backup=0 ; + unsigned long bss_start=0,bss_end=0 ; + + ElfHeader*elfHeader ; + Elf32_Phdr*elfProgram ; + ELF_RegInfo*elfRegInfo ; + Elf32_Shdr*elfSection ; + (void)argc ; + (void)argv ; +// printf(">%s<=>%d<\n",argv[1],par2u32((char*)argv[1]));//Liwei 2007-8.29 + // printf(">%s<=>%d<\n",argv[2],par2u32((char*)argv[2]));//Liwei 2007-8.29 +// printf("argc = %d\n",argc); + if (argc>=3) + stack_limit=((par2u32((char*)argv[1]) - par2u32((char*)argv[2])));//alig 4 + /* added by Liwei 2007_8_29 */ + /*usage example : + convert_sp 0x800 0xf0 + the sp_pointer is limited and set as (0x800 - 0xf0) + 0x800 is your instructions space lenth while 0xf0 is your stack lenth + but make sure your instructions space is big enough... + comment by Liwei + */ + printf("test.axf -> code.txt & test.bin\n"); + infile=fopen("test.axf","rb"); + if(infile==NULL) + { + printf("Can't open test.axf"); + return 0 ; + } + buf=(unsigned char*)malloc(BUF_SIZE); + size=(int)fread(buf,1,BUF_SIZE,infile); + fclose(infile); + code=(unsigned char*)malloc(BUF_SIZE); + memset(code,0,BUF_SIZE); + + elfHeader=(ElfHeader*)buf ; + if(strncmp((char*)elfHeader->e_ident+1,"ELF",3)) + { + printf("Error: Not an ELF file!\n"); + printf("Use the gccmips_elf.zip from opencores/projects/plasma!\n"); + return-1 ; + } + + elfHeader->e_entry=ntohl(elfHeader->e_entry); + elfHeader->e_phoff=ntohl(elfHeader->e_phoff); + elfHeader->e_shoff=ntohl(elfHeader->e_shoff); + elfHeader->e_flags=ntohl(elfHeader->e_flags); + elfHeader->e_phentsize=ntohs(elfHeader->e_phentsize); + elfHeader->e_phnum=ntohs(elfHeader->e_phnum); + elfHeader->e_shentsize=ntohs(elfHeader->e_shentsize); + elfHeader->e_shnum=ntohs(elfHeader->e_shnum); + printf("Entry=0x%x ",elfHeader->e_entry); + length=0 ; + + for(i=0;ie_phnum;++i) + { + elfProgram=(Elf32_Phdr*)(buf+elfHeader->e_phoff+ + elfHeader->e_phentsize*i); + elfProgram->p_type=ntohl(elfProgram->p_type); + elfProgram->p_offset=ntohl(elfProgram->p_offset); + elfProgram->p_vaddr=ntohl(elfProgram->p_vaddr); + elfProgram->p_filesz=ntohl(elfProgram->p_filesz); + elfProgram->p_memsz=ntohl(elfProgram->p_memsz); + elfProgram->p_flags=ntohl(elfProgram->p_flags); + + elfProgram->p_vaddr-=elfHeader->e_entry ; + + if(elfProgram->p_type==PT_MIPS_REGINFO) + { + elfRegInfo=(ELF_RegInfo*)(buf+elfProgram->p_offset); + gp_ptr=ntohl(elfRegInfo->ri_gp_value); + } + if(elfProgram->p_vaddrp_vaddr, */ + /* elfProgram->p_offset, elfProgram->p_filesz, elfProgram->p_memsz, */ + /* elfProgram->p_flags); */ + memcpy(code+elfProgram->p_vaddr,buf+elfProgram->p_offset, + elfProgram->p_filesz); + length=elfProgram->p_vaddr+elfProgram->p_filesz ; + /* printf("length = %d 0x%x\n", length, length); */ + } + } + + for(i=0;ie_shnum;++i) + { + elfSection=(Elf32_Shdr*)(buf+elfHeader->e_shoff+ + elfHeader->e_shentsize*i); + elfSection->sh_name=ntohl(elfSection->sh_name); + elfSection->sh_type=ntohl(elfSection->sh_type); + elfSection->sh_addr=ntohl(elfSection->sh_addr); + elfSection->sh_offset=ntohl(elfSection->sh_offset); + elfSection->sh_size=ntohl(elfSection->sh_size); + + if(elfSection->sh_type==SHT_MIPS_REGINFO) + { + elfRegInfo=(ELF_RegInfo*)(buf+elfSection->sh_offset); + gp_ptr=ntohl(elfRegInfo->ri_gp_value); + } + if(elfSection->sh_type==SHT_PROGBITS) + { + /* printf("elfSection->sh_addr=0x%x\n", elfSection->sh_addr); */ + if(elfSection->sh_addr>gp_ptr_backup) + gp_ptr_backup=elfSection->sh_addr ; + } + if(elfSection->sh_type==SHT_NOBITS) + { + if(bss_start==0) + { + bss_start=elfSection->sh_addr ; + } + bss_end=elfSection->sh_addr+elfSection->sh_size ; + } + } + + if(length>bss_start-elfHeader->e_entry) + { + length=bss_start-elfHeader->e_entry ; + } + if(bss_start==length) + { + bss_start=length ; + bss_end=length+4 ; + } + if(gp_ptr==0) + gp_ptr=gp_ptr_backup+0x7ff0 ; + + /* #if 0 */ + /*Initialize the $gp register for sdata and sbss */ + printf("gp_ptr=0x%x ",gp_ptr); + /*modify the first opcodes in boot.asm */ + /*modify the lui opcode */ + set_low(code,0,gp_ptr>>16); + /*modify the ori opcode */ + set_low(code,4,gp_ptr&0xffff); + + /*Clear .sbss and .bss */ + printf("sbss=0x%x bss_end=0x%x\nlength=0x%x ",bss_start,bss_end,length); + set_low(code,8,bss_start>>16); + set_low(code,12,bss_start&0xffff); + set_low(code,16,bss_end>>16); + set_low(code,20,bss_end&0xffff); + + /*Set stack pointer */ + if(elfHeader->e_entry<0x10000000) + stack_pointer=bss_end+512 ; + else + stack_pointer=bss_end+1024*4 ; + + if(stack_limit)stack_pointer=(stack_pointer>16); + set_low(code,28,stack_pointer&0xffff); + /* #endif */ + + /*write out test.bin */ + outfile=fopen("test.bin","wb"); + fwrite(code,length,1,outfile); + fclose(outfile); + + + /*write out code.txt */ + txtfile=fopen("code.txt","w"); + for(i=0;i<=length;i+=4) + { + d=ntohl(*(unsigned long*)(code+i)); + fprintf(txtfile,"%8.8x\n",d); + } + fclose(txtfile); + free(buf); + printf("\n"); + return 0 ; +} Index: branches/mcupro/tools_source_code/gensim.c =================================================================== --- branches/mcupro/tools_source_code/gensim.c (nonexistent) +++ branches/mcupro/tools_source_code/gensim.c (revision 4) @@ -0,0 +1,113 @@ +#include "stdio.h" +main(int file_no,char*file_name[]) +{ + int j=4,i=0 ; + int cntr ; + char str1[100],str2[111]; + /* + FILE*ff=fopen(file_name[1],"r"); + FILE*ft=fopen(file_name[2],"w"); + */ + FILE*ff=fopen("code.txt","r"); + FILE*ft=fopen("sim_ram.v","w"); + for(j=0;j<4;++j) + { + cntr = -10; + fprintf(ft,"module sim_syn_ram%d(\n",j); + fprintf(ft," data,\n"); + fprintf(ft," wraddress,\n"); + fprintf(ft," rdaddress_a,\n"); + fprintf(ft," rdaddress_b,\n"); + fprintf(ft," wren,\n"); + fprintf(ft," clock,\n"); + fprintf(ft," qa,\n"); + fprintf(ft," qb);\n\n"); + fprintf(ft," input [7:0] data;\n"); + fprintf(ft," input [10:0] wraddress;\n"); + fprintf(ft," input [10:0] rdaddress_a;\n"); + fprintf(ft," input [10:0] rdaddress_b;\n"); + fprintf(ft," input wren;\n"); + fprintf(ft," reg [7:0] r_data;\n"); + fprintf(ft," reg [10:0] r_wraddress;\n"); + fprintf(ft," reg [10:0] r_rdaddress_a;\n"); + fprintf(ft," reg [10:0] r_rdaddress_b;\n"); + fprintf(ft," reg r_wren;\n"); + fprintf(ft," input clock;\n"); + fprintf(ft," output [7:0] qa;\n"); + fprintf(ft," output [7:0] qb;\n"); + fprintf(ft," reg [7:0] mem_bank [0:2047] ;\n"); + + fprintf(ft," initial begin \n "); + rewind(ff); + i=-1 ; + + while(fgets(str2,100,ff)) + { + ++i ; + if(3==j) + { + str2[2]=0 ; + fprintf(ft,"mem_bank[%d] = 'h%s ; ",i,&str2[0]); + ++cntr ; + if(!(cntr%10)) + { + cntr==0 ; + fprintf(ft,"\n "); + } + } + else + if(2==j) + { + str2[4]=0 ; + + fprintf(ft,"mem_bank[%d] = 'h%s ; ",i,&str2[2]); + + ++cntr ; + if(!(cntr%10)) + { + cntr==0 ; + fprintf(ft,"\n "); + } + } + else + if(1==j) + { + str2[6]=0 ; + fprintf(ft,"mem_bank[%d] = 'h%s ; ",i,&str2[4]); + + ++cntr ; + if(!(cntr%10)) + { + cntr==0 ; + fprintf(ft,"\n "); + } + } + else + if(0==j) + { + str2[8]=0 ; + fprintf(ft,"mem_bank[%d] = 'h%s ; ",i,&str2[6]); + + ++cntr ; + if(!(cntr%10)) + { + cntr==0 ; + fprintf(ft,"\n "); + } + } + } + fprintf(ft," \n end\n"); + fprintf(ft," always @ (posedge clock) if (r_wren) mem_bank[r_wraddress]<=r_data;\n"); + fprintf(ft," always @ (posedge clock)\n"); + fprintf(ft," begin\n"); + fprintf(ft," r_data<=data;\n"); + fprintf(ft," r_wraddress<=wraddress;\n"); + fprintf(ft," r_rdaddress_a<=rdaddress_a;\n"); + fprintf(ft," r_rdaddress_b<=rdaddress_b;\n"); + fprintf(ft," r_wren<=wren;\n"); + fprintf(ft," end\n"); + fprintf(ft," assign qa =mem_bank[r_rdaddress_a];\n"); + fprintf(ft," assign qb =mem_bank[r_rdaddress_b];\n"); + fprintf(ft,"endmodule\n\n\n\n"); + } +} Index: branches/mcupro/tools_source_code/genmif.c =================================================================== --- branches/mcupro/tools_source_code/genmif.c (nonexistent) +++ branches/mcupro/tools_source_code/genmif.c (revision 4) @@ -0,0 +1,53 @@ +#include "stdio.h" +#include "stdlib.h" +#define DEFAULT_LEN "2048" +void main(int argc,char *argv[]) +{ + int j=4,i=0 ; + char str1[100],str2[111]; + FILE*ff=fopen("code.txt","r"); + FILE*ft ; + for(j=0;j<4;++j) + { + if(j==0) + ft=fopen("qu2_ram0.mif","w"); + else if(j==1) + ft=fopen("qu2_ram1.mif","w"); + else if(j==2) + ft=fopen("qu2_ram2.mif","w"); + else if(j==3) + ft=fopen("qu2_ram3.mif","w"); + fprintf(ft,"WIDTH=8;\n"); + fprintf(ft,"DEPTH=%s;\n\n",(NULL!=argv[1])?argv[1]:DEFAULT_LEN); + fprintf(ft,"ADDRESS_RADIX=HEX;\n"); + fprintf(ft,"DATA_RADIX=HEX;\n\n"); + fprintf(ft,"CONTENT BEGIN \n"); + rewind(ff); + i=-1 ; + while(fgets(str2,100,ff)) + { + ++i ; + if(3==j) + { + str2[2]=0 ; + fprintf(ft," %X : %s;\n ",i,&str2[0]); + } + else if(2==j) + { + str2[4]=0 ; + fprintf(ft," %X : %s;\n ",i,&str2[2]); + } + else if(1==j) + { + str2[6]=0 ; + fprintf(ft," %X : %s;\n ",i,&str2[4]); + } + else if(0==j) + { + str2[8]=0 ; + fprintf(ft," %X : %s;\n ",i,&str2[6]); + } + } + fprintf(ft,"END;"); + } +} Index: branches/avendor/bench/cal_PI/pi.bmp =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: branches/avendor/bench/cal_PI/pi.bmp =================================================================== --- branches/avendor/bench/cal_PI/pi.bmp (nonexistent) +++ branches/avendor/bench/cal_PI/pi.bmp (revision 4)
branches/avendor/bench/cal_PI/pi.bmp Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/avendor/gccmips_elf/convert_sp.exe =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: branches/avendor/gccmips_elf/convert_sp.exe =================================================================== --- branches/avendor/gccmips_elf/convert_sp.exe (nonexistent) +++ branches/avendor/gccmips_elf/convert_sp.exe (revision 4)
branches/avendor/gccmips_elf/convert_sp.exe Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/avendor/gccmips_elf/gensim.exe =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: branches/avendor/gccmips_elf/gensim.exe =================================================================== --- branches/avendor/gccmips_elf/gensim.exe (nonexistent) +++ branches/avendor/gccmips_elf/gensim.exe (revision 4)
branches/avendor/gccmips_elf/gensim.exe Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/avendor/gccmips_elf/genmif.exe =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: branches/avendor/gccmips_elf/genmif.exe =================================================================== --- branches/avendor/gccmips_elf/genmif.exe (nonexistent) +++ branches/avendor/gccmips_elf/genmif.exe (revision 4)
branches/avendor/gccmips_elf/genmif.exe Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: branches/avendor/gccmips_elf/readme.txt =================================================================== --- branches/avendor/gccmips_elf/readme.txt (nonexistent) +++ branches/avendor/gccmips_elf/readme.txt (revision 4) @@ -0,0 +1,16 @@ +Download a file from +http://www.opencores.org/projects.cgi/web/mips/gccmips_elf.zip + +Extract it and copy files listed below in this folder. + +cywin1.dll +as.exe +gcc.exe +ld.exe +objdump.exe + +The usage of conver_sp.exe genmif.exe and gensim.exe please refrence to course code. + +Liwei +2007-8-29 +

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.