网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月24日漏签0天
处理器吧 关注:14,332贴子:45,686
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1 2 下一页 尾页
  • 28回复贴,共2页
  • ,跳到 页  
<<返回处理器吧
>0< 加载中...

【求精】如何设计一个16位CPU的模型

  • 只看楼主
  • 收藏

  • 回复
  • 大法师千寻
  • 概念成立
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
RT,求精品
http://tieba.baidu.com/p/1177032485
现在文章大体上写完了,还有些收尾工作


  • butingxiangqia
  • 和谐八方
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
原文搬过来吧!楼层多没事,大家很多爪机。谢谢扫盲!


2025-08-24 00:59:29
广告
不感兴趣
开通SVIP免广告
  • 充值智商
  • 皇天并立
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
业余人士表示这个真心看不懂,真心膜拜楼主


  • 狂pk血影
  • ……
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这就是传说中的科技帝


  • 大法师千寻
  • 概念成立
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
什么是单周期CPU,什么是多周期CPU,什么是RISC,什么是CISC:
首先大家得有时钟的概念:
http://baike.baidu.com/view/188811.htm
这 个问题不好解释啊。。。。。。可以理解为家里面的机械钟,上上电池之后就会滴答滴答走,而它“滴答滴答”的速度就是频率,滴答一下用的时间就是周期,而人 的工作,下班,吃饭和学习娱乐都是按照时钟的指示来进行的(熬夜的网瘾少年不算),一般来说,时钟信号都是由晶体振荡器产生的,0101交替的信号(低电 平和高电平)
数字电路都需要一个“时钟”来驱动,就像演奏交响乐的时候需要一个指挥家在前面指挥一样,所有的人都会跟着指挥的拍子来演奏,就像数字电路中所有的部件都会跟着时钟节拍工作一样。
如下是一个理想的时钟信号:(注意是理想的)

当然,实际的时钟信号可能远没有这么理想,可能上升沿是斜的,而且占空比也可能不是50%,有抖动,有偏移(相对于两个器件),可能因为导线的寄生电容效应变得走形。
上面那段如果没听懂也没关系~~~反正就是告诉你,实际的时钟信号测出来肯定没这么标准
而 cpu的工作频率,是外频与倍频的积(cpu究竟怎么算频率,其实这个我也不太清楚呵呵),因为cpu是通过外部的晶振产生一个时钟信号,然后再通过内部 的电路(锁相环),倍频至需要的频率。当然,有人问,为什么要这么麻烦呢?直接在电路外边做个时钟晶振能产生那么高的时钟信号就可以了嘛,这个是可以的, 在某些简单的系统上(例如51单片姬)就是这样的,但是计算姬的cpu比较复杂,因为一些原因所以必须要做到cpu内。


  • 大法师千寻
  • 概念成立
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
下面简单说一下CPU的两种指令集:CISC和RISC。
http://zhidao.baidu.com/question/388569767.html
这个网址是百度知道的网友回答的CISC和RISC的差别
下面我来说下我的看法(个人看法,如有错误还请高手指正)
RISC是Reduced Instruction Set Computer,精简指令集计算机,典型例子是MIPS处理器
CISC 是Complex Instruction Set Compute,复杂指令集计算机,典型例子是x86系列处理器(当然现在的x86指令还是当初cisc的指令,但是实际处理器的结构都已经变成了 risc结构了,risc的结构实现流水线等特性比较容易,在计算机前的你如果用的是intel某系列的处理器,则它使用的指令集看上去还是像cisc的 指令,但是实际上你的cpu的结构已经是risc的了)
一般CISC的处理器需要用微指令配合运行,而RISC全部是通过硬连线实现的,也就是 说,当cisc的处理器在执行你的程序前,还得先从另外一个rom里面读出一些数据来“指导”处理器怎么处理你的命令,所以cisc效率比较低,而 risc是完全通过部件和部件之间的连接实现某种功能,极大的提高了工作效率,而且为流水线结构的出现提供了基础。cisc的寄存器数量较少,指令能够实 现一些比较特殊的功能,例如8086的一些寄存器:
ax,bx,cx,dx,si,di等;段寄存器有:cs,ds,es,ss等。相对的指令功能比较特殊,例如xlat将bx中的值作为基地址,al中的值作为偏移,在内存中寻址到的数据送到al当中(以ds为段寄存器)
而risc的处理器则通用寄存器比较多,而指令的功能可以稍微弱一点,例如:
以nios嵌入式处理器来说明,nios处理器有32个通用寄存器(r0~r31),而指令功能相对x86的弱一些,而且x86进行内存访问是直接使用mov指令,nios处理器读内存用的是load,写内存用的是store,
二 者响应中断的方式也不一样,举一个典型的例子,x86的处理器将中断向量表放在了内存的最低地址(0-1023,每个中断向量占四个字节),能容纳256 个中断(以实模式的8086举例)响应中断时,将中断号对应的地址上的cs和ip的值装入到cs和ip寄存器而将原来的地址保存,并且保存状态寄存器然后 进入中断处理,请参见:
http://wenku.baidu.com/view/be670901a6c30c2259019e78.html
而 risc则拥有一个共同的中断响应函数,这个函数会根据中断号找到程序向系统注册的函数的地址,并且调用这个函数。一般来说而是用的cisc指令的长度是 不定的,例如x86的xor ax,bx对应机器码是0x31d8、而push ax是0x50、pop cx是0x59。而risc的指令确是定长的,例如32位。
如果还有不清楚的。。。。。自行百度,要理解这些概念需要一点时间


  • 大法师千寻
  • 概念成立
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
下面我就将我做的CPU模型的RTL网表发出来,代码我会上传的,但是这个还只能进行仿真,因为设计的时候理念有问题,出现了异步设计,而且出现了将状态 机的输出作为另一个器件的时钟端的错误,所以这个模型只能用于仿真。我用的synplify pro综合出的RTL,而状态转移图是用的Quartus的FSM Viewer截下来的。
首先是整个系统的概览:

这个比上面的那个简单模型复杂多了吧!但是别担心,其实这个只是上面的那个CPU变得稍微复杂了一点,这个和上面那个不同的地方还有:这个CPU是一个多周期CPU而上面的Lab Exercise是一个单周期的CPU
下图是程序计数器(PC),也就是常见x86处理器里面的ip(instruction poiniter):

红色部分就是pc了,后面是一个三态桥,连接到了总线上面,这里的数据有时候是要送到地址总线,用于寻内存中的数据,以便完成Instruction Fetch过程。有时候又要送到通用寄存器的数据端,用于将pc的值送到其他寄存器。
下面这个是IR(Instruction Register),这个是多周期处理器的典型特征,因为处理器在第一个周期里面将机器码从内存取出,然后存放到这个寄存器里面,后面的几个状态都是通过这个寄存器里面的数据作为指示执行操作的。



  • 大法师千寻
  • 概念成立
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
下面介绍一下ALU,ALU是Arithmetic Logic Unit,即算术逻辑单元,这个装置的作用是进行算术操作和逻辑操作。典型的算术操作例如:1+1=2,11x23=253,而典型的逻辑操作例如:1 and 1=1,0 or 0 = 0,1<<3=8这种属于逻辑操作。

而 从图中大家也看得到,ALU的输出用一根很长的线连接到了后面,参考整个CPU的图的话,会发现这些线连到了通用寄存器上面,这是为了让运算的结果存放回 去,例如你用add eax,1的时候,eax的值被加上1然后放回eax,所以ALU的运算结果要用反馈送回到通用寄存器,而ALU的输入也应该有通用寄存器的输出。
下面再介绍ADDRMUX:

这 个部件是用来选择地址的,右边的输出是CPU的地址总线,而CPU的地址总线就已经送出CPU了(也就是你能够在芯片的外表上看到引脚了),CPU的地址 总线是送到存储器的地址端的,而现代的计算机系统实际上是相当复杂的,所以其实你家的计算机上CPU是通过北桥芯片访问内存的(当然也有将内存控制器做到 CPU里面的)左边是地址的来源,地址的来源即有通用寄存器,也有程序计数器,还有一个是直接从IR里面送出,这是因为有的立即数里面也包含内存地址信 息。
最后介绍通用寄存器:

通用寄存器的作用就是用来保存中间值或者用于运算,例如
add eax,2
相当于eax+2然后送回eax。


2025-08-24 00:53:29
广告
不感兴趣
开通SVIP免广告
  • 大法师千寻
  • 概念成立
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最后介绍一下状态机,这个部分就是CPU的“灵魂”,如果说有了上面那些部件CPU有了一副“躯体”的话,这一部分就是CPU的“灵魂”了:

状 态机基本上与系统所有的组件都连接到一起了,因为上面所说的所有动作的执行,都需要状态机的控制,状态机其实就是由一部分触发器构成的记忆电路和另外一部 分组合逻辑构成的次态译码电路构成,还有根据当前状态和输入进行译码的部分用于控制各个部件,下面是教科书上的典型FSM结构= -:

而我们用的状态机状态转移图如下:

因为这个处理器设计的很简单,所以没有出现很多状态,当处理器经历完以上的状态之后,处理器就执行完了一条指令。
有 的CISC的处理器用微指令进行控制,作用和状态机相近,这种结构出现在一些比较古老的处理器上,因为那个时候的设计工具和方法没有现在的先进,所以往往 改动硬件是困难的和高成本的,所以用微指令的话,做好了硬件的结构,要是需要改动只要修改微指令就好了,而现在的电子技术很发达,设计工具也很完备,所以 就有很多直接通过硬连线实现的处理器


  • 大法师千寻
  • 概念成立
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
好马配好鞍,有了处理器,我们就得给它配上一个好的程序,下面我们就用自己设计的处理器进行求和,从1加到100,因为我们没有设计编译器,也没有设计汇编器,所以程序只能用机器码写出,示例程序如下:
我们不妨先写出程序的汇编代码:
mov [ADDR],r0;r0 = 0
mov r1,100
lop:add r2,r1
sub r1,1
cmp r1,0
jz ext
mov r4,4
jmp r4(lop)
ext:mov [ADDR],r2
jmp $
先将内存中存放数据的地址清零,这样才能存放等下送来的结果,然后将r1寄存器存入循环次数(也就是求和的上限)。然后再将r1的值加到r2中来,r2其实就是放求和的寄存器,最后我们会将r2中的值送到内存中的某个地址存放的。
然 后将r1减去1,看看是否为0?如果为0则说明求和结束了,如果不是0则说明还要继续,结束后程序就跳到ext部分将结果存放到内存中某个地址(例子中给 的是49152也就是二进制的1100000000000000b),最后jmp $是为了让程序停在这一行,防止程序跑飞(跑飞的程序危害很大!有可能吧数据当代码或者把代码当数据!)
转换成VerilogHDL语言如下:
module memory
(
input [15:0] addr,
inout [15:0] data,
input rw
);
reg [15:0] data_ram[0:16'b1111_1111_1111_1111];
integer i;
initial begin
for (i = 0; i <= 16'b1111_1111_1111_1111; i = i + 1)
data_ram[i] = $random();
data_ram[0] = 16'b1000000100000000; //mov [ADDR],r0;r0 = 0
data_ram[1] = 16'b1100000000000000; //ADDR
data_ram[2] = 16'b1000000010001000; //mov r1,100
data_ram[3] = 100; //100
//data_ram[2] = 16'b1110011001000000;
data_ram[4] = 16'b0010000100010001; //lop:add r2,r1
data_ram[5] = 16'b1110000011001000; //sub r1,1
data_ram[6] = 16'b0000000000000001; //1
data_ram[7] = 16'b1110000000001000; //cmp r1,0
data_ram[8] = 16'b0000000000000000; //0
data_ram[9] = 16'b1110011010000000; //jz ext
data_ram[10] = 16'b0000000000000011; //+3 offset(ext)
data_ram[11] = 16'b1000000010100000;//mov r4,4
data_ram[12] = 16'b0000000000000100;
data_ram[13] = 16'b0110011001100000;//jmp r4(lop)
data_ram[14] = 16'b1000000100000010;//ext:mov [ADDR],r2
data_ram[15] = 16'b1100000000000000;//ADDR
data_ram[16] = 16'b1110011001000000;//jmp $
data_ram[17] = 16'b1111111111111110;//-2 offset($)
/*data_ram[0] = 16'b1000000010000000; //mov r0,imm
data_ram[1] = 16'b0011111111111111; //imm
data_ram[2] = 16'b0000000001111000; //mov r7,r0
data_ram[3] = 16'b1000000010011000; //mov r3,0
data_ram[4] = 16'b0000000000000000;
data_ram[5] = 16'b1000000010100000; //mov r4,code of jmp r5
data_ram[6] = 16'b0110011001101000; //jmp r5
data_ram[7] = 16'b0000000101011100; //mov [r3],r4
data_ram[8] = 16'b1000000011110000; //mov r6,[0]
data_ram[9] = 16'b0000000000000000; //[0]
data_ram[10]= 16'b1000000100000110; //mov [255],r6
data_ram[11]= 16'b0000000011111111;
data_ram[12]= 16'b0110011001011000; //jmp r3
*/
end
always @ (addr or rw or data)
if (rw)
data_ram[addr] = data;
assign data = rw ? 16'hzzzz : data_ram[addr];
endmodule
设计中CPU外围还需要一个内存设备(Memory),我用HDL对其建模,初始化的时候每个内存地址上对应的数据都初始化为随机的,然后只有从0开始的一系列地址被初始化为我写的代码,机器码对应的汇编指令在注释中已经给出。


  • 大法师千寻
  • 概念成立
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
然后是结果,结果应该是r2从0变化到5050(1+2+3+......+100=5050)
而r1则从100变化到0,变化到0后程序将进入死循环,停止在jmp $那一条。这是仿真开始的时候:

大 家可以看到初始化后,d0~d7都变成了0,这是r0~r7寄存器的Q端,而state_current和state_next则是状态机的现态和状态机 的次态,cpu的各个部件都通过这个状态机受到控制。状态名出现的顺序和上面的FSM Viewer的连线顺序是一样的。
而且大家可以看到,d2从0变化到了0x64也就是十进制100,说明已经执行了第一次加法了。
再来看看仿真结束:

这时候d1变化到了0而d2变化到了0x13ba(十进制的5050),说明程序已经在我们设计的处理器里面运行并且成功的得出了结果!


  • 大法师千寻
  • 概念成立
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最后给出一些我用到的指令(跟x86的很像):
add dst,src 将src和dst相加并且送到dst寄存器中
mov [addr],src 将src的值送到以addr位地址的内存单元
sub dst,src 将dst减去src并且送到dst中去
cmp dst,src 将dst减去src 然后不送到dst中 只改变标志位
jz dst 当zf=1时(即上次的算术操作结果为0)则跳转到dst中去
最后再提一下:
我是用synplify综合的电路,然后用debussy+modelsim仿真的,
相关资料请参考:
CPU逻辑设计,朱子玉,李亚民著
Lab Exercise 9出自DE2的开发光盘


  • 大法师千寻
  • 概念成立
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
----------------------------------华丽的结束------------------------------------


  • butingxiangqia
  • 和谐八方
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
晕了…


2025-08-24 00:47:29
广告
不感兴趣
开通SVIP免广告
  • 极红的水仙
  • ……
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
可以上百度首页了?


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 28回复贴,共2页
  • ,跳到 页  
<<返回处理器吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示