1VHDL及设计实践任课教师:赵宏智单位:北京交通大学计算机学院E-mail: 2本课程安排:本课程安排:学时:32学时(课堂教学22学时,上机实验10学时)课堂教学内容:课堂教学内容:第一课、引言 第二课、VHDL代码结构 第三课、数据类型 第四课、运算操作符和属性 第五课、并发代码 第六课、顺序代码 第七课、信号与变量 第八课、状态机 第九课、包集和元件 第十课、函数和过程 第十一课、复习与答疑教学目的:教学目的:了解数字集成电路的结构特点 了解数字集成系统的基本设计方法 掌握VHDL的基本语法和主要编程要点 3实验教学内容及要求:实验教学内容及要求:分5次共10学时实验一:学习安装、使用MODELSIM 6.0D,并根据testbench PPT中的两个例子,能够仿真出波形;实验二:(1)用GENERIC语句改写例4.1,设计成通用译码器,要求书写tb代码并仿出波形;(2)课后习题5.6,要求书写tb代码并仿出波形;(3)课后习题6.1,要求书写tb代码并仿出波形;实验三:例子7.5、7.8、8.6,要求书写tb代码并仿出波形;实验四:第9章例题9.2、9.6、9.9,要求书写tb代码并仿出波形;实验五:选做例子串-并型乘法器、并行乘法器、乘-累加电路中的两个,要求书写tb代码并仿出波形;4实验课要求 掌握 Modelsim仿真工具,从简单的电路设计入手,到最后能够设计比较复杂的电子系统,培养设计电路系统的实际动手能力。
实验教学目的:实验教学目的:掌握常用EDA工具的基本使用方法,掌握常用数字电路的设计特点5 考核方式考核方式 内容:基本概念与基本功能器件的设计内容:基本概念与基本功能器件的设计编程编程 方式:平时作业、上机与试卷相结合方式:平时作业、上机与试卷相结合 平时作业与上机平时作业与上机 20%考试试卷考试试卷 80%6教材及参考资料教材及参考资料教材:教材:VHDL数字电路设计教程,Volnei A.Pedroni著,乔庐峰等译,电子工业出版社 参考资料:参考资料:1 Altera FPGA/CPLD设计(基础篇),王诚等著,人民邮电出版社2 Altera FPGA/CPLD设计(高级篇),王诚等著,人民邮电出版社3FPGA/VHDL快速工程实践入门与提高,杨恒、卢飞成编著,北京航空航天大学出版社7相关网址: 8 第一章第一章 引言引言 VHDL的历史 VHDL的作用 VHDL的语言特点 VHDL与其它硬件描述语言的比较 VHDL设计概述 从VHDL代码到电路的转化9VHDL的历史VHDL:VHSIC(Very High Speed Integrated Circuit)Hardware Description Language1.80年代初由美国国防部在实施超高速集成电路(VHSIC)项目时开发的。
2.1987年由 IEEE 协会批准为 IEEE 工业标准,称为 IEEE1076-1987各EDA公司相继推出支持VHDL的设计环境3.1993年被更新为 93 标准,即IEEE1076-1993进一步提高抽象描述层次,扩展系统描述能力10VHDL的作用的作用1、VHDL打破软、硬件的界限传统的数字系统设计分为:硬件设计(硬件设计人员)软件设计(软件设计人员)2、采用文本形式进行程序设计,包含许多具有硬件特征的语句,主要用于描述数字系统的结构、功能、行为和接口,能够支持电路硬件的设计、验证、综合和测试;设计与具体工艺无关,适合于多层次大规模设计,具有良好的开放性和并行设计能力、便于交流保存共享VHDL是电子系统设计者和 EDA工具之间的界面EDA工具及 HDL的流行,使电子系统向集 成化、大规模和高速度等方向发展美国硅谷约有80%的 ASIC和 FPGA/CPLD已采用 HDL进行设计11VHDL的语言特点的语言特点VHDL具有强大的语言结构,系统硬件描述能力强、设计效率高;具有较高的抽象描述能力VHDL语言可读性强,易于修改和发现错误VHDL具有丰富的仿真语句和库函数VHDL源代码进行早期功能仿真,有利于大系统的设计与验证。
VHDL设计与硬件电路关系不大12VHDL设计不依赖于器件,与工艺无关可移植性好VHDL体系符合TOP-DOWN和CE(并行工程)设计思想VHDL设计效率高,产品上市时间快,成本低易于ASIC实现13VHDLVHDL与其它硬件描述语言的比较与其它硬件描述语言的比较VHDL:具有较强的系统级抽象描述能力,适合行为级和 RTL级的描述设计者可不必了解电路细节,所作工作较少,效率高但对综合器的要求高,不易控制底层电路的生成IEEE标准,支持广泛行为级RTL级门电路级(RTL:Register Translate Level,寄存器传输级)14Verilog HDL:系统级抽象描述能力比VHDL稍差;门级开关电路描述方面比 VHDL 强适合 RTL级和门电路级的描述设计者需要了解电路细节,所作工作较多IEEE标准,支持广泛ABEL、PALASM、AHDL(Altera HDL):系统级抽象描述能力差,一般作门级 电路描述要求设计者对电路细节有详细的了解对综合器的性能要求低,易于控制电路资源15VHDL设计简述VHDL主要用于描述数字系统主要用于描述数字系统的的结构、行为、功能和接口结构、行为、功能和接口。
VHDL将一个设计(元件、电路、将一个设计(元件、电路、系统)分为:系统)分为:外部(可视部分、端口)外部(可视部分、端口)内部(不可视部分、内部功能、内部(不可视部分、内部功能、算法)算法)16文本编辑器、图形编辑器 VHDL综合器(逻辑综合、优化)FPGA/CPLD布线/适配器(自动优化、布局、布线、适配)VHDL仿真器(行为仿真、功能仿真、时序仿真)编程器/下载电缆(编程、下载)测试电路(硬件测试)网表文件(EDIF、XNL、VHDL)门级仿真器(功能仿真、时序仿真)各种编程文件VHDL的的FPGA/CPLD工程设计流程工程设计流程17从VHDL代码到电路的转化 一位全加器全加器abcinscout 功能分析:真值表方法逻辑表达式:Cout=a.b+a.cin+b.cinS=a b cin电路外部框图18用VHDL描述一位全加器的功能:(full_adder.vhd)ENTITY full_adder ISPORT(a,b,cin:IN BIT;s,cout:OUT BIT);END full_adder;ARCHITECTURE dataflow OF full_adder ISBEGIN s=a XOR b XOR cin;coutnew-project;往project里添加源文件。
分为两种:一种是目标代码,另一种是测试代码testbench;添加一个work库,File-new-library;编译源文件,Compile-Compile all;开始仿真,Simulate-star simulation;选择testbench文件作为top-level文件;查看波形,Add-wave 单击run图标 调试ModelsimModelsim 6.0 6.0的使用步骤的使用步骤22testbenchtestbench的组织的组织简单的简单的test bench向要验证的设计提供向量,人工验证输出向要验证的设计提供向量,人工验证输出复杂的复杂的test bench是自检测的,其结果自动验证是自检测的,其结果自动验证stimulus要验证的设计简单的test bench复杂的test bench激励验证结果要验证的设计23施加激励施加激励 产生激励并加到设计的方法:将产生激励并加到设计的方法:将component实例化,实例化,并对其施加一些输入值和时间量并对其施加一些输入值和时间量具体做法:具体做法:主代码作为一个单独的主代码作为一个单独的x_main.vhd文件;文件;testbench代码作为另外一个代码作为另外一个.vhd文件,并且在其中将主文件,并且在其中将主代码代码x_main中的实体声明为中的实体声明为component;在在testbench代码中对代码中对component的输入端口赋一些初值,的输入端口赋一些初值,并用并用wait for x_time来给出时序关系。
来给出时序关系24Tb代码的基本特点1.Tb代码本身不生成具体的电路,仅供仿真之用;2.模板固定,记住即可:其entity中无需定义in/out port,原因:tb代码的输出信号往往是由设计者手工直接提供,而不是由一组tb的输入信号经过功能运算自动生成的;需使用process语句,因为所提供的测试用例都是时间相关的,是顺序执行的;由于无需输入信号,因此其process的敏感信号列表为空;测试用例往往是手工赋值的,且不生成具体电路,因此不需要使用generic语句来设计多种规格的测试用例;25-目标文件fulladder.vhd-ENTITY fulladder IS PORT(a,b,ci:IN bit;co,s:OUT bit);END fulladder;ARCHITECTURE rtl OF fulladder ISBEGIN s=a xor b xor ci;co=(a and b)or(a and ci)or(b and ci);end rtl;例例1 1:使用元件实例化方法编写的:使用元件实例化方法编写的testbenchtestbench26-测试文件testadder.vhd-entity fa_testbench isend fa_testbench;architecture beh of fa_testbench iscomponent fulladder port(a,b,ci:in bit;s,co:out bit);end component;signal xt,yt,zt,st,cot:bit;begin u1:fulladder port map(xt,yt,zt,st,cot);process begin xt=0;yt=0;zt=0;wait for 10 ns;xt=0;yt=0;zt=1;wait for 10 ns;xt=0;yt=1;zt=0;wait for 10 ns;xt=0;yt=1;zt=1;wait for 10 ns;xt=1;yt=0;zt=0;wait for 10 ns;xt=1;yt=0;zt=1;wait for 10 ns;xt=1;yt=1;zt=0;wait for 10 ns;xt=1;yt=1;zt=1;wait for 10 ns;xt=0;yt=0;zt=0;wait for 10 ns;end process;end beh;27同步时序电路的同步时序电路的testbenchtestbench中中clkclk的典型写法的典型写法 .process begin clk=0;wait for 12 ns;loop clk=not clk;wait for 7 ns;end loop;end process;.半个时钟周期的长度等待时钟信号开始工作的时间28注意:需要将端口信号全部定义为signal;电路内部的一些连线(信号或变量)的赋值信息不能出现在tb中,否则将导致这些中间信号不能变化;测试向量或矢量的赋值需要出现在process中,否则就被看做是并发赋值,易造成“线与”现象,导致波形错误。
29 Wait for语句和after语句的区别:1、after表示从仿真周期的起点开始,到当前信号值发生变化时的整个时间区间,当该信号需要再次变化时,时间量只能升序例:x=1 after 10ns;x=2 after 20ns;x=3 after 30ns;2、wait for语句表示一个信号值的保持时间长度,时间量的大小不必升序例:x=1;wait for 10ns;x=2;wait for 5ns;x=5;wait for 2ns;此外,每个信号被赋新值之后,必须要wait for 一个时间间隔,否则编译器认为该信号值持续时间为0,不能在波形上反映出来30 第二章第二章 VHDL代码代码结构结构 VHDL代码基本单元 库声明 库的种类 库的声明 实体 构造体 例题31VHDL代码基本单元一段独立的一段独立的VHDLVHDL代码至少代码至少包括包括三个部分:三个部分:库(Library)声明:如ieee,std,work等 实体(Entity):I/O Pin 构造体(Architecture)或结构体:具体描述电路所要实现的功能 32 一、一、库库 将常用代码存放到库中有利于设计的复用和代码共享,也可使代码结构更清晰;库的典型结构:库库包集包集函数函数过程过程元件元件常量常量类型类型库是一些常用代码的集合。
一个库的基本组成部分331.11.1、库的种类、库的种类 VHDL有3个常用的库:1 1)IEEE IEEE 库库 定义了四个常用的程序包:std_logic_1164 std_logic_1164(std_logic(8值逻辑)&std_ulogic(9值逻辑)std_logic_arith std_logic_arith(signed、unsigned数据类 型的算术、比较运算函数)std_logic_signed std_logic_signed(std_logic_vector类型 数据的一些signed运算操作函数)std_logic_unsigned std_logic_unsigned(std_logic_vector类型数据的一些unsigned运算操作函数)34 2 2)STD STD 库(默认库)库(默认库)VHDL的标准资源库,包括数据类型和输入/输出文本等内容库中包集有:standard和textio3 3)WORKWORK库(默认库)库(默认库)当前工作库,当前设计的所有代码都存放在work库中,无需声明351.21.2、库的声明、库的声明 在使用库之前,首先需要对库进行声明。
用关健字library说明要使用的库,用关健字 use 说明要使用的库中的程序包库的声明总是放在实体单元前面,默认库可不作说明库的作用范围:仅限于所说明的设计实体每一个设计实体都必须有自已完整的库说明语句LIBRARY library_name;USE library_name.package_name.package_parts;36库中常用的3个包集:ieee.std_logic_1164(ieee库)standard(std库)work 例:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.conv_integer;37二、实体(二、实体(ENTITYENTITY)实体:定义电路的输入输出端口或引脚端口声明:确定输入、输出端口的数目和类型语法结构:ENTITY IS Port(port_name1,port_name2:signal_mode signal_type;port_name3:signal_mode signal_type;)END;38 端口的信号模式(signal_mode):in:输入型,单向引脚,只读。
out:输出型,单向引脚,不能供电路内部使用inout:输入输出型,双向引脚,可读也可写buffer:缓冲型,与 out 相似,但可供电路内部使用电路电路INOUTINOUTBUFFER391 工作 B=A传输结果ENG1 G20A=B工作原理高阻态工作高阻态out和 buffer 的典型结构:用法如P112页out1/out2的使用inout的典型结构:多用于数据总线的设计,节省引脚数目!EN1 1ENG1EN1 1ENG2BA40 信号的类型:BIT、STD_LOGIC、INTEGER等;实体ENTITY的命名:不要与VHDL关键字冲突例子:基本的与非门-纯组合逻辑abcENTITY nand_gate IS PORT(a,b:IN BIT;x:OUT BIT );END nand_gate;41作用:描述电路行为和实现功能,如定义元件及内部的连接关系两个组成部分:声明部分(可选),对数据类型、常量、信号等元素进行声明代码部分(BEGIN与END之间):描述电路的行为或功能名称:不能与VHDL关键字冲突,可与ENTITY同名;三、构造体(三、构造体(ARCHITECTURE)或结构体)或结构体42注:同一实体的结构体不能同名。
定义语句中的 常数、信号不能与实体中的端口同名architecture 结构体名称 of 实体名称 is 声明语句内部信号、常数、数据类型、子程序(函数、过程)、元件等的说明;begin (代码);end 结构体名称;构造体的语法:43 构造体举例:ARCHITECTURE myarch OF nand_gate ISBEGIN x=a NAND b;END myarch;44例题 例1 带有异步复位端的D触发器纯时序逻辑DFFaclkrstq功能描述:rst=1时,输出q置低电平;否则,时钟信号上升沿时输入的值传递给输出q;注意:时序电路电路随着时钟节拍一步一步地顺序工作顺序执行的代码451-2 LIBRARY ieee;3 USE ieee.std_logic_1164.all;4-5 ENTITY dff IS6 PORT(d,clk,rst:IN STD_LOGIC;7 q:OUT STD_LOGIC);8 END dff;9-10 ARCHITECTURE behavior OF dff IS11 BEGIN12 PROCESS(rst,clk)13 BEGIN14 IF(rst=1)THEN15 q=0;16 ELSIF(clkEVENT AND clk=1)THEN17 q=d;18 END IF;19 END PROCESS;20 END behavior;21-注意:VHDL不区分大小写!46testbenchtestbench代码:代码:library ieee;use ieee.std_logic_1164.all;entity testbench_dff isend testbench_dff;architecture behavior of testbench_dff iscomponent dff is port(d,clk,rst:in std_logic;q:out std_logic);end component;signal d,clk,rst,q:std_logic;begin u1:dff port map(d,clk,rst,q);process begin clk=0;wait for 10 ns;loop clk=not clk;wait for 5 ns;end loop;end process;d=0,1 after 10 ns,0 after 20 ns,1 after 30 ns,0 after 40 ns,1 after 50 ns,0 after 60 ns,1 after 70 ns,0 after 80 ns;rst=1 after 10 ns,0 after 20 ns;end behavior;47例子2.1的仿真波形图48 例2 D触发器+与非门-组合逻辑与时序逻辑相结合的电路功能描述:无复位端rst;时钟信号上升沿时a NAND b的结果传递给输出q;DFFclkqab49-LIBRARY ieee;USE ieee.std_logic_1164.all;1-2 ENTITY example IS3PORT(a,b,clk:IN BIT;4 q:OUT BIT);5 END example;6-7 ARCHITECTURE example OF example IS8 SIGNAL temp:BIT;9 BEGIN10 temp=a NAND b;11 PROCESS(clk)12 BEGIN13 IF(clkEVENT AND clk=1)THEN q=temp;14 END IF;15 END PROCESS;16 END example;17-并发执行50testbenchtestbench代码:代码:entity testbench_dffandnot isend testbench_dffandnot;architecture behavior of testbench_dffandnot is component dffandnot is port(a,b,clk:in bit;q:out bit);end component;signal a,b,clk,q:bit;begin u2:dffandnot port map(a,b,clk,q);process begin clk=0;wait for 10 ns;loop clk=not clk;wait for 5 ns;end loop;end process;a=0 after 10 ns,1 after 30 ns,0 after 40 ns;b=0 after 10 ns,1 after 20 ns,0 after 30 ns,1 after 40 ns;end behavior;51例子2.2的仿真波形图52第2章 思考题 1、VHDL中最基本的结构是什么?其作用各是什么?2、说明inout、out 和 buffer有何异同点。
课后作业:2.1(a)2.1(b)53 第三章 数据类型 预定义的数据类型预定义的数据类型 用户定义的数据类型用户定义的数据类型 子类型子类型 数组数组 端口数组端口数组 记录类型记录类型 有符号数和无符号数有符号数和无符号数 数据类型转换数据类型转换 要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且相同数据类型的量才能互相传递和作用54 指在IEEE 1076和IEEE 1164标准中预先定义的一系列数据类型,可以在包集/库中找到lstd库的standard包集:BIT、BOOLEAN、INTEGER、REAL数据类型;lieee库的std_logic_1164包集:STD_LOGIC、STD_ULOGIC数据类型;lieee库的std_logic_arith包集:SIGNED、UNSIGNED数据类型;数据类型转换函数conv_integer(p),conv_unsigned(p,b)等;lieee库的std_logic_signed和std_logic_unsigned包集:一些函数,将STD_LOGIC_VECTOR类型数据进行类似SIGNED、UNSIGNED类型数据的运算;3.1 3.1 预定义的数据类型预定义的数据类型551)1)BIT(位,表示一位的信号值,位值为0或1)和BIT_VECTOR(位矢量,表示一组位数据)。
l声明:SIGNAL X:BIT;SIGNAL Y:BIT_VECTOR(3 DOWNTO 0);SIGNAL W:BIT_VECTOR(0 DOWNTO 3);注意:最高位MSB(Most Significant Bit)的顺序!l赋值:X=1;-单引号!Y=“1001”;-双引号!562)2)STD_LOGICSTD_LOGIC和和STD_LOGIC_VECTORSTD_LOGIC_VECTOR:这两者是IEEE 1164标准中引入的8逻辑值系统std_logic_vector类型是由 std_logic 构成的数组定义如下:type std_logic_vector is array(natural range)of std_logic;赋值的原则:相同位宽,相同数据类型定义8种数字逻辑值的原因:由std_logic 类型代替 bit 类型可以完成电子系统的精确模拟,并可实现常见的三态总线电路57 两个或以上数字逻辑电路的输出端连接到同一个节点时(称为“线与”现象!),节点的电平该如何取值?典型案例:总线!1 1EN1ENAY11 1EN2ENBY21 1EN3ENCY3总总 线线 驱动能力强的电路可以将节点电平强行拉高或拉低,因此需建立多值逻辑系统加以细分。
节点的电平取值取决于:两者或多者当前的输出电平值;两者的驱动能力强弱X:强不确定值;W:弱不确定值;0:强0;L:弱0;1:强1;H:弱1;Z:高阻态(三态缓冲器,常用于总线设计)-:不可能出现的情况588逻辑值系统数值关系表逻辑值系统数值关系表数值关系归纳:数值关系归纳:X或或-与其它数值连接时,最终电平取值均为与其它数值连接时,最终电平取值均为X;Z与其它数值连接时,最终电平取值均为其它数值;与其它数值连接时,最终电平取值均为其它数值;与与X类似,类似,W与与L/H数值连接时,最终电平取值均为数值连接时,最终电平取值均为W;0与与1、L与与H连接时,最终电平取值分别为连接时,最终电平取值分别为X、W;多个输出连接到同一个节点上时,节点的电平取值:59STD_LOGIC_VECTORSTD_LOGIC_VECTOR类型数据的算术运算操作类型数据的算术运算操作 STD_LOGIC_VECTOR类型数据不能直接进行算术运算通过声明ieee库中的std_signed和std_logic_unsigned这两个包集,该类型数据即可进行算术运算例:LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;signal a,b:IN STD_LOGIC_VECTOR(7 DOWNTO 0);signal c:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);c=a+b;603 3)STD_ULOGICSTD_ULOGIC和和STD_ULOGIC_VECTORSTD_ULOGIC_VECTOR:比STD_LOGIC类型多引入了一个逻辑值U,代表初始不定值。
但没有指定两个STD_ULOGIC信号连接到同一个节点上发生冲突后的逻辑值,因此要避免两个输出信号直接进行连接的情况614 4)布尔类型()布尔类型(booleanboolean)布尔量具有两种状态:false 和 true 常用于逻辑函数,如相等(=)、比较()等中作逻辑比较如,bit 值转化成boolean 值:boolean_var:=(bit_var=1);5 5)字符()字符(CHARACTERCHARACTER):用单引号将字符括起来variable character_var:character;.Character_var:=A;626 6)整数()整数(integerinteger)integer 表示所有正的和负的整数硬件实现时,利用32位的位矢量来表示可实现的整数范围为:-(231-1)to (231-1)VHDL综合器要求对具体的整数作出范围限定,否则无法综合成硬件电路如:signal s:integer range 0 to 15;信号 s 的取值范围是0-15,可用4位二进制数表示,因此 s 将被综合成由四条信号线构成的信号637 7)自然数()自然数(naturalnatural)和正整数()和正整数(positivepositive)natural是integer的子类型,表示非负整数。
positive是integer的子类型,表示正整数定义如下:subtype natural is integer range 0 to integerhigh;subtype positive is integer range 1 to integerhigh;648 8)实数()实数(REALREAL)或称浮点数 取值范围:-1.0E38-+1.0E38 实数类型仅能用于VHDL仿真器,一般综合器 不支持9 9)物理量字符()物理量字符(Physical literalPhysical literal):时间、电压等,可以仿真,但不可综合(即综合库中没有直接可以调用的器件)由整数和物理单位组成 如:55 ms,20 ns651010)SIGNED(有符号数)和UNSIGNED(无符号数):ieee库std_logic_arith包集中定义的数据类型,只能表示大于等于0的数,能够支持算术运算、比较运算,但不支持逻辑运算只有在代码开始部分声明ieee库中的包集std_logic_arith,才能使用有符号数和无符号数有符号数和无符号数的语法结构与STD_LOGIC_VECTOR相似,与整数不同,例如:SIGNAL X:SIGNED(7 DOWNTO 0);SIGNAL Y:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL Z:INTEGER RANGE 0 TO 255;66 例:例:signedsigned和和unsignedunsigned数数的合法与非法的合法与非法操作操作:library ieeelibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_1164.all;use ieee.std_logic_arith.alluse ieee.std_logic_arith.all;-;-必须声必须声明该包集才能使用明该包集才能使用signedsigned和和unsignedunsigned数数。
signal a,b:IN SIGNED(7 DOWNTO 0);signal x:OUT SIGNED(7 DOWNTO 0);x=a+b;-合法(支持算术运算)x=a AND b;-非法(不支持逻辑运算)67 例:例:STD_LOGIC_VECTORSTD_LOGIC_VECTOR的合法与非法操作的合法与非法操作:library ieeelibrary ieee;use ieee.std_logic_1164.all;-use ieee.std_logic_1164.all;-不必声明其它不必声明其它包集包集signal a,b:IN std_logic_vector(7 DOWNTO 0);signal x:OUT std_logic_vector(7 DOWNTO 0);x=a+b;-非法(不支持算术运算)x=a AND b;-合法(支持逻辑运算)-注意:如果声明std_logic_signed和std_logic_unsigned两个包集,则STD_LOGIC_VECTOR类型的数据也可以进行算术运算68 例:例:STD_LOGIC_VECTORSTD_LOGIC_VECTOR的合法与非法操作的合法与非法操作:library ieeelibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.alluse ieee.std_logic_unsigned.all;signal a,b:IN std_logic_vector(7 DOWNTO 0);signal x:OUT std_logic_vector(7 DOWNTO 0);x=a+b;-合法(支持算术运算)x=a AND b;-合法(支持逻辑运算)693.2 3.2 用户定义的数据类型用户定义的数据类型 用类型定义语句TYPE实现用户自定义数据类型。
TYPE语句格式:例:type byte is array(7 downto 0)of bit;variable addend:byte;type week is(sun,mon,tue,wed,thu,fri,sat);type 数据类型名 is 数据类型定义 of 基本数据类型;可选701 1)用户定义的)用户定义的整数类型整数类型 用户定义的整数类型是标准包中整数类型的子范围格式:例:type my_natural is range 0 to 9;-用户定义的自然数类型;type my_integer is range-3 to 3;-用户定义的整数类型;type 类型名称 is range 整数范围;712 2)枚举()枚举(enumeratedenumerated)类型)类型 枚举该类型的所有可能的值格式:如:type my_logic is(0,1,Z);type state is(idle,forward,backward,stop);-常用于有限状态机的定义type color is(blue,green,yellow,red);variable hue:color;hue:=blue;type bit_vector is array(natural range)of BIT;-range表示数据取值范围没有约束,natural range表示数据值约束在自然数范围内。
type 类型名称 is (枚举文字,枚举文字);72枚举类型的编码:综合器自动实现枚举类型元素的编码,一般将第一个枚举量(最左边)编码为0,以后的依次加1编码用位矢量表示,位矢量的长度将取所需表达的所有枚举元素的最小值如:type color is(blue,green,yellow,red);编码为:blue=“00”;green=“01”;yellow=“10”;red=“11”;733.3 3.3 子类型子类型 子类型是已定义的类型或子类型的一个子集格式:例:bit_vector 类型定义如下:type bit_vector is array(natural range)of bit;如设计中只用16bit;可定义子类型如下:subtype my_vector is bit_vector(0 to 15);注:子类型与基(父)类型具有相同的操作符和子 程序可以直接进行赋值操作subtype 子类型名 is 数据类型名范围;74SUBTYPE语句格式:例:subtype digits is integer range 0 to 9;由subtype 语句定义的数据类型称为子类型subtype 子类型名 is 基本数据类型 约束范围;753.4 3.4 数组(数组(ARRAYARRAY)数组是将相同数据类型的数据集合在一起形成的一种新的数据类型。
可以是1D、2D或1D*1D,更高维数的数组往往是不可综合(即综合库中没有直接可以调用的器件)的数组的结构:00 1 0 0 00 1 0 0 01 1 0 1 00 1 1 0 00 1 0 0 01 1 0 1 00 1 1 0 0a.标量标量b.1D数组数组 矢量矢量c.1D*1D矢量数组矢量数组 d.2D 二维标量数组二维标量数组76type type_name is array(specification)of data_type;VHDL中预定义的数据类型仅包括标量类型(单个位)和矢量类型(一维数组)两类,并没有预定义2D和1D*1D数组,用户可以自定义定义的语法如下:数组类型对signal/variable/constant的声明的语法如下:signal(constant/variable)signal_name:type_name:=initial_value;可选77 例子:一种定义1D*1D数组的方法:TYPE row IS ARRAY(7 DOWNTO 0)OF STD_LOGIC;-1D数组;TYPE matrix IS ARRAY(0 TO 3)OF row;-1D*1D数组,矢量数组;SIGNAL x:matrix;-声明是1D*1D信号另一种定义1D*1D数组的方法:TYPE matrix IS ARRAY(0 TO 3)OF STD_LOGIC_VECTOR(7 DOWNTO 0);二维数组的定义方法:TYPE matrix2D IS ARRAY(0 TO 3,7 DOWNTO 0)OF STD_LOGIC;矢量标量78 例:数组的初始化:CONSTANT X:vector_array:=(”0011”,”1100”,”0101”);-常用于指令或数据ROM设计中。
signal Y:vector_array2:=(1,0,0,1);variable Z:vector_array3:=(0,1,1,0),(1,0,1,1);例:合法与非法的数组赋值:TYPE row IS ARRAY(7 DOWNTO 0)OF STD_LOGIC;TYPE array1 IS ARRAY(0 TO 3)OF row;TYPE array2 IS ARRAY(0 TO 3)OF STD_LOGIC_VECTOR(7 DOWNTO 0);TYPE array3 IS ARRAY(0 TO 3,7 DOWNTO 0)OF STD_LOGIC;79 SIGNAL x:row;SIGNAL y:array1;SIGNAL v:array2;SIGNAL w:array3;-x=v(1);-非法,类型不匹配,x是row类型,而v(1)是STD_LOGIC_VECTOR类型的x=w(2);-非法,w必须带两个索引值;x=w(2,2 DOWNTO 0);-非法,X是row类型的,而右侧是std_logic类型的v(0)=w(2,2 DOWNTO 0);-非法,v(0)是std_logic_ vector类型的,右侧是std_logic类型的,数据类型不匹配。
w(1,5 DOWNTO 1)=v(2)(4 DOWNTO 0);-非法,类型不匹配803.5 3.5 端口数组端口数组,例:例:-包集包集-library ieeelibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_1164.all;-PACKAGE PACKAGE my_data_typesmy_data_types IS IS TYPE TYPE vector_arrayvector_array IS IS ARRAY(NATURAL RANGE)OF STD_LOGIC_VECTOR(7 DOWNTO 0);ARRAY(NATURAL RANGE)OF STD_LOGIC_VECTOR(7 DOWNTO 0);END my_data_typesEND my_data_types;-主代码主代码-library ieeelibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_1164.all;use work.use work.my_data_typesmy_data_types.all.all;-;-用户定义的包集用户定义的包集-ENTITY muxENTITY mux IS IS PORT(PORT(inpinp:IN:IN vector_arrayvector_array(0 TO 3);(0 TO 3);.);.);END muxEND mux;.ENTITY中不允许使用TYPE进行类型定义,须在包集中自定义。
81-包集包集-library ieeelibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_1164.all;-PACKAGE PACKAGE my_data_typesmy_data_types IS IS CONSTANTCONSTANT b b:INTEGER:=7;:INTEGER:=7;TYPE TYPE vector_arrayvector_array IS IS ARRAY(NATURAL RANGE)OF ARRAY(NATURAL RANGE)OF STD_LOGIC_VECTOR(STD_LOGIC_VECTOR(b b DOWNTO 0);DOWNTO 0);END my_data_typesEND my_data_types;-包含常量的声明823.6 3.6 记录类型记录类型 记录是不同类型的名称域的集合,而ARRAY只能包含相同类型的数据格式如下:访问记录体元素的方式:记录体名.元素名type 记录类型名 is record 元素名:数据类型名;元素名:数据类型名;end record;83例:constant len:integer:=8;subtype byte_vec is bit_vector(len-1 downto 0);type byte_and_ix is record byte:byte_vec;ix:integer range 0 to len;end record;signal x,y,z:byte_and_ix;signal data:byte_vec;signal num:integer;.x.byte=“11110000”;x.ix=2;data=y.byte;num=y.ix;z=x;843.7 3.7 数据类型转换数据类型转换 VHDL是一种强类型语言,不同类型的数据对象必须经过类型转换,才能相互操作。
两种实现数据类型转换的常见方法:1)写一段专用于数据类型转换的VHDL代码2)调用包集中预定义的数据类型转换函数,如包集std_logic_116485例:不同类型数据的合法与非法操作 TYPE long IS INTEGER RANGE-100 TO+100;TYPE short IS INTEGER RANGE-10 TO+10;SIGNAL x:short;SIGNAL y:long;y=2*x+5;-非法(数据类型不匹配,虽然都是INTEGER的子类型!)y=long(2*x+5);-合法(运算结果已经强制转换成long类型86ieee.std_logic_arithieee.std_logic_arith中提供了多种中提供了多种数据类型转换函数数据类型转换函数:不包括std_logic_vector类型,如有需要,须使用std_logic_unsigned/signed包集87例:数据类型转换例:数据类型转换 library ieeelibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_1164.all;use ieee.std_logic_arith.alluse ieee.std_logic_arith.all;.signal a:IN unsigned(7 DOWNTO 0);signal a:IN unsigned(7 DOWNTO 0);signal b:IN unsigned(7 DOWNTO 0);signal b:IN unsigned(7 DOWNTO 0);signal y:OUT std_logic_vector(7 DOWNTO 0);signal y:OUT std_logic_vector(7 DOWNTO 0);.y=CONV_STD_LOGIC_VECTOR(a+b),8);y=CONV_STD_LOGIC_VECTOR(a+b),8);883.8 3.8 可综合可综合的数据类型的数据类型 数据类型数据类型 可综合的数值可综合的数值BIT,BIT_VECTOR 0,1STD_LOGIC,STD_LOGIC_VECTOR X,0,1,Z,不是全部的8值都可综合的;另,在不需要X,Z两种取值时可用BIT类型混用。
STD_ULOGIC,STD_ULOGIC_VECTORX,0,1,Z,不是全部的8值都可综合的;另,在不需要X,Z两种取值时可用BIT类型混用BOOLEAN True,FalseNATURAL /UNSIGNED 0到+2 147 483 647INTEGER /SIGNED -2 147 483 647到+2 147 483 647用户自定义整型 INTEGER的子集用户自定义枚举类型 根据用户自定义进行编码得到SUBTYPE 任何预定义或用户自定义类型的子集ARRAY 上述任一种类型数据的集合RECORD 上述多种类型数据的集合89 例子:常用数据类型的声明与赋值例子:常用数据类型的声明与赋值signal a:BIT;signal b:BIT_VECTOR(7 DOWNTO 0);signal c:STD_LOGIC;signal d:STD_LOGIC_VECTOR(7 DOWNTO 0);signal e:INTEGER RANGE 0 TO 255;a=b(5);a=c;b(0)=a;b=d;类型不匹配c=d(5);e=b;d(0)=c;e=d;b0,1=1,OTHERS=1);C=Z;90例子:例子:单个位和位矢量单个位和位矢量ENTITY and2 IS PORT(a,b:IN BIT;x:OUT BIT);END and2;architecture and2 of and2 isBEGIN x=a AND b;END and2;ENTITY and2 IS PORT(a,b:in bit_vector(0 TO 3);x:out bit_vector(0 TO 3);END and2;architecture and2 of and2 isBEGIN x=a AND b;END and2;91abxa(0)b(0)x(0)a(1)b(1)x(1)a(2)b(2)x(2)a(3)b(3)x(3)92例子:例子:4 4位加法器位加法器library ieee;use ieee.std_logic_1164.all;use iee.std_logic_arith.all;entity adder1 is port(a,b:in signed(3 downto 0);sum:out signed(4 downto 0);end adder1;architecture adder1 of adder1 isbegin sum=a+b;end adder1;library ieee;use ieee.std_logic_1164.all;use iee.std_logic_arith.all;entity adder2 is port(a,b:in signed(3 downto 0);sum:out integer range-16 to 15);end adder2;architecture adder2 of adder2 isbegin sum=conv_integer(a+b);end adder2;+a(3:0)b(3:0)sum(4:0)4位加法器位加法器93补充:补充:VHDLVHDL文字规则文字规则1、数字型文字 1)整数文字:十进制整数 如:5,678,156E2(=15600),45_234_287(=45234287)2)实数文字:带小数的十进制数 如:23.34,2.0,44.99E-2(=0.4499)8_867_551.23_909(8867551.23909)94 3)以数制基数表示的文字 格式:如:10#170#(=170)2#1111_1110#(=254)16#E#E1(=2#1110_0000#=224)或:(=1416=224)16#F.01#E+2 (=(15+1/(1616)1616=3841.00)基数#数字文字#E指数95 4)物理量文字 如:60 s、100 m、177 mA 注:整数可综合实现;实数一般不可综合实现;物理量不可综合实现;962、字符串型文字(文字串和数字串)按字符个数多少分为:字符:用单引号引起来的ASCII字符,可以 是数值,也可以是符号或字母。
如:A,*,Z 字符串:用双引号引起来的一维字符数组97字符串分为:1)文字字符串:“文字”如:“ERROR”,“XXXXXXXX”,“ZZZZZZZZ”,-必须是大写 “X”,“BOTH S AND Q EQUAL TO L”。