首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

用底层代码说话:龙芯不是“中国心”解决方案

2012-02-28 
用底层代码说话:龙芯不是“中国心”所谓发明自己的CPU我想应该是这样:1.自己老老实实自己用VHDL或VERILOG写i

用底层代码说话:龙芯不是“中国心”
所谓   发明自己的CPU   我想应该是这样:1.自己老老实实自己用VHDL或VERILOG写
                                                                        ip   core   (其实ip   core几十个VHD或V文件)
                                                                      2.用综合器一步步综合成自己的标准单元电路
                                                                      3.布线制版
一。龙芯的ip   core由来
首先看一段代码(设置好福珑上的编程环境)

.data
mess:   .asciiz   “\n   hello   world   ”
.globl   main
.text
main:
li   $v0,   4   #   打印的系统中断号
la   $a0,   mess#   要打印的字符串的地址
syscall   #   调中断
.end       main      

这是在福珑机子(基于龙芯2E)上简单的一段HELLO   WORLD汇编代码,可以看出所有指令(li   la   还有这个程序没有包含的龙芯指令都和MIPS指令完全一样)都是MIPS指令,代码段和数据段和系统调用的约定都是MIPS指令集约定,为进一步确定龙芯指令集就是MIPS指令集,我查看连接后的二进制代码,再和MIPS手册指令的opcode对比,结果完全一样。连指令的名称到OPCODE都一样,我真是无语了。

cpu的各模块

                                                    ROM <-------|                                         |-----> decode单元
                                                                            -----央控制单元-----
                                                    RAM <-------|                                         |-----> ALU单元

1。中央处理单元从ROM(指令寄存器与内存统一编址)取指令              
2。然后通过decode单元译码(指令---> opcode)
3。ALU单元执行decode单元译出来的码(opcode)
4.   访RAM取数据等操作数
5。回写

我们都知道CPU的IP   CORE基本都是由VHDL或VERILOG写成,而其中必然有一decode模块将指令转化为OPCODE,例如8051的ip   core的i8051_dec.vhd文件中的decode模块:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
--decode单元
--i8051_dec.vhd文件

entity   I8051_DEC   is
        port(rst           :   in     STD_LOGIC;
                  op_in       :   in     UNSIGNED   (7   downto   0);
                  op_out     :   out   UNSIGNED   (8   downto   0));
end   I8051_DEC;

architecture   DFL   of   I8051_DEC   is
begin
        op_out   <=   ( "00 "   &   OPC_ERROR   )   when   rst   =   '1 'else


--call译码         ( "01 "   &   OPC_ACALL   )   when   op_in(4   downto   0)   =   ACALL     else
--加法译码   等   ( "00 "   &   OPC_ADD_1   )   when   op_in(7   downto   3)   =   ADD_1     else          
                            ( "01 "   &   OPC_ADD_2   )   when   op_in(7   downto   0)   =   ADD_2     else
                            ( "00 "   &   OPC_ADD_3   )   when   op_in(7   downto   1)   =   ADD_3     else
                            ( "01 "   &   OPC_ADD_4   )   when   op_in(7   downto   0)   =   ADD_4     else
                            ( "00 "   &   OPC_ADDC_1)   when   op_in(7   downto   3)   =   ADDC_1   else
                            ( "01 "   &   OPC_ADDC_2)   when   op_in(7   downto   0)   =   ADDC_2   else
                            ( "00 "   &   OPC_ADDC_3)   when   op_in(7   downto   1)   =   ADDC_3   else
                            ( "01 "   &   OPC_ADDC_4)   when   op_in(7   downto   0)   =   ADDC_4   else
                            ( "01 "   &   OPC_AJMP     )   when   op_in(4   downto   0)   =   AJMP       else
                                                          .
                                                          .
                                                          .
                                                          .
                            ( "00 "   &   OPC_ERROR   );
end   DFL;

不难推断龙芯CPU的ip   core中肯定存在类似文件(也许叫loognxin_dec.vhd,或者其实就是MIPS_dec.vhd)包含decode模块,形式和这个近似。
////////////////////////////////////////////////////////////////////////////////////////////////////////
--央控制单元
--i8051_ctr.vhd
architecture   BHV   of   I8051_CTR   is

        type   CPU_STATE_TYPE   is   (CS_0,   CS_1,   CS_2,   CS_3);


        type   EXE_STATE_TYPE   is   (ES_0,   ES_1,   ES_2,   ES_3,   ES_4,   ES_5,   ES_6,   ES_7);
       
        signal   reg_pc_15_11   :   UNSIGNED   (4   downto   0);
        signal   reg_pc_10_8     :   UNSIGNED   (2   downto   0);
        signal   reg_pc_7_0       :   UNSIGNED   (7   downto   0);
        signal   reg_op1             :   UNSIGNED   (7   downto   0);
        signal   reg_op2             :   UNSIGNED   (7   downto   0);
        signal   reg_op3             :   UNSIGNED   (7   downto   0);
        signal   reg_acc             :   UNSIGNED   (7   downto   0);
        signal   reg_cy               :   STD_LOGIC;
        signal   reg_ac               :   STD_LOGIC;
        signal   reg_f0               :   STD_LOGIC;
        signal   reg_rs1             :   STD_LOGIC;
        signal   reg_rs0             :   STD_LOGIC;
        signal   reg_ov               :   STD_LOGIC;
        signal   reg_nu               :   STD_LOGIC;
        signal   reg_p                 :   STD_LOGIC;

        signal   cpu_state   :   CPU_STATE_TYPE;
        signal   exe_state   :   EXE_STATE_TYPE;
begin

        process(rst,   clk)

                                --   execute   state
                                --
                                when   CS_3   =>
                                        case   dec_op_in(6   downto   0)   is

-------------------------------------------
--
                                                --   acc   <-   acc   +   (r)
                                                --
                                                when   OPC_ADD_1     =>             --注意这一行   表示加法


                                                        case   exe_state   is
                                                                when   ES_0   =>
                                                                        GET_RAM_ADDR_1(v8);
                                                                        START_RD_RAM(v8);
                                                                        exe_state   <=   ES_1;

                                                                when   ES_1   =>
                                                                        exe_state   <=   ES_2;

                                                                when   ES_2   =>
                                                                        alu_op_code   <=   ALU_OPC_ADD;
                                                                        alu_src_1   <=   reg_acc;
                                                                        alu_src_2   <=   ram_in_data;
                                                                        alu_src_cy   <=   '0 ';
                                                                        exe_state   <=   ES_3;



                                                                when   ES_3   =>
                                                                        ram_out_data   <=   alu_des_1;
                                                                        START_WR_RAM(R_ACC);
                                                                        reg_cy   <=   alu_des_cy;
                                                                        reg_ac   <=   alu_des_ac;
                                                                        reg_ov   <=   alu_des_ov;
                                                                        exe_state   <=   ES_4;

              when   OPC_CJNE_3   =>     --注意这一行表示不等跳转   下面还有许多不一一列

                                                        case   exe_state   is
                                                                when   ES_0   =>
                                                                        GET_RAM_ADDR_1(v8);
                                                                        START_RD_RAM(v8);
                                                                        exe_state   <=   ES_1;

                                                                when   ES_1   =>


                                                                        exe_state   <=   ES_2;

                                                                when   ES_2   =>
                                                                        GET_PC_H(pch);
                                                                        GET_PC_L(pcl);
                                                                        alu_op_code   <=   ALU_OPC_PCSADD;
                                                                        alu_src_1   <=   pcl;
                                                                        alu_src_2   <=   pch;
                                                                        if(   ram_in_data   /=   reg_op2   )   then



[解决办法]
真实辛苦了 顶下牛人
[解决办法]
强帖留名,mark~
[解决办法]
人家本来就说了是兼容MIPS的,而且也没有讳言是使用了网上能找到的MIPS核心实现。
用得着你在N年之后卖弄聪明吗?

但是“龙芯_指令集=MIPS_指令集”是错误的,人家还有自己扩展的数十条指令。
还有“据说是向法意半导体买来的”那真的是“据说”,但是说反了,是授权给法意半导体龙芯2E的生产和全球销售权。

不要不懂装懂。
你以为贴个8051的VHD就可以吓得住人吗?:)

[解决办法]
我对VHDL并不精通,不过想说一点:龙芯刚研制出来时就声明用的是MIPS,一块CPU,除了是自身科技水平的展示外,还应该考虑一些市场推广方面的因素,也许我们可以自己设计实现一套指令集,但国际上不会有哪个厂商说因为是你中国自己设计的就一定要用你的产品,况且用了MIPS龙芯现在也还没能广泛的应用,如果是自己来一套,恐怕可能会更加举步维艰,我们研究自己的CPU的最终目的是要应用的,最终不能广泛应用的产品我们为什么还要做呢?

毕竟我们没能处在大规模集成电路刚刚普及的年代,那时的8086还没能形成气候,而现在国际上已有巨头垄断,他们几十年的技术积淀是我们短时间难以超越的,但我们还是要去做,只是策略上得好好把握。

个人觉得LZ所说的:“劳苦大众的的血汗钱,被这帮人渣中饱私囊。我就坚信一句话:不是不报,时候未到。”实在是有些偏激,当然LZ的知识知识远比我丰富,我也根本没资格指责LZ什么,只是希望,大家都能冷静下来,关注这些,耐住性子,让时间来证明一切。

热点排行