科学网

 找回密码
  注册

tag 标签: 核重组

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

CPU设计我要让更多的人掌握它(续10)
accsys 2010-1-22 10:50
4. 动态计算机的应用与发展 动态计算机并不是一种全新的计算机思想产物,而是冯.诺依曼思想体系在多处理器计算机实践发展的一种解决方案。如果将以操作系统为标志的,以软件来管理程序并行执行的方法,看作是冯.诺依曼思想体系实现的一种软件解决方案,那么动态计算机就是相对操作系统来说,就是一种简约的、高效的硬件解决方案。 4.1 单片机领域 通用计算机人机交互是一个极其复杂的开发领域,而单片机的人机交互要相对简单,为此,动态计算机核心技术首先应用的领域必然是单片机。 单片机系统最重要的部件是微处理器MCU或者DSP,从本质上来讲它们都是CPU。由于单片机外部设备简单,需要执行的程序往往固化在存储器当中,因而本质上就是一个计算机的核心。由于执行程序固定,所以单片机就是专用计算机的别名。 单片机虽然功能简单,但在处理速度上要求很高,因而同时并行操作是单片机努力追求的行为,而简单直接又是其提速的一个重要方法。 单片机虽然是专用计算机,但随着手机和机器人等高性能专用计算机系统的开发,其复杂程度也越来越高,功能和行为的处理,单凭一个CPU已经跟不上高速高效的要求,因而异构多处理器结构必然要也要成为单片机的核心架构。动态计算机核心正是这种多元异构计算机核心的体现,特别是片上动态计算机核心,不仅结构灵活,而且简单高效。动态关系总线结构,异常方便多功能协调,充分调动每一个处理器工作,因而在单片机领域,动态计算机会首先显示出其强大优势。 4.2 通用计算机领域 通用计算机是能够运行各种应用程序的计算机。由于功能的复杂和多样性,通用计算机在资源管理、任务调度和人机交互等方面都有很高的要求。与单片机相比,第一要解决各种各样的程序都能够执行;第二要更多地处理输入输出事务;第三要处理程序对处理器使用的调度和资源分配。 通用计算机的这些要求无疑要增加处理器功能。以往的作法是设计功能更加强大的处理器,让所以的程序都能够在这个通用处理器上执行。这种作法虽然可以满足各类程序执行的需要,但由于处理器对程序的互斥使用,造成了处理器内部功能资源的闲置,而在外部由于各程序要排队互斥使用处理器,那么又造成了程序执行等待的时间浪费。这两种情况的发生,必然使通用计算机的核心结构发生重大变化。 首先,计算机核心中处理器要向功能单一的方向细化,要尽可能地在程序执行的过程中,减少处理器内部资源闲置。其次,要增加程序调度分配的灵活性,减少程序排队等待执行的时间。前者必然会推出异构的多处理器对计算机核心,而后者必然要打破共享庞大内存的存储结构,转而采用多存储器分散存储程序和数据,进而避开存储器互斥访问的瓶颈。 处理器细划和程序分散存储,必须要有方便实现分散结合的架构,这就是动态关系总线的必然。而动态关系总线的快速变换,必然要有更高层次的逻辑控制来实现。 4.3 总结 动态计算机是计算机任务和效率需求发展的必然产物。而先前在硬件资源过于昂贵的情况下,先期发展的以现代操作系统为代表的软件管理调度方案,只适用于单处理器多功能核心架构。虽然在网络结构中这种软件管理方式可以完成各节点的异步任务操作,然而在片上的空间紧致和时间一致的环境中,难以发挥高效的作用。因此,现在流行的片上多核芯片设计,一定会让位于片上多处理器CMP结构。而CMP中最优秀的架构就是动态计算机核心。 动态计算机架构可以实现传统编程方式的多处理器上程序同时并行执行,因而对应用软件设计是有力的硬件支撑。 有关CPU设计,暂讨论到此。更加深入的问题将与有兴趣者通过其他方式研讨。 2010-1-22 --- 完 ---
个人分类: 计算机核|4106 次阅读|0 个评论
CPU设计我要让更多的人掌握它(续9)
accsys 2010-1-13 21:32
3.4 如何控制PU与MU的连接与断开 如果有k种不同类型的处理器PU,那么在MU中要有一个k位的连接标志寄存器,每个标志位对应一类PU。当连接标志位是1时,表示该MU要求与那一类PU连接,此时若所要求的那一类PU有空闲的,那么就立即按优先级实现连接,否则MU就处于等待状态。MU的等待状态也可能发生在有高优先级的MU要求连接同类PU的情况。PU一方是靠闲标志来与MU连接的,如果PU正忙,那么需要与之连接的MU就会仍然处于等待状态。 由于计算机任务的需求,处理器的功能将会细划,这样可以提高执行任务的效率。图 3 5是多种PU与MU动态连接示意图,其中CPU是程序执行处理器,T是程序通信处理器,NET是网络处理器,CHL是输入输出处理器。 图 3 5 PU与MU动态连接示意图 3.5 动态核心系统运行综述 系统初始,除了固化有程序的MU之外,所有的MU都将请求连接标志指向CHL,如果没有外部任务程序请求执行,CHL会拒绝与这些MU连接。外设与MU的连接也是动态的,如果外设中的任务程序请求执行,空闲的CHL将与之连接,并且立即与空闲的MU连接,将任务传输给MU,同时将MU中的程序上下文寄存器填写好,以备后继程序段能够连续执行。装填好程序段的MU断开与CHL连接后,连接申请标志将指向CPU,进入程序动态执行。 MU之间会依据一定的优先顺序与各处理器连接,各类处理器也有连接优先顺序,这样可以避免连接冲突。装载了程序段的MU会依据程序执行需要,设立标志,凭借标志自动寻找处理器连接或断开。在转换或完成程序段执行时,通过指令填写好应该连接的处理器标志,以达到选择处理器或周而复始执行程序的过程。 MU的存储容量是有限的,超长的程序需要分段进入MU去执行,为不使任务错位,保证上下文共享数据资源,编译程序要在每个装填段的末尾添加设置连接CHL标志指令,并用保存在MU中的程序段编号控制次序,在全部程序段执行完成后,清空程序上下文寄存器,申请指向CHL,以便新的程序能够进入MU执行。 由于处理器无痕的特点,在同类型处理器中,MU与任何一个处理器连接都可以执行程序,这样可以充分发挥全体处理器的作用,最大限度地实现程序同时执行。动态核中同时执行的多个程序,不必刻意去编写专门的并行程序,普通传统编程方法得到的程序,都可以投入程序并行执行状态,因而称这种程序并行执行为超并行程序执行。同一程序的线程要同处于一个MU中,通过环境转换,实现同时多线程运行。 相互关联的多个程序装入不同的MU中执行,如果它们之间需要数据通信,可以通过指令将地址信息填入MU的通信地址寄存器保存,然后转向与通信处理器T连接。发信的MU在与T连接后,通过T将发送地址和数据送到邮箱。接收数据的MU再通过T访问邮箱的信件,如果邮箱没有需要的信件,相隔一定时间,再次通过T查找。 邮箱、外部设备和网络端口设备都可以有多个,不执行程序任务时,它们与处理器总是断开的,只有程序任务需要连接这些处理器时,才会根据需要连接,并同时设置好忙标志,以防连接冲突。输入输出、通信、连网,一般要同时实现三种连接:MU与处理器连接;MU与使用的其他设备连接;处理器与这个其他设备连接。动态核结构要求,只要有一个连接不成立,立即断开其他两方的连接,这样可以保证不发生死锁。 3.6 动态关系总线 图 3 6是包含两种类型处理器的动态计算机连接结构图, PU是单端连接的一类程序执行单位,它只连接MU;Chl是一类双端连接的执行单位,Chl的一端要连接MU,另一端和外设DV连接。每个不同类器件之间,都用总线连接,其中包括控制总线。这些总线都有可控开关控制通断。如果原来的两条或两条以上的总线相连,那么就组成了一条总线(见图 3 7),也就是说不论何种情况,各设备都只能在成为一条的总线上传输数据,而不能同时占用相互冲突的多条总线工作。这种总线结构,我们称之为动态关系总线。 图 3 6 动态计算机关系总线结构 动态关系总线不分内部总线和外部总线,它是内外一致的总线。 3.7 核重组与执行核 动态计算机中这种动态关系总线,形似交叉开关,但实际上是计算机的核重组,因为与数据传输中的交叉开关线路结构有本质的不同。不论是单端连接的程序执行单位PU还是双端连接的程序执行单位PU,都有自己的指令系统,它们都必需与MU连接才能够执行程序。这种处理器与MU连接之后才会形成能够执行程序的核,我们称之为执行核。动态计算机中,同时可以形成许多执行核,执行核还会随着程序执行的需要,在不断地进行着核重组。MU与单端处理器连接时,其他与MU连接的总线都会处于断开状态。当MU与双端连接处理器Chl的总线连接时,双端连接处理器Chl必须能够找到合适的外设,并与之连接,形成统一的总线结构(见图 3 7),不然就要断开与MU连接的所有总线。这样做的好处是设备不会在连接的状态下不工作,从而保证不出现死锁。 图 图3 7 动态关系总线连接前后 3.8 高层控制逻辑 动态计算机中,所有高端设备相互作用,都是通过信号标志线来表达的。由于这些设备同处一机,不会发生像网络那样的资源随机性,因而可以用信号通过逻辑电路来发出各种连接断开的控制。由于实现MU与PU的连接之后,程序的执行过程是由重组核中的控制器来管理的,所以无需高层控制逻辑干涉。 核内控制器与高层控制逻辑的分工,使动态计算机既能像以往的计算机那样编写和执行程序,又能够不用软件进行程序调度和处理机管理。这种结构突破了现在各种非动态计算机最低层Cache私有的界限,彻底摆脱了操作系统管理程序,管理处理器,管理庞大内存,管理数据分配等一系列模式。如同飞机从螺旋桨推动转到喷气推动一样,动态计算机结构效率的提高,是无法用原有的软件管理方式进行比拟的。 如果将操作系统软件管理方式比作人治的管理方法,那么动态计算机的硬件逻辑管理方式就是法治的产物。人治,服务元素和服务对象都是被动的,要靠能力强的管理者指挥来动。而法治,能够让服务元素和服务对象都能依据法规,主动地去完成任务,实现服务。 由于动态计算机中各种高层次的设备PU、MU、DV等,都是靠标志信号来联络的,因而不论程序是否在执行的状态,都能接受来自高层逻辑的调度管理。高层逻辑不用像操作系统那样,在管态才能发挥作用,而它是一个与所有设备同时工作的管理系统,因而不论程序在何种状态,都能实现对硬件设备的管理。高层逻辑电路的存在及工作方式,不仅是一个硬件加速问题,更重要的是从根本上改变了复杂落后的软件管理方式,加快了整个计算机系统完成任务的进程。 -―― 待续 ―――
个人分类: 计算机核|4454 次阅读|1 个评论
CPU设计我要让更多的人掌握它(续8)
accsys 2010-1-13 16:09
3. 动态计算机的思想方法 本人发明的动态计算机理论和方法需要系统地介绍,行内人士方能理解。 3.1 核的服务结构 图 3 1是单处理器计算机核心的一般结构,这里将程序和数据是分开存储的,与将它们放在一个存储器中,不影响我们对多程序执行的方法进行讨论。 图 3 1 单处理器计算机核心的总线结构 我们将从功能上划分成服务元素和服务对象。图 3 1中虚线左面的部分只负责每条指令的执行,因而是服务元素,虚线右面的部分是存储程序和数据的部分,是程序执行的环境,构成了服务对象。我们用PU来简记服务元素,用MU来简记服务对象。于是可以将计算机核表示成图 3 2的形式。 图 3 2 计算机核的服务结构 这种服务结构的特点是PU与MU的松散耦合。PU只负责完成指令的执行,而不负责保存任何有关指令执行前后的信息。MU不但乘载程序,而且包括程序执行的环境。这种PU-MU结构的特点是连接,程序执行,断开,程序执行暂停。 3.2 多程序动态交换执行 多个程序交替地到处理器上执行就是所谓的程序并发执行。为了解决同时多程序执行的问题,过去使用进程的软件方法,这种软件方法不适合片上多处理器结构,就是单处理器结构,程序调度执行缓慢。多MU结构的计算机可以方便地进行程序运行调度,并且速度远远高于软件调度方式。 对于多程序在一个处理器上执行,可以采用多个MU与一个PU连接的方式,即PU-n.MU结构。PU-n.MU结构计算机核可以像图 3 3那样进行连接设计。可以通过总线的通断控制,实现MU与PU 的互斥交替连接,从而达到程序交替执行的目的。实现这种交替控制程序执行的方法非常简单,只要在连接的总线上加上可控制的开关,并由高层次的控制逻辑来指挥各个开关的通与断,就可以实现有序地调度。 n个MU是有优先顺序的,因而与PU的连接不会发生冲突。高层逻辑可以依据MU的连接请求信号,PU的空闲信号来发出连接控制信号,必要时还可以辅助限时执行的方法来保证程序任务的均衡完成。这种均衡性的保证还来自硬件限位数计算,从而使MU整体具有循环优先级的特点,保证优先级方式不出现服务沉淀。 图 3 3 多程序动态执行结构 假设图 3 3的PU-n.MU结构,每个MU中有一个程序,那么必然是一个程序执行时,另外的几个程序都在等待,这是单处理器计算机的特色。由于MU中都具有其中程序执行的环境,因而在与PU交换连接时,不用像进程运行那样要访问进程控制块,施行现场保护和现场恢复,如此就可以大量地节省软件调度所需要的时间。这种硬件线路的切换,一般在一个机器节拍中就可以完成,因而程序的中断或继续执行也是在一个节拍之内就转化完成。 如果一个MU中存储器容量一定,那么整个计算机存储容量的大小是由MU的数量来决定的。由于程序执行时访存的时间只由单一的MU来决定,因此不会产生访存带宽的变化,也就不会产生存储墙问题。 3.3 多程序同时执行结构 要真正实现多程序同时并行执行,必须要有多个处理器存在。为了使任务程序能够快速完成,一般每个任务程序中又可以分成若干个可独立执行的线程,以防某个线程无法执行时,另外的线程快速启动执行。图 3 4是多处理器与多程序同时执行计算机核结构。 图 3 4 n.PU-m.MU多处理器计算机核 由于每个MU中放置一个程序,而程序又以线程的方式划分,那么MU中要为每个线程设置一个执行环境。也就是说,现行执行的线程的程序计数器和其他环境设备会充当程序执行的计数器和其他环境条件。MU 内部线程执行也应该采用线路切换机制。显然这种线程切换适合较稳定的PU-MU连接方式,如果频繁实现线程在多异构处理器间转换,那么必然带动任务程序在相应处理器间转换。因而MU中过多地设置硬线程未必是最佳选择。不过由于无论是在MU中还是在MU之外,线路切换的速度都是一样的,因而不至于产生效率降低的问题。 --- 待续 ---
个人分类: 计算机核|4329 次阅读|1 个评论
CPU设计我要让更多的人掌握它(续7)
accsys 2010-1-13 13:34
2.4 简单流水线计算机核设计 写到这里,大家是否就能够理解2.1那个简单能够执行自己设计程序的实例了呢?现将其适当扩充,做一个简单的16位的流水线结构计算机核。作为练习,这里给出的是一个4级非透明流水线设计,主要解释流水线的一般设计方法,没有对相关问题进行相应处理,读者有兴趣可以自己补上。此实例在Quartus II上设计,其中二程序都进行过时序仿真验证,并下载到教学计算机开发板上运行验证,结果正确无误。 2.4.1 指令设计与指令格式 指令格式说明:指令类编码高4位,源寄存器3位,目寄存器3位,功能码在低6位;如果是访存指令,地址编码12位。 指令设计如下: 2.4.2 流水线核的Verilog HDL程序描述 module L_cpu( clock, //系统时钟 clr_n, //初始复位,低电位有效 idata, //输入数据 odata, //输出数据 w, aq, bq, cq, opc, ocall, pcback, osp, oret, oswren, odwren, oda, oadd, osub, or0, or1,or7 ); input clock,clr_n; input idata; output odata; output w,aq,bq,cq,oda,or0,or1,or7; output ocall,oret,oswren,odwren,oadd,osub; output opc,pcback,osp; wire clk; reg r_0,r_1,r_2,r_3,r_4,r_5,r_6,r_7,x; reg lda,add,sub,out,in,str,mov,xtda,mult,divi,sdal,sdah, ldar,strr,jmp,jz,jn,call,ret,nop,push,pop,stp; wire q_w,q_data; wire pc_next; reg aq_w,bq_w,cq_w,dq_w,wdata,ddata,a,b,da,outd; reg pc,sp,pc_back,mar; reg jp,iwren,dwren,swren,f_da,f_call,f_ret; altsyncram0 iram(.address(pc),.clock(clock),.data(idata),.wren(iwren),.q(q_w)); //程序存储器 altsyncram1 dram(.address(mar),.clock(clock),.data(ddata),.wren(dwren),.q(q_data)); //数据存储器 altsyncram2 sram(.address(sp),.clock(clock),.data(pc_back),.wren(swren),.q(pc_next)); //堆栈 assign oda=da; assign odata =outd; assign w=q_w; assign aq=aq_w; assign bq=bq_w; // assign cq=cq_w; assign opc=pc; assign ocall = call; assign pcback = pc_back; assign osp = sp; assign oret = ret; assign oswren = swren; assign or0=r_0; assign or1=r_1; assign or7=r_7; always @(posedge clock or negedge clr_n) //取出指令与传递指令 begin if (!clr_n) begin aq_w = 16'h0000; bq_w = 16'h0000; cq_w = 16'h0000; dq_w = 16'h0000; jp = 0; pc = 0; sp = 0; //栈底 dwren = 0; swren = 0; // 指令线 lda = 0; //da取数据 str = 0; ldar = 0; strr = 0; add = 0; sub = 0; out = 0; mov = 0; xtda = 0; mult = 0; divi = 0; sdal = 0; sdah = 0; jmp = 0; jz = 0; jn = 0; call = 0; ret = 0; push = 0; pop = 0; stp = 0; //标志线 f_da = 0; //为1时da正在写过程 f_call = 0; f_ret = 0; end else begin //1取指传递和节拍控制设备: if (stp) begin pc = 0; aq_w = 0; bq_w = 0; cq_w = 0; dq_w = 0; end else begin pc = pc+1; aq_w = q_w; //实际aq_w在第一拍改变 bq_w = aq_w; //实际bq_w在第二拍改变 cq_w = bq_w; //实际cq_w在第三拍改变 dq_w = cq_w; //实际dq_w在第四拍改变 end //以上是初始过程,此后q_w将依次向后传递。 //2分析准备设备: case (q_w ) 4'b0000: case (q_w ) 6'b000001: // push case (q_w ) 3'b000: pc_back = r_0; 3'b001: pc_back = r_1; 3'b010: pc_back = r_2; 3'b011: pc_back = r_3; 3'b100: pc_back = r_4; 3'b101: pc_back = r_5; 3'b110: pc_back = r_6; 3'b111: pc_back = r_7; endcase 6'b000010: //pop begin sp = sp-1; end 6'b000011: //ldar case (q_w ) 3'b000: da = r_0; 3'b001: da = r_1; 3'b010: da = r_2; 3'b011: da = r_3; 3'b100: da = r_4; 3'b101: da = r_5; 3'b110: da = r_6; 3'b111: da = r_7; endcase 6'b000100: // (strr ) case (q_w ) 3'b000: r_0 = da; 3'b001: r_1 = da ; 3'b010: r_2 = da; 3'b011: r_3 = da ; 3'b100: r_4 = da; 3'b101: r_5 = da; 3'b110: r_6 = da ; 3'b111: r_7 = da; endcase 6'b000101: // (add ) case (q_w ) 6'b000000: r_0 = r_0+r_0; 6'b001001: r_1 = r_1+r_1; 6'b010010: r_2 = r_2+r_2; 6'b011011: r_3 = r_3+r_3; 6'b100100: r_4 = r_4+r_4; 6'b101101: r_5 = r_5+r_5; 6'b110110: r_6 = r_6+r_6; 6'b111111: r_7 = r_7+r_7; 6'b000001: r_1 = r_0+r_1; 6'b000010: r_2 = r_0+r_2; 6'b000011: r_3 = r_0+r_3; 6'b000100: r_4 = r_0+r_4; 6'b000101: r_5 = r_0+r_5; 6'b000110: r_6 = r_0+r_6; 6'b000111: r_7 = r_0+r_7; 6'b001000: r_0 = r_1+r_0; 6'b001010: r_2 = r_1+r_2; 6'b001011: r_3 = r_1+r_3; 6'b001100: r_4 = r_1+r_4; 6'b001101: r_5 = r_1+r_5; 6'b001110: r_6 = r_1+r_6; 6'b001111: r_7 = r_1+r_7; 6'b010000: r_0 = r_2+r_0; 6'b010001: r_1 = r_2+r_1; 6'b010011: r_3 = r_2+r_3; 6'b010100: r_4 = r_2+r_4; 6'b010101: r_5 = r_2+r_5; 6'b010110: r_6 = r_2+r_6; 6'b010111: r_7 = r_2+r_7; 6'b011000: r_0 = r_3+r_0; 6'b011001: r_1 = r_3+r_1; 6'b011010: r_2 = r_3+r_2; 6'b011100: r_4 = r_3+r_4; 6'b011101: r_5 = r_3+r_5; 6'b011110: r_6 = r_3+r_6; 6'b011111: r_7 = r_3+r_7; 6'b100000: r_0 = r_4+r_0; 6'b100001: r_1 = r_4+r_1; 6'b100010: r_2 = r_4+r_2; 6'b100011: r_3 = r_4+r_3; 6'b100101: r_5 = r_4+r_5; 6'b100110: r_6 = r_4+r_6; 6'b100111: r_7 = r_4+r_7; 6'b101000: r_0 = r_5+r_0; 6'b101001: r_1 = r_5+r_1; 6'b101010: r_2 = r_5+r_2; 6'b101011: r_3 = r_5+r_3; 6'b101100: r_4 = r_5+r_4; 6'b101110: r_6 = r_5+r_6; 6'b101111: r_7 = r_5+r_7; 6'b110000: r_0 = r_6+r_0; 6'b110001: r_1 = r_6+r_1; 6'b110010: r_2 = r_6+r_2; 6'b110011: r_3 = r_6+r_3; 6'b110100: r_4 = r_6+r_4; 6'b110101: r_5 = r_6+r_5; 6'b110111: r_7 = r_6+r_7; 6'b111000: r_0 = r_7+r_0; 6'b111001: r_1 = r_7+r_1; 6'b111010: r_2 = r_7+r_2; 6'b111011: r_3 = r_7+r_3; 6'b111100: r_4 = r_7+r_4; 6'b111101: r_5 = r_7+r_5; 6'b111110: r_6 = r_7+r_6; endcase 6'b000110: // (sub ) case (q_w ) 6'b000000: r_0 = r_0-r_0; 6'b001001: r_1 = r_1-r_1; 6'b010010: r_2 = r_2-r_2; 6'b011011: r_3 = r_3-r_3; 6'b100100: r_4 = r_4-r_4; 6'b101101: r_5 = r_5-r_5; 6'b110110: r_6 = r_6-r_6; 6'b111111: r_7 = r_7-r_7; 6'b000001: r_1 = r_1-r_0; 6'b000010: r_2 = r_2-r_0; 6'b000011: r_3 = r_3-r_0; 6'b000100: r_4 = r_4-r_0; 6'b000101: r_5 = r_5-r_0; 6'b000110: r_6 = r_6-r_0; 6'b000111: r_7 = r_7-r_0; 6'b001000: r_0 = r_0-r_1; 6'b001010: r_2 = r_2-r_1; 6'b001011: r_3 = r_3-r_1; 6'b001100: r_4 = r_4-r_1; 6'b001101: r_5 = r_5-r_1; 6'b001110: r_6 = r_6-r_1; 6'b001111: r_7 = r_7-r_1; 6'b010000: r_0 = r_0-r_2; 6'b010001: r_1 = r_1-r_2; 6'b010011: r_3 = r_3-r_2; 6'b010100: r_4 = r_4-r_2; 6'b010101: r_5 = r_5-r_2; 6'b010110: r_6 = r_6-r_2; 6'b010111: r_7 = r_7-r_2; 6'b011000: r_0 = r_0-r_3; 6'b011001: r_1 = r_1-r_3; 6'b011010: r_2 = r_2-r_3; 6'b011100: r_4 = r_4-r_3; 6'b011101: r_5 = r_5-r_3; 6'b011110: r_6 = r_6-r_3; 6'b011111: r_7 = r_7-r_3; 6'b100000: r_0 = r_0-r_4; 6'b100001: r_1 = r_1-r_4; 6'b100010: r_2 = r_2-r_4; 6'b100011: r_3 = r_3-r_4; 6'b100101: r_5 = r_5-r_4; 6'b100110: r_6 = r_6-r_4; 6'b100111: r_7 = r_7-r_4; 6'b101000: r_0 = r_0-r_5; 6'b101001: r_1 = r_1-r_5; 6'b101010: r_2 = r_2-r_5; 6'b101011: r_3 = r_3-r_5; 6'b101100: r_4 = r_4-r_5; 6'b101110: r_6 = r_6-r_5; 6'b101111: r_7 = r_7-r_5; 6'b110000: r_0 = r_0-r_6; 6'b110001: r_1 = r_1-r_6; 6'b110010: r_2 = r_2-r_6; 6'b110011: r_3 = r_3-r_6; 6'b110100: r_4 = r_4-r_6; 6'b110101: r_5 = r_5-r_6; 6'b110111: r_7 = r_7-r_6; 6'b111000: r_0 = r_0-r_7; 6'b111001: r_1 = r_1-r_7; 6'b111010: r_2 = r_2-r_7; 6'b111011: r_3 = r_3-r_7; 6'b111100: r_4 = r_4-r_7; 6'b111101: r_5 = r_5-r_7; 6'b111110: r_6 = r_6-r_7; endcase 6'b000111: // (out ) case (q_w ) 3'b000: outd = r_0; 3'b001: outd = r_1; 3'b010: outd = r_2; 3'b011: outd = r_3; 3'b100: outd = r_4; 3'b101: outd = r_5; 3'b110: outd = r_6; 3'b111: outd = r_7; endcase 6'b001000: //(mov) case (q_w ) 6'b000001: r_1 = r_0; 6'b000010: r_2 = r_0; 6'b000011: r_3 = r_0; 6'b000100: r_4 = r_0; 6'b000101: r_5 = r_0; 6'b000110: r_6 = r_0; 6'b000111: r_7 = r_0; 6'b001000: r_0 = r_1; 6'b001010: r_2 = r_1; 6'b001011: r_3 = r_1; 6'b001100: r_4 = r_1; 6'b001101: r_5 = r_1; 6'b001110: r_6 = r_1; 6'b001111: r_7 = r_1; 6'b010000: r_0 = r_2; 6'b010001: r_1 = r_2; 6'b010011: r_3 = r_2; 6'b010100: r_4 = r_2; 6'b010101: r_5 = r_2; 6'b010110: r_6 = r_2; 6'b010111: r_7 = r_2; 6'b011000: r_0 = r_3; 6'b011001: r_1 = r_3; 6'b011010: r_2 = r_3; 6'b011100: r_4 = r_3; 6'b011101: r_5 = r_3; 6'b011110: r_6 = r_3; 6'b011111: r_7 = r_3; 6'b100000: r_0 = r_4; 6'b100001: r_1 = r_4; 6'b100010: r_2 = r_4; 6'b100011: r_3 = r_4; 6'b100101: r_5 = r_4; 6'b100110: r_6 = r_4; 6'b100111: r_7 = r_4; 6'b101000: r_0 = r_5; 6'b101001: r_1 = r_5; 6'b101010: r_2 = r_5; 6'b101011: r_3 = r_5; 6'b101100: r_4 = r_5; 6'b101110: r_6 = r_5; 6'b101111: r_7 = r_5; 6'b110000: r_0 = r_6; 6'b110001: r_1 = r_6; 6'b110010: r_2 = r_6; 6'b110011: r_3 = r_6; 6'b110100: r_4 = r_6; 6'b110101: r_5 = r_6; 6'b110111: r_7 = r_6; 6'b111000: r_0 = r_7; 6'b111001: r_1 = r_7; 6'b111010: r_2 = r_7; 6'b111011: r_3 = r_7; 6'b111100: r_4 = r_7; 6'b111101: r_5 = r_7; 6'b111110: r_6 = r_7; endcase 6'b001001: // mult case (q_w ) 3'b000: {x,da} = da*r_0; 3'b001: {x,da} = da*r_1; 3'b010: {x,da} = da*r_2; 3'b011: {x,da} = da*r_3; 3'b100: {x,da} = da*r_4; 3'b101: {x,da} = da*r_5; 3'b110: {x,da} = da*r_6; 3'b111: {x,da} = da*r_7; endcase /* 6'b001010: // divi case (q_w ) 3'b000: begin da = da/r_0; x = da%r_0; end 3'b001: begin da = da/r_1; x = da%r_1; end 3'b010: begin da = da/r_2; x = da%r_2; end 3'b011: begin da = da/r_3; x = da%r_3; end 3'b100: begin da = da/r_4; x = da%r_4; end 3'b101: begin da = da/r_5; x = da%r_5; end 3'b110: begin da = da/r_6; x = da%r_6; end 3'b111: begin da = da/r_7; x = da%r_7; end endcase */ 6'b001011:da = x; //x-da 6'b000000:begin end //nop 6'b111110: begin // (ret ) sp = sp-1; //准备出栈 end 6'b111111: begin // (stp) stp = 1; pc = 0; end default: begin end endcase 4'b1001: begin // (sdal ) da = {{8{q_w }},q_w }; //扩充16位有符号数 end 4'b1010: begin // (sdah ) da = {q_w ,da }; //事先sdal送低8位 end 4'b1011: begin // (jmp ) pc = q_w ; end 4'b1100: begin // (jz ) if (da==0) pc = q_w ; end 4'b1101: begin // (jn) if (da0) pc = q_w ; end 4'b1110: begin // (call ) pc_back = pc+1; //返回地址入栈 pc = q_w ; end default: begin end endcase //3执行设备: case (aq_w ) 4'b0000: case (aq_w ) 6'b000001: //push begin swren = 1; //第3拍实现入栈 end 6'b000010: //pop第3拍实现出栈 case (aq_w ) 3'b000: r_0 = pc_next; 3'b001: r_1 = pc_next ; 3'b010: r_2 = pc_next; 3'b011: r_3 = pc_next ; 3'b100: r_4 = pc_next; 3'b101: r_5 = pc_next; 3'b110: r_6 = pc_next ; 3'b111: r_7 = pc_next; endcase default: begin end endcase 4'b0001: begin // (lda ) da = q_data; //第3拍实现读 end 4'b0010: begin // (str ) dwren = 1; //第3拍实现写 end 4'b1110: begin // (call ) swren = 1; //pc_back实现入栈 end default: begin end endcase //4存取设备: case (bq_w ) 4'b0000: case (bq_w ) 6'b000001: //push begin swren = 0; sp= sp+1; end 6'b111110: pc = pc_next;// (ret )必须第四拍实现转移 6'b000010: //pop begin end endcase 4'b0010: begin // (str ) dwren = 0; end 4'b1110: begin // (call ) swren = 0; sp = sp+1; //指向新栈顶,堆栈开口向下 end default: begin end endcase end end endmodule ////////////////////////////////////////////////////////////// //例题1:求1+2+...+300。数据文件imem16_1.mif // 汇编 编译 //Start: sdal 1 9001 // Strr 10204 //Sdal 0 9000 // Strr 0 0004 // Sdal 44902c // sdah 1 a001 // // Strr 7 0e04 //Loop: ldar 7 0e03 //Jz exit c00e // Add 7,0 0e05 // ldar 7 0e03 // Sub 1,7 03c6 // Jmp loop b007 //nop0000 //Exit: out 0 0007 // stp 003f // //结果为:hb05e=45150 // //用标志控制正确转移 //call a //call b //ret //ret // //例题2:求8! 数据文件imem16_2.mif // //0 main:sdal 1 9001 ;1 //1 Strr 10204 ;送1号寄存器 //2 strr 2 0404 ;2号寄存器(部分积) //3Sdal 0 9000 ;0 //4 Strr 0 0004 ;送0号寄存器 //5 sdal 8 9008 ; //6 sdah 0 a000 ;高位置0 //7 strr 7 0e04 ;/8送7号寄存器 //8 call make e00c ; //9 nop 0000 ; //aout 2 0407 ;输出结果 //b stp 003f ;停机 //c make: ldar 7 0e03 ; //d jz exitc015 ; //e mult 2 0409 ;乘法 //f strr 20404 ; //10 sub 1,7 03c6 ; //11 call test e019 ;二层调用 //12 nop0000 ; //23 jmp make b00c ; //14 nop 0000 ; //15exit: ret 003e ;ret后面要加3个nop断流,其他转移指令后加1个nop. //16 nop 0000 ; //17nop 0000 ; //18 nop 0000 ; //19test: nop 0000 ;不让call连接ret //1a ret003e ; //1b nop 0000 ; //1c nop0000 ; // //结果:h9d08=40200 //编程注意事项: //由于call第4拍实现入栈、ret都要在第4拍才能实现pc转移,所以不能call立即连接ret 程序初始化文件如图 2 16所示。 图 2 16 程序初始化文件 实用RISC及流水线编程可参考MIPS编码,关键要理解好各部分的作用。 后续将转入动态计算机的思想方法讨论。 --- 待续 ---
个人分类: 计算机核|4455 次阅读|1 个评论
CPU设计我要让更多的人掌握它(续6)
accsys 2010-1-13 12:22
将控制字寄存器的输出与每条控制线连接,就可以确定下一个clk=1时,计算器的下一个状态。 2.3.5 程序自动执行的结构设计 手动参与的计算器如同算盘一样,实在是太慢。解决的办法是将程序事先编写好,然后放在存储器当中,让机器自己来取。时钟要换成石英钟,这样就可以充分发挥电信号的快速优势。为了将放在存储器中的程序指令逐条取出来,变成机器控制字,需要有专门的寄存器放置取出的指令。这个临时放置指令的寄存器,一般就称为指令寄存器IR。为了能够自动地一一取出存储器中的指令执行,要有专门指示存储器中指令地址的计数器,这个计数器叫程序计数器PC。这样考虑的结果要将计算器设计成图 2 15的简单计算机。 图 2 15 简单总线结构计算机 这个计算机由于增加了一些控制线,这使原来的加减运算计算器的7位控制字扩展成了15位: CpLpEpLmMeIOLiEiEnLaEaEuSuLbLo 其中Cp是程序计数器PC加一控制线。由于输入缓冲寄存器IN的数据装入功能不是由控制器CON进行管理的,所以输入寄存器的输入控制线Ln不包含在这个计算机的控制字当中。此结构引出了寄存器A值为零的标志线ZF和A值为负的标志线NF。它们是条件跳转指令是否发生跳转的信号线。 这个计算机的RAM的存储单元8位,共有16个。因而存放地址的寄存器只要4位。指令寄存器是8位的,高4位是指令编码,低4位是存储器地址。其指令系统可以如表 2 2那样设计。 表 2 2 指令代码设计 功 能助记符 操作码 将数据装入当前存储单元LOD 0000 将存储单元R的内容送到累加器A LDA R 0001 将存储单元R的内容与累加器A相加,结果送累加器AADD R 0010 将累加器A与存储单元R的内容相减,结果送累加器A SUB R 0011 将累加器A的内容送到存储单元R STR R 0100 跳到R单元取指令 JMP R 0101 如果累加器A的值是0则跳到R单元取指令 JZ R 0110 如果累加器A的值为负则跳到R单元取指令 JNR 0111 将存储单元R的内容输出 OUT R 1000 读入数据并送到存储单元R IN R 1001 停机 STP 1111 为了实现指令的功能,设计中要对指令完成动作全程进行分析,做好真值表,并根据真值表获得逻辑函数。例如ADD的指令全程分析如下: (1)将程序计数器PC的值送到地址寄存器MAR; (2)将EROM输出的内容送到指令寄存器IR; (3)PC 加1; (4)IR的低4位送到MAR; (5)EROM输出的内容送到数据寄存器B; (6)A+B的结果送到累加器A。 根据分析列出真值表如表 2 3所示。 表 2 3 ADD全程分析真值表 机器动作 拍 ZF NF Cp Lp Ep Lm Me IO Li Ei En La Ea Eu Su Lb Lo PCMAR 0 0 0 1 1 00 0 0 0 0 0 0 0 0 0 RAMIR 1 0 0 0 0 1 0 10 0 0 0 0 0 0 0 PC+1 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IRMAR 3 0 0 0 1 0 0 0 10 0 0 0 0 0 0 RAMB 4 0 0 00 1 0 0 0 0 0 0 0 0 1 0 A+BA 5 0 0 0 0 00 0 0 01 0 1 0 0 0 将所有指令全程分析都列入真值表中,就能够得到每条控制线随指令线和节拍线变化的情况。根据逻辑表达式抽象的方法,就可以一一得到每条控制线的函数。 指令分析的方法取决于指令格式,这里的指令格式简单,高4位是指令代码,低4位是存储器地址。因为指令寄存器接收的指令是这种格式的,因而在指令全程分析中才会有IR的低4位送到MAR。 写到这里,我想作为计算机核心设计的入门介绍,应该暂时告一个段落了。大家可以将这个简单总线结构的8位计算机,理解成16位、32位或64位等,还可以将存储器分为程序存储器和数据存储器,指令格式还可以复杂一些,从而使单一指令能够完成稍复杂一些的功能等。有关计算机如何实现程序自动执行的一般设计原理和方法,请见本人所著《计算机原理教程》和《计算机原理综合课程设计》两本书,在此就不赘述。 在接下来我们将进入高层一些的讨论。在此之前,我对于计算机核心设计需要特别强调几点。 (1) 计算机核心是一个统一指挥的同步传输结构; (2) 程序计数器、指令寄存器、控制逻辑,节拍器等,都是为了能够让程序指令自动执行而设置的; (3) 程序执行的基本方式是服务式,即由运算器和控制器等组成的处理器是服务元素,程序是服务对象,处理器通过对存储器中的程序进行服务来完成各种任务; (4) 总线上的数据是互斥放置的,因而必须分时间节拍使用; (5) 计算机的所有动作必须先后有序,同时工作的部分必须互不相关; (6) 用硬件设计语言进行设计会有简单易行的效果,因为在硬件设计语言中许多重要的计算机功能部件,都用事先定义好的符号替代了,在编译综合阶段,这些符号要转化成特定的逻辑电路,而这些逻辑电路都是一种确定的结构,如果这个结构的功能不能满足设计要求,就必须回到原理图电路设计的基本设计方法上来考虑问题。 接下来会给大家一个简单的非透明的4级流水线设计实例。 --- 待续 ---
个人分类: 计算机核|4750 次阅读|0 个评论
CMP的根本出路
accsys 2010-1-10 09:09
片上多处理器CMP是从核拆分成处理器和程序存储设备的角度,即从服务元素与服务对象的角度,来研究多核技术的。 多核技术将程序单独执行的固定结构作为研究的基本出发点,因而从基础划分的层次来看,不如CMP深入。 由于核是能够独立执行程序的基本单位,那么核间的互连自然就是一个网络。因而片上多核采用网络方式组织是理所当然的事情。但随着任务的复杂度增加,计算机核的类型将会产生多样化趋势。因为更加功能细致的核的划分,能够更容易实现程序同时并行执行,从而高速地完成众多的任务。这样,一个执行中的程序就可能要在多个核间频繁地转移,而核间的程序转移,必须要将程序和数据从一个核传递到另一个核。这种程序的核间转移会消耗大量的时间,因此在更加高效的CMP研究中,必须有效避免这种传输耗时。 如何解决传输耗时?从发生的问题本身已经可以明显地看到,程序、数据和程序执行状态数据等,成为了在核间调度的基本单位。因此,片上多核结构的程序调度执行方式是一种沉重的负担。 将程序、数据和程序执行状态数据等乘载的设备组成一个整体,称之为存储单位。那么程序在不同处理器之间转移的问题,就可以转化为存储单位与不同处理器动态连接问题。这就是CMP要比多核研究深入的原因。 多核技术难以发展的关键之处是与处理器直接相连的最后一级存储器私有,这种私有方便程序在这个固定的处理器上执行,而不利于程序在不同的处理器间转移执行。所以CMP的根本出路就是要打破一级Cache私有的理念,用存储单位作为程序调度的载体,通过硬件线路切换来实现程序执行核重组,高速实现程序转移执行。 这种动态计算机设计思想的CMP结构就是本人提出的。有兴趣的读者请看什么是动态计算机的相关博文。 2010-1-10
个人分类: 教学点滴|4292 次阅读|1 个评论
计算机专家看看这张图
accsys 2009-12-18 10:30
这里给出一个叫动态计算机的结构图,请计算机专家评论。图中PU、Chl都是处理器(执行单位);MU是放置程序、数据及程序(包括线程)执行环境的存储单位,与处理器速度匹配;DV是外设。这种结构,作者认为可以取代操作系统的处理机管理和内存管理,缓解输入输出瓶颈,解决存储墙问题。 1.1 动态关系总线 如图1所示, PU是单端连接的一类程序执行单位,它只连接MU;Chl是一类双端连接的执行单位,Chl的一端要连接MU,另一端和外设DV连接。每个不同类器件之间,都用总线连接,其中包括控制总线。这些总线都有可控开关控制通断。如果原来的两条或两条以上的总线相连,那么就组成了一条总线(见图2),也就是说不论何种情况,各设备都只能在成为一条的总线上传输数据,而不能同时占用相互冲突的多条总线工作。这种总线结构,我们称之为动态关系总线。 1.2 核重组与执行核 动态计算机中这种动态关系总线,形似交叉开关,但实际上是计算机的核重组,因为与数据传输中的交叉开关线路结构有本质的不同。不论是单端连接的程序执行单位还是双端连接的程序执行单位,都有自己的指令系统,它们都必需与MU连接才能够执行程序。这种处理器与MU连接之后才会形成能够执行程序的核,我们称之为执行核。动态计算机中,同时可以形成许多执行核,执行核还会随着程序执行的需要,在不断地进行着核重组。MU与单端处理器连接时,其他与MU连接的总线都会处于断开状态。当MU与双端连接处理器Chl的总线连接时,双端连接处理器Chl必须能够找到合适的外设,并与之连接,形成统一的总线结构(见图2),不然就要断开与MU连接的所有总线。这样做的好处是设备不会在连接的状态下不工作,从而保证不出现死锁。 动态计算机核心PMC362成功设计
个人分类: 计算机核|3819 次阅读|1 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-2 08:34

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部