3.3三位乘法器.ppt

上传人:b****9 文档编号:262902 上传时间:2022-10-08 格式:PPT 页数:43 大小:2.54MB
下载 相关 举报
3.3三位乘法器.ppt_第1页
第1页 / 共43页
3.3三位乘法器.ppt_第2页
第2页 / 共43页
3.3三位乘法器.ppt_第3页
第3页 / 共43页
3.3三位乘法器.ppt_第4页
第4页 / 共43页
3.3三位乘法器.ppt_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

3.3三位乘法器.ppt

《3.3三位乘法器.ppt》由会员分享,可在线阅读,更多相关《3.3三位乘法器.ppt(43页珍藏版)》请在冰豆网上搜索。

3.3三位乘法器.ppt

1,任务三三位乘法器的VHDL设计,2,一、任务分析:

三位乘法器的设计原理,本次任务中所说的三位乘法器是指能实现三位二进制数的乘法运算的器件;其实二进制数的乘法与十进制数乘法类似,均可采用乘数的每一位均与被乘数相乘后错位累加。

故也可与十进制乘法类似用算式的方式来表示运算过程,具体见下页图所示:

根据二进制数的乘法法则:

0*0=0,0*1=0,1*0=0,1*1=1更可将算式中的结果进行简化。

例如若B0=1,则(A2B0)(A1B0)(A0B0)=A2A1A0;若B0=0,则(A2B0)(A1B0)(A0B0)=0。

因此移位乘的过程可以看成是以b(i)取值为条件而实现不同的赋值方式,故可采用when-else语句实现。

由于三位二进制数相乘的最大结果为111*111=110001,即数位为6位。

而从算式中看经错位累加后数位还只有5位,故在程序设计中还应注意数位的处理。

计算过程中,乘数的每一位与被乘数相乘的中间结果需要进行一次加法运算。

由于VHDL语言中对电路的输入端口的数据类型一般处理为逻辑型数据,所以此处出现了逻辑型数据做加法运算的情况。

这也是在程序中需要处理的一个问题。

数组类型的数据类型和when-else语句,并置运算符&的使用,Std_logic_unsigned程序包的使用,1、VHDL库和程序包,库(Library)是用于存放预先编译好的程序包(Package),程序包中定义了数据集合体、逻辑操作和元件等。

主要是声明在设计或实体中将用到的常量,数据类型,元件及子程序等。

库可以使设计者共享已经编译好的设计结果。

IEEE库:

IEEE标准库使用需声明STD库:

VHDL标准库使用无需声明ASIC库:

EDA厂商提供库使用需声明WORK库:

现行作业库,当前工作目录的所有设计使用无需声明USER库:

用户自定义库使用需声明,VHDL库的种类,库的用法,USE语句的使用有两种常用格式:

USE库名.程序包名.项目名;USE库名.程序包名.ALL;,例:

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.STD_ULOGIC;USEIEEE.STD_LOGIC_1164.RISING_EDGE;USEIEEE.STD_LOGIC_1164.ALL;,格式:

LIBRARY库名;,USE库名.程序包名.All;,库说明的作用范围,从一个实体说明开始到其所属的结构体、配置为止。

当一个源程序中出现两个以上的实体时,必须重复说明。

例:

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYexample1IS()ENDLIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYexample2IS()END,返回,1、IEEE.STD_LOGIC_1164程序包用于说明STD_LOGIC数据类型;2、IEEE.STD_LOGIC_ARITH程序包可用于说明rising_edge函数3、IEEE.STD_LOGIC_UNSIGNED程序包可用于说明算术运算符的重载,即使得逻辑数据可以实现算术运算,常用的VHDL库与程序包,2、普通的赋值语句,将一个值或者一个表达式传递给某一个数据对象,如信号,变量,或由此组成的数组。

信号赋值语句,变量赋值语句,分类:

注意信号和变量的定义位置,赋值目标,赋值符号,组成:

赋值源,基本元素只能是信号和变量,变量“:

=”信号“=”,可以是一个数值或者是一个逻辑或运算表达式,赋值目标与赋值源的数据类型必须严格一致。

3、VHDL数据类型,逻辑数据类型,数值数据类型,布尔代数(Boolean)型,位(Bit),位矢量(Bit_Vector),标准逻辑型(Std_Logic),标准逻辑数组类型(Std_Logic_vector),整数(Integer),无符号(Unsigned)和有符号(Signed),字符串(STRING)数据类型,字符(CHARACTER)数据类型,时间(TIME)数据类型(仿真使用,不能综合),1、逻辑数据类型,

(1)布尔代数(Boolean)型,定义位置:

在std库的standard程序包中进行定义。

取值:

FALSE,TRUE;不能用于运算,只能通过关系运算符获得。

(2)位(Bit),定义位置:

在std库的standard程序包中进行定义。

取值:

0,1,(低电平,高电平),(3)位矢量(Bit_Vector),定义位置:

在std库的standard程序包中进行定义。

SignalA:

bit_vector(0to7);SignalB:

bit_vector(7downto0);A=“00001010”;B=“00001010”;,位矢量是基于“位”数据类型的数组,使用时要注意位宽。

A(7)=0A(6)=1A(5)=0A(4)=1A(3)=0A

(2)=0A

(1)=0A(0)=0B(7)=0B(6)=0B(5)=0B(4)=0B(3)=1B

(2)=0B

(1)=1B(0)=0,(4)标准逻辑型(Std_Logic),定义位置:

在IEEE库的std_logic_1164程序包中进行定义,使用这类数据信号,必须包含下面两条声明语句:

LibraryIEEE;UseIEEE.std_logic_1164.all;,该类型能比较全面地包括数字电路中信号的几种状态,比位“bit”信号对于数字逻辑电路的逻辑特性描述更完整、更真实。

所以在VHDL的程序里,对于逻辑信号的定义,通常都是采用这个“标准逻辑”信号形式,不再使用“BIT”。

(5)标准逻辑数组类型(Std_Logic_vector),定义位置:

在ieee库的std_logic_1164程序包中进行定义。

Bit_Vector与Std_Logic_vector的区别在于数组的每一位前者为BIT型(0,1)后者为Std_Logic型,SignalA:

STD_LOGIC_VECTOR(0to7);SignalB:

STD_LOGIC_VECTOR(7downto0);A=“10100000”;B=“00001010”;,逻辑数据类型赋值举例,Variablea,b:

std_logic;Signaldata:

std_logic_vector(0to3);a:

=1;b:

=0;data=“1100”;,一位值用单引号多位值用双引号,1、直接整体赋值,2.段赋值,Signaldata:

std_logic_vector(0to3);data(1to2)=“10”;data(0)=1;,3.块赋值,Signala,b,c,d:

std_logic;Signaldata:

std_logic_vector(3downto0);data=“0100”;(a,b,c,d)=data;,位置关联,2、数值数据类型,

(1)整数(Integer)定义位置:

在std库的standard程序包中进行定义。

即数值范围为-231231(2147483647TO2147483647)。

整数不能用于逻辑运算,只能用于算术运算。

Signalday:

integerrange0to31;Variablea,b,c:

integer;,1.0十进制浮点数0.0十进制浮点数65971.3333333十进制浮点数65_971.333_3333与上一行等价8#43.6#e+4八进制浮点数43.6E4十进制浮点数,

(2)实数也称浮点数,

(2)无符号(Unsigned)和有符号(Signed)类型,定义位置:

有符号(Signed)和无符号(Unsigned)定义在库IEEE的程序包std_logic_arith中。

符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。

(4)、字符串(STRING)数据类型,双引号引起来字符串数组,一般用于程序的提示和结果说明。

VARIABLEstring_yin:

STRING(1TO3);string_yin:

=abcd;,(3)、字符(CHARACTER)数据类型,单引号引起来,如:

Aa字符分大小写。

A不等于a,(5)、时间(TIME)数据类型(仿真使用,不能综合),TYPEtimeISRANGE2147483647TO2147483647unitsfs;-飞秒,VHDL中的最小时间单位ps=1000fs;-皮秒ns=1000ps;-纳秒us=1000ns;-微秒ms=1000us;-毫秒sec=1000ms;-秒min=60sec;-分hr=60min;-时endunits;,Q=aandborcAFTER10ns;,3用户自定义数据类型定义语句,TYPE语句用法如下:

TYPE数据类型名IS数据类型定义OF基本数据类型;或TYPE数据类型名IS数据类型定义;,

(1)枚举类型(Enumerated)TYPE数据类型名IS(元素,元素,)例如:

TYPEweekIS(sun,mon,tue,wed,thr,fri,sat);用字符来代替数字,

(2)整数类型(Integer):

限定范围,节省硬件资源。

用户自定义的整数类型可认为是整数类型的一个子类。

格式:

TYPE整数类型名IS约束范围例如,如果由用户定义一个用于数码管显示的数据类型,则可写为:

TYPEdigitISRANGE0TO9;,(3)数组(Array)。

数组是将相同类型的数据集合在一起所形成的一个新的数据类型,既可以是一维的,也可以是二维的。

数组定义的书写格式为:

TYPE数据类型名ISARRAY范围OF原数据类型;如果范围这一项没有被指定,则使用整数数据类型;若需用整数类型外的其他数据类型,则在制定数据范围前加数据类型名。

该数组名称为data_bus,共有16个元素,下标分别是15、14、1、0,各元素可分别表示为dat_bus(15)、dat_bus(0)。

除了一维数组外,VHDL还可以定义二维、三维数组,如定义一个16个字节、每字节8位的存储空间的二维数组,可以定义为:

TYPEram_16x8ISARRAY(0TO15)OFSTD_LOGIC_VECTOR(7DOWNTO0);,例如:

TYPEdat_busISARRAY(15DOWNTO0)OFBIT;,(4)用户自定义子类型:

用户对已定义的数据类型作一些范围限制。

子类型定义的一般格式为:

SUBTYPE子类型名IS数据类型名范围例如,SUBTYPEiobusISSTD_LOGIC_VECTOR(4DOWNTO0);,新结构的数据类型及子类型通常在程序包中定义,再由USE语句装载到描述语句中。

用SUBTYPE和TYPE这两种类型定义语句定义的数据类型有一个很重要的区别:

TYPE定义的数据类型是一个“新”的类型,而SUBTYPE定义的数据类型是原类型的一个子集,仍属原类型,即SUBTYPE定义的某数据类型的子类型可以赋值给原类型的数据。

比如,有信号定义为:

SIGNALs_integ:

INTEGERRANGE0TO9;有子类型定义为:

SUBTYPEabcISINTEGERRANGE0TO9;有“新”类型定义为:

TYPEcdeISRANGE0TO9;有两个变量分别定义为上述的类型:

VARIABLEsub_v:

abc;VARIABLEtyp_v:

cde;,则赋值语句s_integ=sub_v;s_integ=typ_v;,s_integ=sub_v;是正确的,因为sub_v是abc类型,而abc是整数类型的子类型,所以sub_v可以赋值给整数类型。

但语句s_integ=typ_v;却是错误的,因为typ_v是cde类型,而cde是新的数据类型,所以虽然cde类型的范围也是09,但它不可以直接赋值给

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1