打印

用spartan6 做了个CPU, 还做了个编译器 ho ho ho

[复制链接]
3304|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
snk12|  楼主 | 2013-1-23 18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 snk12 于 2013-1-23 19:43 编辑

以前只写纯verilog代码, 最近突然想做个cpu, 然后就做了一个,定长指令,
支持直接寻址,间接寻址,内存访问,基本操作,flash,总线调度
显示器hsync,vsync的检测,然后再做了个编译器, 突然发现
用verilog写好久,编译好久的代码, 换成cpu以后真是太方便了
满足之余,记念一下, 其实 我是个c++程序员

相关帖子

沙发
ymind| | 2013-1-23 20:16 | 只看该作者
是sparc v8吗?

使用特权

评论回复
板凳
GoldSunMonkey| | 2013-1-23 22:33 | 只看该作者
恭喜恭喜啦。哈哈

使用特权

评论回复
地板
aceice| | 2013-1-24 15:43 | 只看该作者

使用特权

评论回复
5
sonjs| | 2013-1-24 16:17 | 只看该作者
厉害

使用特权

评论回复
6
jakfens| | 2013-1-24 17:30 | 只看该作者
:) 強 軟件都把硬件的工作給搶了

使用特权

评论回复
7
qin552011373| | 2013-1-24 21:38 | 只看该作者
牛人一枚  鉴定完毕

使用特权

评论回复
8
GoldSunMonkey| | 2013-1-24 23:08 | 只看该作者
qin552011373 发表于 2013-1-24 21:38
牛人一枚  鉴定完毕

你开个鉴定机构好了

使用特权

评论回复
9
snk12|  楼主 | 2013-1-24 23:32 | 只看该作者
本帖最后由 snk12 于 2013-1-24 23:35 编辑

不是sparc呢, 是自己拍脑袋的指令集, 加语法,函数调用,跳转等 像这样的
大家感受下,是不是挺简单的
读写flash部分
#define disabledq1 clearbit 22
///zxp complier 1.0
///zxp cpu
///flash read write
boot:
//aclearbit        22 //tristate dq1
disabledq1
setbit                24// clear hold( dq3 )
setbit                28// dq3 from tristate to enable

call enable_flash;

/////////////###write enable
//////////////////////////delete sector
call flash_write_enable
call flash_delete_sector
/////////////##do write
setbit                24// clear hold( dq3 )
setbit                28// dq3 from tristate to enable
call flash_write_enable
ebx=0x32000000                                //cmd and address
ecx=32
call flash_write_cmd
call flash_write_byte_qpi
clearbit 29        //disable flash
/////////////////////////////////////////////////////////////////////

///////////////////////////////////////
//call get_flash_id;
read_again:
clearbit        22 //tristate dq1
setbit                24// clear hold( dq3 )
setbit                28// dq3 from tristate to enable
call enable_flash
////////////////////////////////////////read 1 bytes
ebx=0x6b000000;
ecx=32;
call flash_write_cmd;
call dummy_clk;
for(ecx=0;ecx<1;ecx++){
        push ecx
        call flash_read_byte_qpi
        pop ecx
}
////////////////////////////////////////

clearbit 29        //disable flash
jmp read_again

flash_write_cmd:
setbit        21        //enable dq0
clearbit 20
for(ecx=ecx;ecx>0;ecx--){
        edx=ebx
        edx>>=31
        edx&=1;

        if(edx!=0){
                setbit 25
        }else{
                clearbit 25
        }
        setbit 20
        ebx<<=1;
        clearbit 20
}

//clearbit        21        //disble dq0
ret


///////******function
flash_read_byte_spi:
///////////////////////////////////////
mov ebx=0
for(ecx=8;ecx>0;ecx--){
        movbr edx        
        /////////////
        edx>>=29                                        //read from dq1
        edx&=1
        ebx<<=1
        ebx|=edx;
        /////////////
        setbit 20
        clearbit 20
}
eax=ebx
ret

///////******function
flash_read_byte_dpi:
//////////////////////////////////
mov ebx=0
for(ecx=4;ecx>0;ecx--){
        movbr edx        
        /////////////
        edx>>=28                                //read from dq0
        edx&=3
        ebx<<=2
        ebx|=edx;
        /////////////
        setbit 20
        clearbit 20
}
eax=ebx
ret

///////******function
flash_read_byte_qpi:
//////////////////////////////////
clearbit        22 //tristate dq1
clearbit        23 //tristate dq2
clearbit        24 //tristate dq3
mov ebx=0
for(ecx=2;ecx>0;ecx--){
        movbr edx        
        /////////////
        edx>>=28                        //read from dq0
        edx&=0xf
        ebx<<=4
        ebx|=edx;
        /////////////
        setbit 20
        clearbit 20
}
eax=ebx
ret

///////******function
get_flash_id:
///////////////////////////////////////////
ebx=0x9f000000;        ///cmd  from high to low
ecx=8;                                                ///cmd bit
call flash_write_cmd
for(ecx=0;ecx<4;ecx++){
        push ecx
        call flash_read_byte_spi
        pop ecx
}
ret

///////******function
enable_flash:
//////////////////////////////
clearbit 29
sleep(10);
setbit 29                //enable flash
sleep(10)
ret

///////******function
flash_write_enable:
ebx=0x06000000
ecx=8
call flash_write_cmd
clearbit 29        //disable flash
sleep 100000
call enable_flash
ret

///////******function
flash_write_disable:
ebx=0x04000000
ecx=8
call flash_write_cmd
ret

///////******function
flash_read_status:
ebx=0x05000000
ecx=8
call flash_write_cmd
ret

///////******function
flash_delete_sector:
ebx=0xd8000000
ecx=32
call flash_write_cmd
clearbit 29        //disable flash
call enable_flash

call wait_free
call enable_flash
ret

//////////////////////////////////////////
///////******function
wait_free:
call flash_read_status
read_status_back:
call flash_read_byte_spi

if(eax==0){
        ret
}
jmp read_status_back

///////******function
dummy_clk:
for(ecx=8;ecx>0;ecx--){
        setbit 20
        clearbit 20
}
ret


flash_write_byte_qpi:
setbit 21                //enable dq0
setbit 22                //enable dq1
setbit 23                //enable dq2
setbit 24                //enable dq3
mov ebx=0x44
ebx<<=24;
for(ecx=2;ecx>0;ecx--){
        edx=ebx
        ebx<<=1;
        edx>>=31
        if(edx!=0){
                setbit 28
        }else{
                clearbit 28
        }

        edx=ebx
        ebx<<=1;
        edx>>=31
        if(edx!=0){
                setbit 27
        }else{
                clearbit 27
        }

        edx=ebx
        ebx<<=1;
        edx>>=31
        if(edx!=0){
                setbit 26
        }else{
                clearbit 26
        }

        edx=ebx
        ebx<<=1;
        edx>>=31
        if(edx!=0){
                setbit 25
        }else{
                clearbit 25
        }


        /////////////
        setbit 20
        clearbit 20
}
ret


内存图像帧拷贝就这样写====
////////zxp complier 1.0
////////for zxp cpu
boot:
for(ecx=0;ecx<768;ecx++){
        edx=103
        edx*=ecx
        edx++
        loadram edx,103                //from ddr 3
        call reverse_col

        edx=103
        edx*=ecx
        edx+=414722;
        saveram edx,103        //to ddr3                        another buffer
}
call frame_copy                        //copy back to displaybuffer
//end
jmp boot

reverse_col:
push ecx
///read and reverse
for(ecx=0;ecx<103;ecx++){
        push ecx

        load ecx
        for(ecx=0;ecx<10;ecx++){
                movpr eax
                not eax
                [ecx]=eax
                ebx=[ecx]
        }
        //store back
        for(ecx=0;ecx<10;ecx++){
                eax=[ecx]
                movrp eax
        }
        movrw eax
        pop ecx
        save ecx
}

使用特权

评论回复
10
snk12|  楼主 | 2013-1-24 23:39 | 只看该作者
本帖最后由 snk12 于 2013-1-24 23:41 编辑

上面这些代码编译出来, 大该就1.5k左右, 用verilog写,就要写好多好多逻辑了........ 而且调试烦的不得了。
当然现在不支持单步执行, 所以如果要运行到哪里的时候想看下当前的寄存器值, 就在那条语名后插入一条end就行了。 对我现在来说,够用了:)

使用特权

评论回复
11
1003704680| | 2013-1-25 00:13 | 只看该作者
jakfens 发表于 2013-1-24 17:30
強 軟件都把硬件的工作給搶了

以后没饭吃了

使用特权

评论回复
12
jakfens| | 2013-1-25 08:56 | 只看该作者
1003704680 发表于 2013-1-25 00:13
以后没饭吃了

:D

使用特权

评论回复
13
ifpga| | 2013-1-25 16:04 | 只看该作者
牛人啊,搞C++的能把FPGA用成这样

使用特权

评论回复
14
GoldSunMonkey| | 2013-1-26 00:22 | 只看该作者
ifpga 发表于 2013-1-25 16:04
牛人啊,搞C++的能把FPGA用成这样

现在有HLS了。小菜

使用特权

评论回复
15
ifpga| | 2013-1-28 10:47 | 只看该作者
GoldSunMonkey 发表于 2013-1-26 00:22
现在有HLS了。小菜

哥,什么是 HLS?

使用特权

评论回复
16
chenzhi658| | 2013-1-28 12:30 | 只看该作者
ifpga 发表于 2013-1-28 10:47
哥,什么是 HLS?

high level  synthesis?猴哥

使用特权

评论回复
17
GoldSunMonkey| | 2013-1-28 21:17 | 只看该作者
ifpga 发表于 2013-1-28 10:47
哥,什么是 HLS?

看你的楼下,我的楼上

使用特权

评论回复
18
GoldSunMonkey| | 2013-1-28 21:17 | 只看该作者
chenzhi658 发表于 2013-1-28 12:30
high level  synthesis?猴哥

使用特权

评论回复
19
ChaiTF| | 2013-1-29 22:11 | 只看该作者
GoldSunMonkey 发表于 2013-1-28 21:17

谢谢猴哥

使用特权

评论回复
20
GoldSunMonkey| | 2013-1-29 22:21 | 只看该作者
:lol

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

29

帖子

2

粉丝