八位右移位乘法器(无符号)
八位右移位乘法器虚假的右移位其实移位总是相对的,所以右移还是有左移的成分。
左移位乘法器很好理解,因为在列竖式的时候就能看明白,符合我们的常规思维:
也就是说,每一次乘法之后,只要把对应的部分积左移相应的位数,再相加,就可以得到最终的结果,这个过程像极了小学二年级的乘法课,非常的直观了,这里不做赘述~
那么什么是右移呢?我听到有同学说,把乘数和被乘数换一下就是了,像这样:
运算顺序从右往左,理论上结果是正确的,就是看起来有点别扭,我们把它转过来:
这下应该看明白了吧,无非是最后的结果再加移位一次,从而实现一个“虚假的右移位”
真正的右移位真正的右移位,其实是针对小数计算而言的,我们计算整数乘法的时候,习惯性的左移,根本原因是我们习惯了整数的小数点在最右侧,只要不超过那个小数点,就可以直接相加得结果。
而小数计算,因为小数点在左边的缘故,在计算机当中,就可以根据小数点位置不变的思想,来将部分积右移,从而实现一个右移乘法器。这种思想所成的乘法器,也成为定点乘法器。
以二进制小数计算“0.1101 x 0.1011”为例:
由图可以看出,最后一位的结果并不参与移位相加的运算,什么 ...
八位超前进位加法器&八位行波进位加法器
八位超前进位加法器原理
有学弟问我,超前进位加法器中的p=add1 ^ add2和g=add1 & add2是什么意思,所以这篇文章就稍微赘述一点吧~
所谓超前进位,首先应该明白进位是什么。
8+4=12,其中的1就是进位,其中的2才是结果。
那么在二进制中,1+1=10,其中的1就是进位,0就是结果。
明白了进位和结果,那么多位的数字是怎么计算呢?
其实上面的计算应该是1+1+上一位的进位=10,所以两个数字的计算应该涉及三个内容——加数,被加数,上一位的进位。
在一位二进制加法中,a和b分别表示两个加数,cin表示上一位的进位,cout表示下一位的进位,sum表示结果,我们列出其真值表:
add1
add2
cin
cout
sum
0
0
0
0
0
0
1
0
0
1
1
0
0
0
1
1
1
0
1
0
0
0
1
0
1
0
1
1
1
0
1
0
1
1
0
1
1
1
1
1
以数字**1为真,数字0为假,a表示1,a'表示0,这样的形式。学过离散数学或者数字电路的同学应该多少会点吧,“·”代表“与”, ...
React实现五子棋游戏
React实现五子棋游戏
摘要React 最早起源于 Facebook 的一个内部项目,因为公司对现有的 Javascript MVC 框架都不满意,就决定自己开发一套,用来架设 Instagram 的网站。开发完成后,发现这套东西很好用,就在 2013 年 5 月开源了。
Javascript操作网页的接口,全称为“文档对象模型”(Document Object Model),简称DOM。而在网页对象层级之间,元素与元素的关系形成DOM树,在 DOM 树的状态需要发生变化时,虚拟 DOM 机制会将同一 Event loop 前后的 DOM 树进行对比,如果两个 DOM 树存在不一样的地方,那么 React 仅仅会针对这些不一样的区域来进行响应的 DOM 修改,从而实现最高效的 DOM 操作和渲染。
此外,在 React 里提及的“组件”,常规是一些可封装起来、复用的 UI 模块,可以理解为“带有细粒度 UI 功能的部分 DOM 区域”。然后我们可以把这些组件层层嵌套起来使用,当然这样组件间会存在依赖关系。
为了分析网站的结构,以及更好的学习React中组件的使用方法,面向对象的编程 ...
Verilog入门
Verilog入门前言最原始的,或许就是最有效的,一些缩写的全称或许是入门的关键。比如xswl(笑死我了)、xmsl(羡慕死了)等。
名词解释Verilog什么是Verilog?遇事蒙圈,上网浏览!
wikipedia:
Verilog是一种用于描述、设计电子系统(特别是数字电路)的硬件描述语言,主要用于在集成电路设计,特别是超大规模集成电路的计算机辅助设计。Verilog是电气电子工程师学会(IEEE)的1364号标准。
Verilog全称是Verilog Hardware Description Language(Verilog 硬件描述语言),缩写Verilog HDL,简称Verilog
总之,就是用来描述硬件——描述电路的一种语言,从前,CPU的设计是许多个工程师在纸上绘制的电路图,现在我们可以用变成语言来实现了。
VHDL那么上图中提到的VHDL是什么呢?全称是Very-High-Speed Integerated Circuit Hardware Description Language,这里千万不要以为Verilog HDL和VHDL是一样的东西噢!
FPGA ...
操作系统开发
前言之前按照北航的操作系统实验指导,第一次完成了一个半吊子Linux内核,但是在龙芯杯pmon引导的过程中,遇到了没解决的bug,为了更好的理解操作系统的开发,我决定从新开始,先走一遍Linus的路,学习Minix的制作,再看一遍HIT李治军的课,再看一下麻省的JOS课程,最后再按照BUAA的OS实验完成基于MIPS的Linux内核。
冲冲冲!
Minix李治军HIT课程课程体系:CPU管理、内存管理、终端管理、磁盘管理、文件管理等,此外还有网络管理、电源管理、多核管理,涉及更高层次的学习(高级操作系统),暂时不进行介绍。
目标:能改操作系统(改CPU管理、改屏幕输出、改系统接口、改内存管理)
斯坦福学操作系统的四个实验:
实验一:扩展线程
实现线程调度
实验二:实现系统调用
将整个接口剥掉,添加
实验三:实现虚存管理
扩展实现内存管理
实验四:扩展文件系统
扩展实现一个文件管理
控制开机界面为什么不能用C而要用汇编?因为汇编可以准确的对指定的地址进行操作。
二进制
前言世界上分两种人,第1种是知道二进制的,第10种是不知道二进制的。
进制所谓进制,就是进位制度。
0 1 2 3 4 5 6 7 8 9,十个基本元素就是十进制
基本元素
数量
名称
进位后
0 1 2 3 4 5 6 7 8 9
10
十进制
11 12 13 14 15 16 17 18 19
0 1 2 3 4 5 6 7
8
八进制
10 11 12 13 14 15 16 17
0 1 2 3
4
四进制
10 11 12 13
0 1
2
二进制
10 11
思考1: 所谓进制,不过如此,那么你知道十六进制的基本元素和第一次进位后的结果是怎样的嘛?
二进制我们的学习重点也就是二进制——机器语言的本质。
首先介绍一个小技巧,为了用二进制表示十进制的数字,需要四个二进制位来才可以完全表示,这样的一种方式形成了不同的编码(雷格码、2421码、8421码,等等),其中有必要介绍一下8421码,又称作BCD码,介绍这个只是为了帮助大家更快的在大脑中转换数据!
二进制转换成十进制的方法很直白:$$11010 = 110^4+110^3+0 ...
run linux on loongson_FPGA
必读1、运行要求以下例子是ucore移植过程示例,Soc要求为较完备的SoC :集成 DDR3控制器以连接DDR3颗粒 为内存;集成串口控制器以进行交互;其他可选模块可扩展SoC的功能 ,如网口、 VGA等
cpu务必实现tlb指令及tlb模块,cache指令和cache模块不必实现
交叉编译工具编译ucore
理论上来说,Soc应该都具备以上要求,cpu也实现了tlb,交叉工具在北航实验中已经用到,系统已经编译完成,先不用考虑。
2、系统编译ucore编译后的目标文件是obj/ucore-kernel-initrd,即内核文件,对比北航的系统应该是仿真文件vmlinux文件,都是elf文件,先这么猜着。(没错,后文已经证实!)
3、运行系统先运行pmon,再通过网卡加载ucore至内存,再通过pmon调试(串口之类的),
可以将ucore的elf文件转换为coe文件,应该要用到交叉编译环境mipsel-linux-,这样可以直接使用ram引导系统,我觉得没必要吧,而且没有参考示例,不稳……
软件准备0、串口软件直接用Windows下环境,SecureCRTP串口软件 ...
OPERATING SYSTEMS THREE EASY PIECES
操作系统三个简单的部分
威斯康辛大学麦迪逊分校2014年由Arpaci-Dusseau Books,Inc.
版权所有
致Vedat S. Arpaci,一生的灵感
前言致读者:
欢迎阅读本书!我们希望诸位能够像我们写这本书一般享受地阅读这本书。这本书叫做《操作系统:三个简单的部分》,这个名字显然是为了致敬有史以来最伟大的演讲笔记集之一的,由理查德·费曼(Richard Feynman)撰写,主题为物理学[F96]。然而当这本书也将毫无疑问是达不到那位著名的物理学家设定的高标准,也许在您所寻求的范围内,了解什么是操作系统(更广泛地说,系统)就足够了。
三个简单的部分指的是这本书有组织围绕的三个主要主题元素:虚拟化、并发性、持久性。在讨论这些概念时,我们将讨论操作系统要做的大多数重要事情,希望您也能够在旅途当中有些乐趣。学习新事物是很有趣的,是吧?至少说,应该是。
每个主要概念会被分成一组章节,其中大多数是提出一个特定的问题,然后说明如何解决。这些章节很简短,请尝试(尽可能地)去参考想法真正来源的原始材料。我们写这本书的目的之一就是让历史的轨迹尽可能地清晰,因为我们认为这会帮助一个学生 ...
verilog设计乘法器
概述移位乘法器、原码乘法器、补码乘法器、流水线乘法器
左移位乘法器设计文件12345678910111213141516171819module cfq(result,a,b);parameter width = 8;input [width:1] a,b;output [2*width-1:0] result; // wire [width:1] a,b; 一开始定义为reg类型报错,输入端口为非线型变量,不可定义为reg类型reg [2*width-1:0] result;integer index;always @(a or b) begin result = 0; for(index = 0;index <= width;index = index+1) begin if(b[index]) begin result = result + (a << (index-1)); ...