从0到1设计一台8bit计算机

CSAPP学到第六章了,一脸懵比,有点不知所云了,所以索性从CSAPP中脱身去补点基础先,在B站看到Ele实验室的知识分享,感觉很有意思,因此记录一下过程。链接在这:从0到1设计一台计算机.

第一话-人脑计算机

先清楚实现的目标,是通过硬件设计运行贪吃蛇,且为了简单起见不考虑撞墙和吃自己。
在这里插入图片描述

1.创建一条蛇,就是把蛇的数据存到计算机中,所以设计的计算机需要有存储数据的功能。
2.需要判断蛇的方向来决定执行哪个方向的更新,因而需要有条件判断。
3.在更新蛇头中有加法和减法的运算,所以我们的计算机要能够实现加法和剑法。
4.当我们更新完蛇身以后,需要跳转到之前的位置反复执行,所以还需要有过程跳转。
5.我们这些要求要用计算机能懂的语言告诉计算机,因而要有存储指令的功能

至此粗略的设计了完成贪吃蛇的必备功能

第二话-冯诺伊曼和哈佛

电脑主板上也就三个主要部分,CPU、内存和硬盘。目前计算机主要将程序和数据都存放在内存,是在执行之前从硬盘移动到内存中,再从内存读取执行。程序和数据共用一套地址和IO线路,所以硬盘(外存)只是程序的一个非易失性备份,这也就是两大计算机结构之一的冯诺伊曼结构
另一种将程序与数据分开,程序放在只读的ROM存储器,数据放在RAM存储器中,和CPU之间分别走不同的数据线路,这也就是之二的哈佛结构,是这次研究的对象。

贪吃蛇如何在哈佛结构中运行呢?
CPU从ROM中取出第一部分程序,创建一条蛇。简单起见,创建一个长度为1的蛇,创建的过程就是把蛇头的x和y坐标值存在内存RAM中,CPU继续从ROM中取出下一个程序,移动这条蛇。假如现在是向右移动,就取出RAM中的X到寄存器中,将其加1后写回RAM中。

第三话-再谈RAM和ROM

存储器就像一组抽屉,比如一个256字节的存储器,就有编号0~255的抽屉,每个抽屉里能存放一个字节的数据,而这些抽屉被包裹起来也就形成了存储器。如果存储器中的数据是8位的,那数据线是8根。如果存储器的容量是256字节,地址线也是8根。假如从地址线中输入2,那么就会从数据线中弹出1号抽屉存放的数据,这就是ROM存储器的全部。
在这里插入图片描述

RAM比ROM多了个写入数据的功能,所以还有一个读写控制线,如果读写控制线是低电平0,那么代表读数据,数据线输出2号抽屉的数据,如果读写控制线是1,RAM

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
很高兴回答你的问题。关于使用Verilog设计一个8 bit Carry Skip Adder的问题,以下是详细步骤: 1. 首先,定义输入与输出: ```verilog module carry_skip_adder(input [7:0] a, // 8 bit输入a input [7:0] b, // 8 bit输入b input cin, // 进位 output reg cout, // 输出进位 output reg [7:0] sum // 输出和 ); ``` 2. 接下来,我们定义2个参数:一个是进位的延迟线路,一个是跳跃器的宽度。 ```verilog parameter delay_level = 3; parameter skip_width = 2; ``` delay_level定义了进位延迟线路的长度,skip_width则定义了跳跃器的宽度。 3. 接下来,我们使用generate语句来生成跳跃器和进位延迟线路。跳跃器的作用在于尝试从一个位置传递进位到另一个位置,以跳过慢速进位。进位延迟线路的作用在于延迟进位信号。 ```verilog genvar i, j; generate for(i=0; i<8; i=i+skip_width) begin assign skip_cin[i] = cout; for(j=0; j<(skip_width-1); j=j+1) begin assign skip_cin[i+j+1] = skip_cin[i+j]; end end reg [delay_level-1:0] delay_cin [8-1:0]; integer k; always @(posedge clk) begin for(k=0; k<8; k=k+1) begin if(k < delay_level) delay_cin[k] <= cin; else delay_cin[k] <= delay_cin[k-1]; end end endgenerate ``` 4. 然后,我们定义一个8位全加器和一个8位跳跃加法器。 ```verilog reg [7:0] fa_cout [7:0]; reg [7:0] skip_cin [7:0]; generate integer i; for(i=0; i<8; i=i+1) begin full_adder fa(.a(a[i]), .b(b[i]), .cin(skip_cin[i] | delay_cin[i]), .sum(sum[i]), .cout(fa_cout[i])); end endgenerate ``` 其中,full_adder是8位全加器的模块,按位计算输入a+b+carry_in,输出sum和carry_out。 5. 最后,我们将所有8个单独的全加器的结果相加,并计算最终的进位结果。 ```verilog always @(*) begin cout = fa_cout[7]; for(i=6; i>=0; i=i-1) begin if(skip_width > 1 && ((i+1)%skip_width == 0)) cout = fa_cout[i] | skip_cin[i+1]; else cout = fa_cout[i] | cout; end end endmodule ``` 完成上述步骤后,就成功设计出了一个可用于计算8位数的Carry Skip Adder。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值