2选1数据选择器的VHDL描述
EDA技术与应用的二选一选择器
EDA 技术与应用的二选一选择器学院名称: 东方学院专 业: 电子信息工程班 级:学 号:姓 名:指导教师姓名:指导教师职称:2007年 4 月24日JIANGSU TEACHERS UNIVERSITY OF TECHNOLOGY 本科课程设计(论文)二选一选择器一.设计目的1.学习VHDL编程;2.进一步熟悉实验箱电路;二.设计指标及功能要求设计指标:(1)对所设计的小系统功能正确分析;(2)基于VHDL语言描述系统的功能;(3)在QUARTUSⅡ环境中编译通过;(4)仿真通过,并得到正确的波形;(5)给出相应设计报告;功能要求:1.用VHDL语言设计可控加减计数器;2.至少两层电路,底层有三种元件;3.使得其执行可控加,减记数;三.实验步骤1.建立Light目录,用于存放本实验所建立的文本2.点击“File New”,在出现的对话框中,选择“VHDL File”进入文本编辑器。
3.输入VHDL语言源文件。
4.点“Save as”,保存该源文件。
5.进行编译,点“start compilation”,若语句有错会有提示,修改后重新编译直到无错误。
6.点“File New”,选择“Vector Waveform File”,建立仿真输入文件.7.点“End time”,输入终止时间(表示波形长度).点“light”将所有信号选中或部分选中。
点“start simulation”.运行波形,直至正确。
四、电路工作原理首先,用异或门控制输入端,加一个脉冲信号。
在其后方分别加上加法计数器和减法计数器:来一个脉冲,当异或门输出为0时,减法计数器开始工作,当输出为1时,加法计数器工作。
这样,利用给异或门加不同的信号来控制加减计数器。
五.各子模块设计与调试过程library ieee;use ieee.std_logic_1164.all;entity ora isport(a:in std_logic;b:out std_logic);end entity;architecture one of ora isbeginb<=not a;end architecture;library ieee;use ieee.std_logic_1164.all;entity noxa isport(a,b:in std_logic;c:out std_logic);end entity;architecture one1 of noxa isbeginc <= a xor b;end architecture;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt10a isport(CP,EN:in std_logic;q:out std_logic_vector(3 downto 0)); end cnt10a;architecture one of cnt10a isbeginprocess(CP,EN)variable q1:std_logic_vector(3 downto 0);beginif(CP'event and CP='1') thenif EN='1' thenif(q1<9) then q1:=q1+1;else q1:=(others=>'0');end if;end if;end if;q<=q1;end process;end one;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity cnt10b isport(CP,EN:in std_logic;q: out std_logic_vector(3 downto 0)); end cnt10b;architecture one of cnt10b isbeginprocess(CP,EN)variable q1:std_logic_vector(3 downto 0);beginif(CP'event and CP='1') thenif EN='1' thenif(q1=0) then q1:="1001";else q1:=q1-1;end if;end if;end if;q<=q1;end process;end;library ieee;use ieee.std_logic_1164.all;entity kekong isport(a1,b1,cp1:in std_logic;cq1,cq2:out std_logic_vector(3 downto 0)); end entity;architecture wowo of kekong iscomponent noxa isport(a,b:in std_logic;c:out std_logic);end component;component ora isport(a:in std_logic;b:out std_logic);end component;component cnt10a isport(CP,EN:in std_logic;q:out std_logic_vector(3 downto 0)); end component;component cnt10b isport(CP,EN:in std_logic;q: out std_logic_vector(3 downto 0)); end component;signal k,j:std_logic;beginu1:noxa port map(a=>a1,b=>b1,c=>k);u2:ora port map(a=>k,b=>j);u3:cnt10a port map(EN=>k,CP=>CP1,Q=>cq1);u4:cnt10b port map(EN=>j,CP=>CP1,q=>cq2); end architecture wowo;六、波形调试:七、感想:通过对EDA程序的使用,我发现该程序的实用性!其次,对数字电路的知识也不能遗忘,还要正确使用VHDL语言,通过调试能正确的改错!并且对调试后的波形进行正确的分析。
2选1选择器的VHDL设计课件
3.1 多路①可以使用26个英文字母,数字0-9以及下划线“_”,且 只能以英文字母开头;
②不区分大小写;最长不超过64个字符;
③必须是单一下划线,且下划线前后都必须有英文字母 或数字;
6、端口定义语句port和端口模式 端口模式
IN 输入端口,定义的通道为单向只读模 OUT 式输出端口,定义的通道为单向输出模 INOUT 式 定义的通道确定为输入输出双向端口 BUFFER 缓冲端口,其功能与INOUT类似
3、界符 标点符号“;”表示VHDL中语句的结束;
3.1 多路选择器的VHDL描述
4、实体和结构体
实体和结构体是VHDL程序的两个基本组成部分;其中 实体主要用于定义电路或系统的外部端口;结构体用于定义 内部逻辑功能或电路结构。
ENTITY e_name IS PORT ( p_name : port_m
-- 注意,赋值条件的数据类型必须是boolean
3.1 多路选择器的VHDL描述
思考 ❖还有没有其它方法实现二选一? ❖n选一的多路选择器怎么设计?
3.1 多路选择器的VHDL描述
9、赋值符号<=
信号赋值符号“<=”,表示将符号右端的值赋值给左端的 信号; 10、关系运算符=
等号“=”没有赋值的含义,也不是相等的意思,而是 关系运算符,只是一种数据比较符号,其结果只有两种情况, 要么为真true,条件成立;要么为假false,条件不成立。 表达式 WHEN 赋值条件 ELSE
END ARCHITECTURE one ;
3.1 多路选择器的VHDL描述
3.1 多路选择器的VHDL描述
entity 实体
architecture 结构体
实体 mux21a1
VHDL复习题
一、选择题( A )1.一个项目的输入输出端口是定义在:A. 实体中B. 结构体中C. 任何位置D. 进程体( B)2.描述项目具有逻辑功能的是:A. 实体B. 结构体C. 配置D. 进程( A )3.关键字ARCHITECTURE定义的是:A. 结构体B. 进程C. 实体D. 配置( D )4.VHDL语言中变量定义的位置是:A. 实体中中任何位置B. 实体中特定位置C. 结构体中任何位置D. 结构体中特定位置( D )5.VHDL语言中信号定义的位置是:A. 实体中任何位置B. 实体中特定位置C. 结构体中任何位置D. 结构体中特定位置( B )6.变量是局部量可以写在:A. 实体中B. 进程中C. 线粒体D. 种子体中( A )7.变量和信号的描述正确的是:A. 变量赋值号是:=B. 信号赋值号是:=C. 变量赋值号是<=D. 二者没有区别( B )8. 变量和信号的描述正确的是:A. 变量可以带出进程B. 信号可以带出进程C. 信号不能带出进程D. 二者没有区别( )9.对于信号和变量的说法,哪一个是不正确的:A. 信号用于作为进程中局部数据存储单元B. 变量的赋值是立即完成的C. 信号在整个结构体内的任何地方都能适用D. 变量和信号的赋值符号不一样( A )10.下列关于变量的说法正确的是:A.变量是一个局部量,它只能在进程和子程序中使用B.B. 变量的赋值不是立即发生的,它需要有一个δ延时C. 在进程的敏感信号表中,既可以使用信号,也可以使用变量D. 变量赋值的一般表达式为:目标变量名<= 表达式( C )11.可以不必声明而直接引用的数据类型是:A. STD_LOGICB. STD_LOGIC_VECTORC. BITD. 前面三个答案都是错误的( C )12.STD_LOGIG_1164中定义高阻的字符是:A. XB. xC. zD. Z( A )13.STD_LOGIG_1164中字符H定义的是:A. 弱信号1B. 弱信号0C. 没有这个定义D. 初始值( B )14.使用STD_LOGIG_1164中的数据类型时:A. 可以直接调用B. 必须在库和包集合中声明C. 必须在实体中声明D. 必须在结构体中声明( B )15.关于转化函数说法正确的是:A. 任何数据类型都可以通过转化函数相互转化B. 只有特定类型的数据类型可以转化C. 任何数据类型都不能转化D. 前面说法都是错误的( C )16.VHDL运算符优先级说法正确的是:A. 逻辑运算的优先级最高B. 关系运算的优先级最高C. 逻辑运算的优先级最低D. 关系运算的优先级最低( D )17.VHDL运算符优先级说法正确的是:A. NOT的优先级最高B. AND和NOT属于同一个优先级C. NOT的优先级最低D. 前面的说法都是错误的( D )18.VHDL运算符优先级说法正确的是:A. 括号不能改变优先级B. 不能使用括号C. 括号的优先级最低D. 括号可以改变优先级( B )19.如果a=1,b=0,则逻辑表达式(a AND b)OR(NOT b AND a)的值是:A. 0B. 1C. 2D. 不确定( B )20.正确给变量X赋值的语句是:A. X<=A+B;B. X:=A+b;C. X=A+B;D. 前面的都不正确( )21.VHDL文本编辑中编译时出现如下的报错信息,其错误原因是:Error: VHDL syntax error: choice value length must match selector expression value lengthA. 表达式宽度不匹配B. 错将设计文件存入了根目录,并将其设定成工程C. 设计文件的文件名与实体名不一致D. 程序中缺少关键词( D )22.在VHDL语言中,下列对时钟边沿检测描述中,错误的是:A. if clk’event and clk = ‘1’ thenB. if falling_edge(clk) thenC. if clk’event and clk = ‘0’ thenD. if clk’stable and not clk = ‘1’ then( D )23.在VHDL中,可以用以下哪条语句表示检测clock下降沿:A. clock’ eventB. clock’ event and clock=’1’(上升沿)C. clock=’0’D. clock’ event and clock=’0’( D )24.VHDL语言共支持四种常用库,其中哪种库是用户的VHDL设计现行工作库:A. IEEE库B. VITAL库C. STD库D. WORK工作库( A )25.VHDL常用的库是:A. IEEEB. STDC. WORKD. PACKAGE( B )26.下列语句中,不属于并行语句的是:A. 进程语句B. CASE语句C. 元件例化语句D. WHEN…ELSE…语句( D )27.下面哪一个可以用作VHDL中的合法的实体名:A. ORB. V ARIABLEC. SIGNALD. OUT1( B )28.下列关于CASE语句的说法不正确的是:A. 条件句中的选择值或标识符所代表的值必须在表达式的取值范围内B. CASE语句中必须要有WHEN OTHERS=>NULLC. CASE语句中的选择值只能出现一次,且不允许有相同的选择值的条件语句出现D. CASE语句执行必须选中,且只能选中所列条件语句中的一条( D )29.VHDL中,为目标变量赋值符号是:A. =:B. =C. <=D. :=( B )30.VHDL语言是一种结构化设计语言,一个设计实体(电路模块)包括实体与结构体两部分,结构体描述:A. 器件外部特性B. 器件的内部功能C. 器件的综合约束D. 器件外部特性与内部功能。
VHDL实验报告一2选1多路选择器
VHDL实验报告一2选1多路选择器实验一实验目的:熟悉quartus的vhdl文本设计流程全过程,学习简单的组合电路的设计,多层次的电路设计,仿真和硬件测试二、实验内容内容(一)用vhdl语言设计2选1多路选择器参考例3-1程序设计如下:library ieee;use ieee.std_logic_1164.all;entity mux21a isport (a,b,s:in bit;y: out bit);end entity mux21a;architecture one of mux21a isbeginy<=a when s='0' else b;end architecture one全程编译后软件提示0错误,3警告,可以继续下面仿真操作。
程序分析:这是一个2选1多路选择器,a和b分别为两个数字输入端的端口名,s为通道选择控制信号输入端的端口名,y为输出端的端口名。
时序仿真及分析:时序仿真输入图:时序仿真输出图:时序分析:由上面两图可以得知:当s=0时,y口输出a,当s=1时,y口输出b下载和硬件测试:引脚锁定图:程序下载完成后,选择实验电路模式5,通过短路帽选择clock0接256Hz 信号,clock2接8Hz信号。
通过键一控制s,当键一进行切换时,明显能听到扬声器发出两种不同音调的声音。
实验内容(二)双二选一多路选择器设计程序设计:library ieee;use ieee.std_logic_1164.all;entity mux21a isport (a,b,s:in bit;y: out bit);end entity mux21a;architecture one of mux21a isbeginy<=a when s='0' else b;end architecture one;entity muxk isport (a1,a2,a3,s0,s1:in bit;outy:out bit);end entity muxk;architecture bhv of muxk iscomponent mux21aport (a,b,s:in bit;y:out bit);end component;signal tmp: bit;beginu1:mux21a port map(a=>a2,b=>a3,s=>s0,y=>tmp);u2:mux21a port map(a=>a1,b=>tmp,s=>s1,y=>outy);end architecture bhv;全程编译后软件提示0错误,2警告程序分析:这是一个双2选1多路选择器,a1、a2和a3分别为两个数字输入端的端口名,s0、s1为通道选择控制信号输入端的端口名,outy为输出端的端口名。
组合逻辑VHDL设计——数据选择器 实验报告
实验名称:组合逻辑VHDL设计——数据选择器班级: 09电气2Z 学号: 09312213 姓名:钱雷一、4选1数据选择器的VHDL设计(低电使能端)1.实体框图2.程序设计①正确的程序library ieee;use ieee.std_logic_1164.all;entity mux41a isport(D3,D2,D1,D0,EN:in std_logic;A1,A0:in std_logic;y:out std_logic);end mux41a;architecture aaa of mux41a isbeginy<=D3 when A1='0' and A0='0' and EN='0' elseD2 when A1='0' and A0='1' and EN='0' elseD1 when A1='1' and A0='0' and EN='0' elseD0 when A1='1' and A0='1' and EN='0'else 'Z';end architecture aaa;3.仿真波形图4.仿真波形分析D0-D3是数据输入端,EN为使能端,低电平有效,S(A1和A0)是控制输入端,Y是数据输出端。
当A1、A0=‘11’时,D0数据被选中,输出Y=D0;当A1、A0=‘10’时,D1数据被选中,输出Y=D1,当A1、A0=‘01’时,D2数据被选中,输出Y=D2,当A1、A0=‘00’时,D3数据被选中,输出Y=D3。
二、8选1数据选择器的VHDL设计(低电使能端)1.实体框图2.程序设计①正确的程序library ieee;use ieee.std_logic_1164.all;entity mux81a isport(A0,A1,A2,D0,D1,D2,D3,D4,D5,D6,D7,EN:in std_logic;y:out std_logic);end mux81a;architecture bbb of mux81a issignal Q:std_logic_vector (2 downto 0);beginQ<=A2&A1&A0;y<=D0 when Q="000" and EN='0' elseD1 when Q="001" and EN='0' elseD2 when Q="010" and EN='0' elseD3 when Q="011" and EN='0' elseD4 when Q="100" and EN='0' elseD5 when Q="101" and EN='0' elseD6 when Q="110" and EN='0' elseD7 when Q="111" and EN='0'else 'Z';end architecture bbb;3.仿真波形图4.仿真波形分析D0-D7是数据输入端,EN为使能端,低电平有效,A2,A1,A0是控制输入端,Y是数据输出端。
2选1多路选择器的VHDL描述
一、实验目的
1.学会使用VHDL语言并熟悉;
用VHDL语言完成2选1多路选择器设计和8位硬件加法器VHDL设计;
2.
二.实验设备:
名称规格数量
计算机586及以上1台
Quartus II软件 6.0以上
三、实验内容及步骤
1.利用VHDL语言完成2选1多路选择器的设计
1).打开Quartus II新建打开VHDL界面,输入程序,并保存名为mux21a.vhdl,程序如图3-1:
图3-1VHDL语言描述
在窗口中点击compile,编译成功如图3-2:
图3-2
2). 编译成功后,新建波形文件。
将上述描述语言进行波形仿真。
编译成功如图3-3,仿真波形如下图3-4
图3-3
图3-4仿真波形图
由此可得到结构图,如图3-5
图3-5
8位硬件加法器的VHDL设计
1.如同2选1多路选择器的设计类似,输入VHDL描述语言,保存到adder8b 工程中。
描述语言如下图3-6
图3-6
2.编译成功后,新建波形文件。
将上述描述语言进行波形仿真。
仿真波形如下图3-7
图3-7
通过对波形的分析可知,达到设计目的。
四、实验小结
1.多路选择器是典型的组合电路,应该熟悉它们。
2.通过此次实验,可知主要考察通过VHDL语言编译器件的能力,因此对语言的描述一定要到位。
3.通过本次实验对VHDL描述语言的语法又有了更进一步的认识和熟悉,从整体上把握VHDL程序的基本结构和设计特点,为以后编辑大型器件奠定了厚实的基础。
2选1和4选1选择器VHDL设计
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY MUX41A IS PORT(a,b,c,d,s0,s1:IN STD_LOGIC;
y:OUT STD_LOGIC); END ENTITY MUX41A ; ARCHITECTURE BHV OF MUX41A IS SIGNAL S:STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN S <=S1 & S0; PROCESS(S1,S0) --敏感信号表中可以放s1、s0,也可直接放s,如(s) BEGIN CASE S IS WHEN "00" => y<=a; WHEN "01" => y<=b; WHEN "10" => y<=c; WHEN "11" => y<=d; WHEN OTHERS =>NULL; END CASE; END PROCESS; END BHV;
3.3 4选1多路选择器及其VHDL描述
3.1 多路选择器的VHDL描述
相关语法 1.IEEE库和1164程序包
在VHDL中也像很多高级语言一样,把常用的一些数据 类型,数据对象等事先定义好放在库和程序包中,供设计者 直接调用而不用定义。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; 注意:一个典型的VHDL程序是由库和程序包,实体和结构 体三部分构成。
mux21a2
a
y
b
ቤተ መጻሕፍቲ ባይዱ
s
3.1 多路选择器的VHDL描述
相关语法
1.信号signal
一个VHDL设计由若干个VHDL文件构成,每个文件主要包含
例如: 变量只在进程中 定义和使用。
2. process中语句的顺序性:process中的语句按顺序执行。 3. process语句的启动:process( )括号内的量称为敏感量, 敏感量发生变化,启动进程。 4. Process的同步描述:当一个构造体内含有多个process时,进 程之间为并行的,进程之间能通信。
LIBRARY ieee; library newlib;
1.库的种类
有5种: ieee; std; 面向ASIC的库; work;用户定义库。 其中:ieee库为ieee正式认可的库,使用库中包时要说明; std库为VHDL的标准库,使用该库中数据可不必说明;但
使用库中TEXTIO包须说明。
库名 std
一个二选一数据选择 器的描述
2.块(block)和子原理图的关系:一个block相当于总图中的一个 子图,分块设计有利于编辑查错。 3.块(block)中语句的并发性:block中的语句为并发的。
4.卫式block(Guarded block):指满足条件时,块语句执行,不满足
时不执行。 例:… begin G1: block(clk=‘1’) 1)卫式块不能综合;
程序包名 standard
•
y=a0s1s0+a1s1s0+a2s1s0+a3s1s0 =(a0s0+a1s0)s1+(a2s0+a3s0)s1
2.2 VHDL 语言构造体的子结构
一个构造体可以用几个子结构来构成,即一个系统可以用几个比较 独立的模快来构成。 1. BLOCK语句结构 2. PROCESS语句结构 3. SUBPROGRAMS语句结构
端口模式可用下图说明:(黑框代表一个设计或模块)
基于HDL实现的2选1数据选择器设计
3、变量以及数据类型
reg寄存器型
reg类型定义的是一种能暂存数据的变量。 reg 信号名1,信号2,……;//定义一位reg型数据 reg [n-1:0]信号名1,源自号2,……; //定义n位reg型数据
用reg数据类型定义的信号必须放在过程块 (如always,initial)中通过过程赋值语句赋值。
时,运算的结果就为真。只有当两个操作数都为假时,则运算的结
果才为假。
逻辑非“!”只有一个操作数,用法:!操作数。
h
16
3、 关系运算符
关系运算符号 > >= < <=
功能 大于 不大于(小于等于) 小于 不小于(大于等于)
h
17
4、位运算符
位运算符号 ~ & | ^
^~、~^
功能 按位取反
按位与 按位或 按位异或 按位同或
第五讲:基于HDL实现的2选1数据选择器设计 主讲人:雷求胜
h
1
复习: Verilog HDL模块的一般结构
模块声明 module 模块名(port1,port2,port3…portn); 端口声明语句块 逻辑功能描述语句块 Endmodule
h
2
一、数据类型及常量变量
1、标识符
标识符用于表示电路系统中模块、寄存器、输 入/输出端口、连线等物理对象名字。
h
10
二、连续赋值语句及“?:”语句
1、连续赋值语句 assign wire型变量=表达式;
连续赋值语句assign与过程语句always中过程赋值语 句的区别.
a、连续赋值语句用于wire型数据,而过程赋值语句用于 寄存器型变量的赋值。
VHDL硬件描述语言(入门简述)
VHDL
Very High Speed Integrated Circuit Hardware
Description Language 超高速集成电路硬件描述语言
Verilog HDL
Verilog Hardware Description Language Verilog硬件描述语言
【例】 PORT (a,b: IN STD_LOGIC_VECTOR(3 DOWNTO 0); q: OUT STD_LOGIC_VECTOR(3 DOWNTO 0); cout: OUT STD_LOGIC);
17
2019/11/27
说明:
端口名是输入输出信号的名字。 泸医附院
THE AFFILIATED HOSPITAL OF LUZHOU MEDICAL COLLEGE
结构、功能等。 BEGIN后开始结构和功能的描述。
20
2019/11/27
【例3-2】一个RS触发器的结构体(数据流描述方式)
泸医附院
THE AFFILIATED HOSPITAL OF LUZHOU MEDICAL COLLEGE
ARCHITECTURE rs OF rsff IS BEGIN q<=NOT(qb AND set); qb<=NOT(q AND reset); END rs;
大写,用户自定义部分用小写。
12
2019/11/27
泸医附院
本节三方面内容 THEAFFILIATED HOSPITAL OF
LUZHOU MEDICAL COLLEGE
3.2.1 实体说明 3.2.2 结构体 3.2.3 程序包、库及配置
实验六 二选一数据选择器的VHDL设计
2、关系运算符
= /= < <= > >= 等于 不等于 小于 小于或等于(也用于信号的赋值操作) 大于 大于或等于
=和/=的操作对象可以是任何数据类型构成的操作数。
其它关系运算符对数据类型有一定的限制。(整数、 实数、位矢量、数组(从左至右比较,如:1011>101011 结果为真))
3、算术运算符
Structure描述
architecture one of mux21 is signal d,e:bit; begin d<=a and (not s); e<=b and s; y<=d or e; end one;
逻辑图
三种描述方式的比较
描述方式 优点 缺点 繁琐、复杂 逻辑方程 难以获得 不一定能综合 适用场合 层次化设计 小门数设计 系统建模、复 杂的电路
--B="1010" --C="0010" --D="1011" --E="0010" --F="1010" --G="1010"
6、运算符的优先级
★数据类型必须一致 ★表达式中有多个运算符时一般要加括号,但and、or等除外
运算符 NOT,ABS,** * ,/ ,MOD, REM +(正号), -(负号) + ,-, & SLL, SLA, SRL, SRA, ROL, ROR =, /=, <, <=, >, >= AND, OR, NAND, NOR, XOR, XNOR 最低优先级 优先级 最高优先级
VHDL操作符优先级
signal d1,d2,s : integer; SIGNAL a ,b,c : STD_LOGIC_VECTOR (3 DOWNTO 0) ; SIGNAL d,e,f,g : STD_LOGIC_VECTOR (1 DOWNTO 0) ; SIGNAL h,i,j,k : STD_LOGIC ; SIGNAL l,m,n,o,p : BOOLEAN ; ... s<=a and b; -- integer 不能进行逻辑运算 a<=b AND c; -- a、b、c的数据类型同属4位长的位矢量 d<=e OR f OR g ; -- 两个操作符OR相同,不需括号 h<=(i NAND j)NAND k ; -- NAND必须加括号 l<=(m XOR n)AND(o XOR p); -- 操作符不同,必须加括号 h<=i AND j AND k ; -- 两个操作符都是AND,不必加括号 h<=i AND j OR k ; -- 两个操作符不同,未加括号,表达错误 a<=b AND e ; -- 操作数b与e的位矢长度不一致,表达错
VHDL语言的结构
BEGIN
[功能描述语句]
END 结构体名;
2.1 结构体名 结构体名由设计者自行定义,OF后面的 实体名指明了该结构体所对应的是哪个实体。 有些设计实体有多个结构体,这些结构体的 结构体名不可相同,通常用dataflow(数据 流)、behavior(行为)、structural(结构)
命名。这3个名称体现了3种不同结构体的描
实体语句结构如下:
ENTITY 实体名 IS [GENERIC(类属表);] [PORT(端口表);]
END ENTITY 实体名;
例: ENTITY or2 IS
PORT(a,b:IN STD_LOGIC;
C: OUT STD_LOGIC);
END ENTITY or2;
注意:实体应以语句“ENTITY 实体名 IS”开始,语句“END ENTITY 实体名;” 结束。 在层次化系统设计中,实体说明是整个 模块或整个系统的输入输出(I/O)接口; 在一个器件级的设计中,实体说明是一个 芯片的输入输出(I/O)。
图中5种功能描述语句的基本组成和功能分别 是:
块语句是由一系列并行语句构成的组合体, 它的功能是将结构体中的并行语句组成一个 或多个子模块。
进程语句定义顺序语句模块,用以将从外部 获得的信号值或内部运算数据向其他的信号 进行赋值。
信号赋值语句将设计实体内的处理结果向定 义的信号或界面端口进行赋值。 子程序调用语句可以调用进程或参数,并将 获得的结果赋值于信号。 元件例化语句对其他的设计实体做元件调用 说明,并将此元件的端口与其他元件、信号 或高层实体的界面端口进行连接。 各语句后面将介绍
PROCESS语句的结构
[进程标号] PROCESS [(敏感信号表)] [IS] [进程说明语句] BEGIN 顺序描述语句
VHDL编程语言常见错误及解决方法
VHDL编程语言常见错误及解决方法作者:余丽红等来源:《电子技术与软件工程》2015年第24期摘要VHDL语言是国际化的标准硬件描述语言,在EDA电子产品设计自动化中主要用于描述数字系统的外部接口和内部功能。
本文以设计二选一数据选择器为例,运用MAXPLUS‖软件平台来介绍VHDL编程语言中常见的错误及解决方法。
【关键词】VHDL语言编辑数字系统VHDL被IEEE确认为标准硬件描述语言。
VHDL描述语言层次较高,在进行电子系统设计时可以不了解电路的结构细节,初学者在学习VHDL的过程中需要理论结合实验,在不断地软件编程中获得锻炼,掌握技能。
本文以二选一数据选择器为例,运用MAXPLUS‖软件平台来介绍VHDL编程语言中常见的错误及解决方法。
1 建立工作库文件夹和编辑设计文件初学者首先在c:\max2work文件夹中新建一个工程库文件夹,命名为“exy”,后打开MAXPLUS‖软件,新建一个文本文件,在编辑窗中输入程序,完毕后保存。
笔者依据教学经验,将学生容易出错的知识点综合在一起所得到的二选一数据选择器的程序如下:librry ieee; use IEEE.std_logic_1164.all;entity ch0 isport ( d0, d1,sel,: in std_logic;q: out std_logic)end ch0;architecture connect of ch0 isbeginprocess (d0,d1,sel)variable temp1,temp2:std_logic;begintemp1end connect;2 编译和改错编辑好文本后,选择与实验箱对应的芯片,并将项目路径设置统一,再进行编译。
编译提示错误有如下几种类型:(1)文本后缀错误.tdf:Error:line 1,file c:\max2work\exy\untitled2.tdf:TDF syntax error:Expected,ASSERT,CONSTANT,DEFINE,DESIGN,FUNCTION,IF,OPTIONS,PARAMETERS,SUBDESIGN,or TITLE but found a symbolic name “library”将后缀改为.vhd。
2选1数据选择器的VHDL描述
2选1数据选择器的VHDL描述ENTITY mux21a ISPORT( a, b : IN BIT ;s : IN BIT;y : OUT BIT ) ;END ENTITY mux21a ;ARCHITECTURE one OF mux21a ISBEGINy <= a WHEN s = '0'ELSE b ;END ARCHITECTURE one ;译码器的设计architecture dec_behave of e1 issignal sel : std_logic_vector( 0 to 3) ;beginsel(0) <= en ; sel(1) <= a(0) ; sel(2) <= a(1) ; sel(3) <= a(2) ; with sel selecty <= "00000001" when "1000","00000010" when "1001","00000100" when "1010","00001000" when "1011","00010000" when "1100","00100000" when "1101","01000000" when "1110","10000000" when "1111","00000000" when others ;end dec_behave ;8-3优先编码器library IEEE; ……;entity encoder83 isport (ind: in std_logic_vector(7 downto 0);outd: out std_logic_vector(2 downto 0)); end ;architecture behave of encoder83 isbeginprocess (ind)beginif ind (7) = ‘1' then outd<= "111";elsif ind (6) = ‘1' then outd<= "110";elsif ind (5) = ‘1' then outd<= "101";elsif ind (4) = ‘1' then outd<= "100";elsif ind (3 )= ‘1' then outd<= "011";elsif ind (2) = ‘1' then outd<= "010";elsif ind (1) = ‘1' then outd<= "001";elsif ind (0) = ‘1' then outd<= "000";else outd<= "000";end if;end process; end behave;。
第3章2选1和4选1选择器VHDL设计
3.3 4选1多路选择器及其VHDL描述
例3-3 仿真结果
summary
❖信号signal; ❖逻辑运算符; ❖进程process语句;语句的分类; ❖条件if语句; ❖库和程序包; ❖标准逻辑位和矢量型数据; ❖并置&操作符; ❖注释--符号; ❖case语句;
思考
❖如何用VHDL设计二进制加法器?
ARCHITECTURE one OF mux21a2 IS SIGNAL d,e : BIT;
BEGIN d <= a AND s ; e <= b AND (NOT S) ; y <= d OR e ;
END ARCHITECTURE one ;
3.1 多路选择器的VHDL描述
3.1 多路选择器的VHDL描述
mux21a2
a
y
b
s
3.1 多路选择器的VHDL描述
相关语法
1.信号signal
信号是VHDL中常用三大数据对象之一,所谓数据对象 是指用来保存不同类型数据的对象。
注意:信号相当于一根带电导线,用于暂存数据。
2.逻辑运算符
运算符类型 逻辑运算符
运算符符号
AND
OR NOT NAND NOR XOR XNOR
PORT ( a, b, s: IN BIT; y: OUT BIT);
END ENTITY mux21a; ARCHITECTURE one OF mux21a IS BEGIN
PROCESS (a,b,s) BEGIN IF (s = '1') THEN y <= a ; ELSE y <= b ; END IF;
【例3-3】
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY MUX41A IS PORT(a,b,c,d,s0,s1:IN STD_LOGIC;
VHDL语言
VHDL语言VHDL(Very High Speed Integrated Circuit Hardware Description Language),超高速集成电路硬件描述语言。
VHDL语言基础主要构件:一、实体(Entity)二、结构体(Architecture)三、程序包(Package)四、库(Library)五、配置(Configuration)一、实体(Entity)1、功能:实现设计单元的端口说明。
2、语法结构:ENTITY 实体名 ISPORT(端口名{,端口名}:端口模式数据类型;端口名{,端口名}:端口模式数据类型);END实体名;1)、端口名:每个引脚的名称2)、端口模式:引脚上数据传输的方向3)、常用端口模式:3、样例:ENTITY and_2 ISPORT(a,b:IN STD_LOGIC;y:OUT STD_LOGIC);END and_2;实体and_2输入a,b;输出y二、结构体(Architecture)1、功能:描述设计单元内部结构和行为,建立输入输出关系。
2、语法结构:ARCHITECTURE 结构体名 OF 实体名 IS[结构体说明语句]BEGIN[功能描述语句]END 结构体名;1)、结构体说明语句:结构体功能描述语句,其中要用到内部信号、常数、数据类型、函数(无时可省略)。
2)、功能描述语句:用并行语句形式描述设计单元功能。
3)、并行语句类型:a、进程语句(PROCESS)b、块描述语句(BLOCK)c、信号赋值语句d、子程序调用语句e、元件例化语句3、样例:ARCHITECTURE one OF and_2 ISBEGINy <= a and bEND ARCHITECTURE one;并行语句执行顺序与其书写顺序无关,在实际电路中所有并行语句功能同时实现。
三、程序包(Package)1、功能:存放各设计模块共享的数据类型、常数、子程序等。
2、语法结构:USE LIBRARY 库名.程序包名.项目名;3、样例:(对IEEE库的1164程序包中所有项目的说明)USE IEEE.STD_LOGIC_1164.ALL;四、库(Library)1、功能:存储和放置设计单元(元件、程序包等)。
VHDL语言详解
VHDL语⾔详解第⼆章 VHDL程序基础2.1 VHDL程序结构2.2 VHDL的语⾔元素2.3 VHDL的基本描述语句2.4 VHDL结构体的三种描述⽅法2.1 VHDL程序结构2.1.1 VHDL程序基本结构2.1.2 VHDL结构体的基本⼦结构2.1 VHDL程序结构2.1.1 VHDL程序基本结构例1 ⼀个2输⼊的与门的逻辑描述LIBRARY ieee; --库说明语句USE ieee.std_logic_1164.ALL; --程序包说明语句ENTITY and2 ISPORT(a,b : IN STD_LOGIC;y : OUT STD_LOGIC);END and2;ARCHITECTURE and2x OF and2 ISBEGINy<=a AND b;END and2x;实体部分结构体部分VHDL设计⽂件的两个基本组成部分实体(Entity)结构体(Architecture)配置(Configuration)包集合(Package)库(Library)⼀个完整的VHDL程序库⽤于存放已编译的实体,结构体,包集合和配置2.1.1 VHDL程序基本结构实体部分描述设计系统的外部接⼝信号(即输⼊/输出信号)结构体⽤于描述系统的内部电路配置⽤于从库中选取所需元件安装到设计单元的实体中包集合存放各设计模块能共享的数据类型,常数,⼦程序等2.1.1.1 实体(ENTITY)实体的⼀般格式为:ENTITY 实体名 IS[类属参数说明];[端⼝说明];END;ENTITY,IS,END是VHDL的关键字(保留字).实体中的每⼀个I/O信号被称为端⼝,其功能对应于电路图符号的⼀个引脚.端⼝说明则是对⼀个实体的⼀组端⼝的定义,即对基本设计实体与外部接⼝的描述.端⼝是设计实体和外部环境动态通信的通道.ayand2b类属参数说明是可选部分.如果需要,可使⽤以"GENERIC"语句来指定该设计单元的类属参数(如延时,功耗等).实体名,端⼝名等均应为符合VHDL命名规则的标识符.端⼝说明的⼀般格式为:PORT(端⼝名{,端⼝名}:端⼝模式数据类型;端⼝名{,端⼝名}:端⼝模式数据类型);端⼝模式⽤来说明数据传输通过该端⼝的⽅向.端⼝模式有以下⼏类:IN(输⼊):仅允许数据流进⼊端⼝.主要⽤于时钟输⼊,控制输⼊,单向数据输⼊.OUT(输出):仅允许数据流由实体内部流出端⼝.该模式通常⽤于终端计数⼀类的输出,不能⽤于反馈.BUFFER(缓冲):该模式允许数据流出该实体和作为内部反馈时⽤,但不允许作为双向端⼝使⽤.INOUT(双向):可以允许数据流⼊或流出该实体.该模式也允许⽤于内部反馈.如果端⼝模式没有指定,则该端⼝处于缺省模式为:IN .数据类型原则上可以是任何标准的数据类型和⽤户⾃定义类型.PORT (a,b : IN STD_LOGIC;y : OUT STD_LOGIC);inininoutoutbufferinoutmodemode模式及其信号源类属参数说明的格式为:GENERIC(端⼝名{,端⼝名}:[IN] ⼦类型 [:=初始值]{;端⼝名{,端⼝名}: [IN] ⼦类型 [:=初始值]} );例2:加⼊类属说明的2输⼊的与门的逻辑描述ENTITY and2 ISGENERIC (rise,fall:time);PORT(a,b: IN STD_LOGIC;y : OUT STD_LOGIC);END and2;ARCHITECTURE and2x OF and2 ISSIGNAL u: BIT;BEGINu<=a AND b;y<=u after(rise) when u='1' else u after(fall) ;END and2x;例3: 四位加法器实体说明程序ENTITY add4 ISPORT(a, b: IN STD_LOGIC_VECTOR(3 downto 0);Ci: IN STD_LOGIC;Sum: OUT STD_LOGIC_VECTOR(3 downto 0);Co: OUT STD_LOGIC);END add4;由实体说明画出四位加法器add4的电路图如下所⽰.add4a[3..0]b[3..0]Sum[3..0]CiCo2.1.1.2 结构体(ARCHITECTURE )结构体的⼀般格式如下:ARCHITECTURE 结构体名 OF 实体名 IS[结构体说明部分];BEGIN[并发处理语句];END 结构体名;结构体说明是指对结构体需要使⽤的信号,常数,数据类型和函数进⾏定义和说明.并发处理语句位于BEGIN和END之间,这些语句具体地描述了构造体的⾏为.并发处理语句是功能描述的核⼼部分,也是变化最丰富的部分.并发处理语句可以使⽤赋值语句,进程语句,元件例化语句,块语句以及⼦程序等.需要注意的是,这些语句都是并发(同时)执⾏的,与排列顺序⽆关.2.1.1.3 配置(CONFIGURATION)配置的基本格式为:CONFIGURATION 配置名 OF 实体名 IS[配置说明];END 配置名;配置语句描述了层与层之间的连接关系,以及实体与构造体之间的连接关系.设计者可以利⽤配置语句选择不同的构造体,使其与要设计的实体相对应;在仿真某⼀个实体时,可以利⽤配置选择不同的构造体进⾏性能对⽐实验,以得到性能最佳的构造体. CONFIGURATION 配置名 OF 实体名 ISFOR 选配结构体名END FOR;END 配置名;配置语句根据不同情况,其说明语句有简有繁.最简单的缺省配置格式为:例4:加⼊了配置的4位等值⽐较器设计⽂件LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY comp4 ISPORT(a, b: IN STD_LOGIC_VECTOR(3 downto 0);y: OUT STD_LOGIC);END comp4;--结构体 1:ARCHITECTURE behavior OF comp4 ISBEGINComp: PROCESS(a, b)BEGINIF a=b THENy<='1';ELSEy RETURN '0';WHEN 'Z'=> RETURN 'Z';END CASE;END invert;END BODY;⼀个包集合说明⾄多可以带⼀个包体,包体和包头使⽤相同的名字.包体的内容是基本说明和⼦程序体说明.但要注意,若包集合中含有⼦程序说明时,必须将⼦程序放在对应的包体中.包体中的⼦程序及其相应的说明是专⽤的,不能被其它VHDL单元所引⽤;⽽包集合中的说明是公⽤的,它可以独⽴地编译并插⼊设计库中.包集合体是次级设计单元,只有在其对应的主设计单元编译并插⼊设计库之后,才可独⽴地编译并插⼊到设计库中.程序包举例(见vhdl程序example )2.1.1.5 库(LIBRARY)库是⽤来放置可编译的设计单元的地⽅,通过其⽬录可查询和调⽤. VHDL中的库⼤致可归纳为5种:IEEE库,STD库,ASIC⽮量库,WORK库和⽤户定义库.IEEE库.常⽤的资源库.IEEE库包含经过IEEE正式认可的STD_LOGIC_1164包集合和某些公司提供的⼀些包集合,如STD_LOGIC_ARITH(算术运算库),STD_LOGIC_UNSIGNED等.STD库.VHDL的标准库.库中存放有称为"standard"的标准包集合,其中定义了多种常⽤的数据类型,均不加说明可直接引⽤.STD 库中还包含有称为"textio"的包集合.在使⽤"textio"包集合中的数据时,应先说明库和包集合名,然后才可使⽤该包集合中的数据. ASIC⽮量库.在VHDL语⾔中,为了进⾏门级仿真,各公司可提供⾯向ASIC的逻辑门库.在该库中存放着与逻辑门⼀⼀对应的实体.为了使⽤⾯向ASIC的库,对库进⾏说明是必要的.WORK库.WORK库是现⾏作业库.设计者所描述的VHDL语句不需要任何说明,将都存放在WORK库中.WORK库对所有设计都是隐含可见的,因此在使⽤该库时⽆需进⾏任何说明.⽤户定义库.⽤户定义库简称⽤户库,是由⽤户⾃⼰创建并定义的库.设计者可以把⾃⼰经常使⽤的⾮标准(⼀般是⾃⼰开发的)包集合和实体等汇集成在⼀起定义成⼀个库,作为对VHDL标准库的补充.⽤户定义库在使⽤时同样要⾸先进⾏说明.上述5类库中,除了STD库和WORK库之外的其它库均为资源库.资源库是存放常规元件和标准模块的库,使⽤时需预先说明.库说明语句的语法形式为:LIBRARY 库名; --说明使⽤什么库USE 包集合名; --说明使⽤库中哪⼀个包集合及包集合中的项⽬(如过程名,函数名等)包集合名最多为三个层次,即 :library-name. packge-name. item-nameLIBRARY 语句和USE语句的作⽤范围:仅限于紧跟起后的实体和结构体.2.1.2 VHDL结构体的基本⼦结构在规模较⼤的电路设计中,整个电路将被分成若⼲个相对独⽴的模块来描述.这样,⼀个结构体可以⽤⼏个⼦结构,即相对独⽴的⼏个模块来构成.VHDL语⾔有以下3种形式的⼦结构描述语句:BLOCK 语句结构PROCESS 语句结构SUBPROGRAMS 结构2.1.2.1 块( BLOCK )BLOCK语句的语法格式为:块标号:BLOCK [(块保护条件)][说明语句];BEGIN[并发处理语句];END BLOCK 标号名;保护条件是可选项,它是⼀个布尔表达式.如果有保护条件,则该条件应⽤圆括号括起来,放在BLOCK之后.保护条件的作⽤是:只有当其为真时,该块中的语句才被启动执⾏;否则,该块中的语句不被执⾏.BLOCK语句中所描述的各个语句是可以并⾏执⾏的,它和书写顺序⽆关.⼀个⼤规模的电原理图通常可以分割成多张⼦原理图,以便于设计和存档.同样,在VHDL程序设计中,构造体对应整个电原理图,⽽构造体可由多个BLOCK块组成,每⼀个BLOCK块则对应⼀张⼦原理图.电原理图的分割关系和VHDL程序中⽤BLOCK块分割构造体的关系是⼀⼀对应的.例7 ⽤BLOCK语句描述2选1电路的程序.ENTITY mux2_1 ISPORT(d0, d1, sel : IN STD_LOGIC;q :OUT STD_LOGIC);END mux2_1;ARCHITECTURE amux OF mux2_1 ISSIGNAL tmp1,tmp2,tmp3 : STD_LOGIC;BEGINcale: BLOCKBEGINtmp1<=d0 AND sel;tmp2<=d1 AND (not sel);tmp3<=tmp1 OR tmp2;q<=tmp3;END BLOCK cale;END amux;上述结构体中只有⼀个 BLOCK块,若电路复杂时可由⼏个BLOCK块组成.2选1 数据选择器d1d0qselu2u1u3tmp1tmp2tmp3例8 ⽤带保护条件的BLOCK语句描述⼀个锁存器的结构.ENTITY latch ISPORT(d, clk : IN STD_LOGIC;q, qn : OUT STD_LOGIC);END latch;ARCHITECTURE latch_a OF latch ISBEGINg1:BLOCK(clk='1')BEGINq<=guarded d after 5ns;qn<=guarded not(d) after 7ns;END BLOCK g1;END latch_a;qnqQD Cdclk在BLOCK块中的两个信号传送语句都写有前卫关键词guarded,表明只有clk='1'为真时,这两个语句才能执⾏.(注意 :这⾥的综合⼯具不⽀持 guarded block 语句和 after 短语.)2.1.2.2 进程( PROCESS )PROCESS语句是⼀种并发处理语句,在⼀个构造体中多个PROCESS语句可以同时并发运⾏.因此,PROCESS语句是VHDL中描述硬件系统并发⾏为的最常⽤,最基本的语句.进程语句的⼀般格式为;[进程名:] PROCESS (敏感信号表)进程说明语句BEGIN顺序描述语句;END PROCESS [进程名];例9 利⽤PROCESS语句设计与⾮门电路.nandx: PROCESS (a, b)BEGINy<=a NAND b AFTER 10ns;END PROCESS nandx;敏感信号表所标明的信号是⽤来启动进程的.敏感信号表中的信号⽆论哪⼀个发⽣变化(如由'0'变'1'或由'1'变'0' )都将启动该PROCESS语句.⼀旦启动后, PROCESS中的语句将从上⾄下逐句执⾏⼀遍.当最后⼀个执⾏完毕以后,即返回到开始的PROCESS语句,等待下⼀次启动.因此,只要PROCESS中指定的信号变化⼀次,该PROCESS语句就会执⾏⼀遍. PROCESS内部各语句之间是顺序关系 .在系统仿真时, PROCESS语句是按书写顺序⼀条⼀条向下执⾏的.⽽不象BLOCK中的语句可以并⾏执⾏.若构造体中有多个进程存在,各进程之间的关系是并⾏关系 ;进程之间的通信则⼀边通过接⼝由信号传递,⼀边并⾏地同步执⾏.2.1.2.3 ⼦程序( SUBPROGRAM )⼦程序的特点:⼦程序可以在结构体或程序包的任何位置被调⽤,⽽且可以反复调⽤.⼦程序是⼀个⾮重⼊的程序,即⼦程序返回后才能再被调⽤.在调⽤时⼦程序⾸先要进⾏初始化,执⾏结束后⼦程序终⽌;再调⽤时要再进⾏初始化.因此,⼦程序内部的值不能保持.VHDL的⼦程序具有可重载性,即允许有许多重名的⼦程序,但这些⼦程序的参数类型和返回数值类型是不同的.VHDL的⼦程序有两种类型:过程(PROCEDURE)函数(FUNCTION)过程(PROCEDURE)过程语句的结构:PROCEDURE 过程名(参数1;参数2; (I)[定义语句];BEGIN[顺序处理语句];END 过程名;过程语句的调⽤格式:过程名(实际参数表);例10 设计⼀个从两个整数中求取最⼤值的过程.PROCEDURE max(a, b: IN INTEGER;y: OUT INTEGER) ISBEGINIF (ay<=b;ELSEyb) THENtmp:=a;ELSEtmp:=b;END IF;RETURN tmp;END max;函数的参数均为输⼊参数.函数调⽤返回⼀个指定数据类型的值.例11 在结构体中调⽤求最⼤值的函数.LIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.newlib.ALL;ENTITY dpeak ISPORT(clk, set : IN STD_LOGIC;date : IN STD_LOGIC_VECTOR(5 downto 0);dout : OUT STD_LOGIC_VECTOR(5 downto 0));END dpeak;ARCHITECTURE rtl OF dpeak ISSIGNAL peak : STD_LOGIC_VECTOR(5 downto 0);BEGINdout<=peak;PROCESS (clk)BEGINIF (clk'event and clk='1') THENIF (set='1') THENpeak<=date;ELSEpeak<= max(date,peak);END IF;END IF;END PROCESS;END rtl;2.2 VHDL的语⾔元素2.2.1 标识符2.2.2 数据对象2.2.3 数据类型2.2.4 运算符与操作符2.2.5 属性标识符规则:标识符规则是在书写VHDL程序时的⼀般⽂字规则.基本标识符由字母,数字以及下划线字符组成,且具有以下特征要求:●第⼀个字符必须是字母;●最后⼀个字符不能是下划线;●不允许连续两个下划线;●在标识符中⼤,⼩写字母是等效的.● VHDL中的注释⽂字⼀律为2个连续的连接线"--",可以出现在任⼀语句后⾯,也可以出现在独⽴⾏;● VHDL的保留字(关键字)不能⽤于标识符;2.2.1 标识符如下标识符是⾮法的:_ tx_clk8B10Blarge#numberlink__barselectrx_clk_例如:如下标识符是合法的:tx_clkThree_state_Enablesel7DHIT_1124--标识符必须起始于字母--只能是字母,数字,下划线--不能有连续两个下划线--关键字(保留字)不能⽤于标识符--最后字符不能是下划线2.2.2 数据对象在VHDL中,数据对象是可以赋予⼀个值的客体.常⽤的数据对象为常量,变量和信号,在使⽤前必须给予说明.●常量(CONSTANT)常量是指在设计描述中不会变化的值.在VHDL描述中,⼀般⽤常量名代替数值.常量说明语句的⼀般格式为:CONSTANT 常量名{,常量名}:数据类型 := 取值;例如: CONSTANT width : integer : = 8 ;常量所赋值和定义的数据类型应⼀致.常量⼀旦赋值就不能再改变.●变量(VARIABLE)变量是暂存数据的量.变量说明语句的格式是:VARIABLE 变量名{,变量名}:数据类型 [:=初始值];例如:VARIABLE count: INTEGER RANGE 0 TO 99 : =0变量是⼀个局部量 ,它只⽤于进程和⼦程序.变量必须在进程或⼦程序的说明区域中加以说明.变量赋值是直接的,⾮预设的 ,它在某⼀时刻仅包含⼀个值.变量的赋值⽴即⽣效,不存在延时⾏为.变量常⽤在实现某种运算的赋值语句中.赋值语句中的表达式必须与⽬标变量具有相同的数据类型.变量赋值语句格式为: ⽬标变量名 := 表达式;●信号(SIGNAL)信号是电⼦电路内部硬件实体相互连接的抽象表⽰.信号能够代表连线,也可内连元件,端⼝也是信号.信号说明语句的格式为:SIGNAL 信号名{,信号名} :数据类型 [:=初始值];例如: SIGNAL count: BIT_VECTOR(3 downto 0);信号包括I/O引脚信号以及IC内部缓冲信号,有硬件电路与之对应,故信号之间的传递有实际的附加延时.信号通常在构造体,包集合和实体中说明;信号不能在进程中说明(但可以在进程中使⽤).硬件中的信号总是同时⼯作的,即信号同时在各个模块中流动,这就是硬件电路的并发性 .HDL体现了实际电路中信号"同时"流动的这种基本特性.信号赋值语句格式为: ⽬标信号名 <= 表达式;赋值语句中的表达式必须与⽬标信号具有相同的数据类型.信号和变量的主要区别:1. 变量是⼀个局部量,只能⽤于进程或⼦程序中;信号是⼀个全局量,它可以⽤来进⾏进程之间的通信.2. 变量赋值⽴即⽣效,不存在延时⾏为;信号赋值具有⾮⽴即性,信号之间的传递具有延时性.4. 信号赋值可以出现在进程中,也可以直接出现在结构体中,但它们的运⾏含义不同:前者属顺序信号赋值,此时的赋值操作要视进程是否已被启动;后者属并⾏信号赋值,其赋值操作是各⾃独⽴并⾏发⽣的.3. 变量⽤作进程中暂存数据的单元;信号⽤作电路中的信号连线.5. 在进程中变量和信号的赋值形式与操作过程不同:在变量的赋值语句中,该语句⼀旦被执⾏,其值⽴即被赋予变量.在执⾏下⼀条语句时,该变量的值即为上⼀句新赋的值.在信号的赋值语句中,该语句即使被执⾏,其值不会使信号⽴即发⽣代⼊,在下⼀条语句执⾏时,仍使⽤原来的信号值.直到进程结束之后,所有信号赋值的实际代⼊才顺序进⾏处理.因此,实际代⼊过程和赋值语句的执⾏是分开进⾏的.如例12所⽰.例12 信号和变量值代⼊的区别举例PROCESS (a,b,c,d)BEGINd<=a;x<=b+d;d<=c;y<=b+d;END PROCESS;结果: x<=b+c;y<=b+c;PROCESS (a,b,c)VARIABLE d:std_logic_vector(3 downto 0);BEGINd:=a;x<=b+d;d:=c;y<=b+d;END PROCESS;结果: x<=b+a;y<=b+c;当进程运⾏时,信号赋值将⾃上⽽下顺序执⾏,但第⼀项赋值操作并不会发⽣,这是因为信号赋值是在进程结束时才起作⽤.因为在进程结束更新时,d的最后⼀个赋值为c ,因此执⾏结果为该式.2.2.3 数据类型VHDL是⼀种类型型很强的语⾔.对象的数据类型定义了该对象可以具有的值和对该对象可以进⾏的运算的限制.在VHDL中,这种限制是被强制执⾏的.VHDL提供了多种标准的数据类型.在VHDL描述中,每个信号,常量,变量都要指定它的数据类型,以确定它能保持那⼀类数据. VHDL对数据类型的定义相当严格,在进⾏赋值或变换过程中都要进⾏类型检查.VHDL不允许不同类型的数值相互赋值或使⽤类型不允许的运算符进⾏运算.这种特性可以帮助设计者在设计前期发现错误.标准数据类型⽤户⾃定义数据类型数据类型的转换1. 标准数据类型VHDL提供的10种标准数据类型.(2)Real(实数).取值范围为 -1.0E+38 ~ +1.0E+38.和整数⼀样,实数能被约束.由于实数运算需要⼤量的资源,因此综合⼯具常常并不⽀持实数类型.(3)Bit(位). 只有两种取值,即 0 和 1 ,可⽤于描述信号的取值.(4)Bit_Vector(位⽮量). 是⽤双引号括起来的⼀组数据,每位只有两种取值:0 和 1.在其前⾯可加以数制标记,如X(16进制),B(2进制,默认),O(8进制)等.位⽮量常⽤于表⽰总线的状态.(1)Integer(整数). 取值范围为 -(231-1)~(231-1).⼀个整数类型和要被综合进逻辑的信号或变量在其范围上应有约束.例如: variable a: integer range –255 to 255;整数可通过语句内带符号⽮量来表达给综合⼯具.(5)Boolean(布尔量). ⼜称逻辑量.有"真","假"两种状态,分别⽤TRUE和FALSE标记.⽤于关系运算和逻辑运算.(6)Character(字符).是⽤单引号括起来的⼀个字母,数字,空格或⼀些特殊字符(如$,@,%等).字符区分⼤,⼩写字母.(7)String(字符串).是⽤双引号括起来的⼀个字符序列.字符串区分⼤,⼩写字母.常⽤于程序的提⽰和结果说明等.(8)Time(时间).时间的取值范围从 -(231-1)~(231-1).时间由整数值,⼀个以上空格以及时间单位组成.常⽤的时间单位有:fs,ns,µs,ms,s,min,hr等.时间常⽤于指定时间延时和标记仿真时刻.上述10种数据类型是VHDL种标准的数据类型,在编程时可以直接引⽤.如果⽤户需使⽤其它的数据类型,则必须进⾏⾃定义.(9)Natural(⾃然数)和Positive(正整数).是整数类型的⼦类型.⾃然数取值范围为0 ~(231-1);正整数是⼤于 0 的整数.(10)Severity Level(错误等级).错误等级分为:NOTE(注意),WARNING(警告),ERROR(出错),FAILURE(失败)四级,⽤于提⽰系统的错误等级.时间单位fs,ps,ns,µs,ms,sec,min,hr时间整数的⼦集:⾃然数取值范围为0 ~(231-1);正整数是⼤于0的整数⾃然数,正整数Note,warning,error,failure错误等级字符⽮量字符串ASCII字符字符逻辑"真" 或"假",⽤TRUE和FALSE标记布尔量位⽮量,⽤双引号括起来的⼀组数据位⽮量逻辑'0'或'1'位浮点数,取值范围: -1.0e+38 ~ 1.0e+38实数整数32位, 取值范围:-(231-1) ~ (231-1)整数含义数据类型标准数据类型IEEE库STD_LOGIC_1164程序包中定义的STD_LOGIC类型和STD_LOGIC_VECTOR类型.STD_LOGIC类型的数据可以具有九种取值,其含义如下:'U':初始值'X':不定态'0': 强制0'1': 强制1'Z': ⾼阻态'W':弱信号不定态'L':弱信号0'H':弱信号1'_':不可能情况(可忽略值)其中,"X"⽅便了系统仿真,"Z"⽅便了双向总线的描述.STD_LOGIC_VECTOR类型定义如下:TYPE STD_LOGIC_VECTOR IS ARRAY (NATURALRANGE ) OF STD_LOGIC;2. ⽤户⾃定义数据类型VHDL允许⽤户⾃⼰定义数据类型.常⽤的⽤户⾃定义数据类型主要有:(1)枚举(Enumerated)类型. 通过列举某类变量所有可能的取值来加以定义.对这些取值,⼀般使⽤⾃然语⾔中有相应含义的单词或字符序列来代表,以便于阅读和理解.⾃定义数据类型说明语句的⼀般格式是:TYPE 数据类型名 {,数据类型名} IS [数据类型定义];枚举类型定义的格式为:TYPE 数据类型名 IS (元素1,元素2,…);该数据类型括号中的值⾃左向右按升序排列,中间⽤逗号分隔.在VHDL中,对其中每⼀个元素都赋予⼀个位置编号,最左边的元素开始记为"0" ,向右依次递增"1" .这为"属性"提供了⼀个访问位置编号的机制.例如,在程序包STD_LOGIC_1164中对STD_LOGIC的定义为TYPE STD_LOGIC IS ( 'U' ,'X' ,'0' ,'1' ,'Z' ,'W' ,'L' ,'H' ,'_' );(2) 数组(ARRAY)类型. ⼜称为向量,是多个相同类型的数据集合.它可以是⼆维的和多维的.数组类型定义的格式为:TYPE 数据类型名 IS ARRAY (范围) OF 元素类型名;范围⼀项规定数组下标的类型和范围.默认的下标类型是整型,但也可以使⽤其它数据类型,这就需要在范围中标明下标的类型.例如:TYPE count1 IS ARRAY ( STD_LOGIC '_' DOWNTO 'U' )OF INTEGER;多维数组需要⽤两个以上的范围来描述,⽽且多维数组不能⽣成逻辑电路,因此只能⽤于⽣成仿真图形及硬件的抽象模型. (3) 纪录(RECORD)类型. 是多个不同类型的数据集合.纪录类型定义的格式为:TYPE 数据类型名 IS RECORD元素名: 数据类型名;元素名: 数据类型名;……END RECORD;纪录适⽤于描述总线,仿真等.对于记录类型的对象进⾏单元素赋值时,可在记录类型对象名后加点".",然后再加赋值元素的元素名.(4)时间(TIME)类型(物理类型).表⽰时间的数据类型,在仿真时是必不可少的.时间类型定义的⼀般格式为:TYPE 数据类型名 IS 范围;UNITS 基本单位;单位;END UNITS;例如:TYPE time IS range –1e18 TO 1e18;UNITS fs;ps=1000fs;ns=1000ps;µs=1000ns;ms=1000µs;set=1000ms;min=60set;hr=60min;END UNITS;这⾥的基本单位是"fs".时间是物理类型的数据,当然对容量,阻抗值也可以做定义.(5) ⼦类型(SYBTYPE).⼦类型是⼀个具有限制条件的类型,通常⽤来定义具有⼀定限制条件的基本类型的数据对象.⼦类型定义的⼀般格式为:SYBTYPE ⼦类型名 IS 数据类型名[约束范围];例如:如下 Byte 被定义作为⼀个⼦类型,⽽后数据对象被定义为从属于该⼦类型.SYBTYPE Byte IS Bit_Vector(7 downto 0);SIGNAL Byte1, Byte2:Byte;SIGNAL Data1, Data2:Byte;SIGNAL Addr1, Addr2:Byte;3. 数据类型的转换在VHDL程序中,不同类型的对象不能代⼊,因此要进⾏类型转换.类型转换的⽅法有:(1)类型标记法.⽤类型名称来实现关系密切的标量类型之间的转换.例如: VARIABLE x:INTEGER;VARIABLE y:REAL;使⽤类型标记(即类型名)实现类型转换时,可采⽤赋值语句:x :=INTEGER(y); y :=REAL(x).(2)类型函数法.VHDL程序包中提供了多种转换函数,使得某些类型的数据之间可以相互转换,以实现正确的赋值操作.常⽤的类型转换函数有:★CONV_INTEGER ( ):将STD_LOGIC_VECTOR类型转换成INTEGER类型.★CONV_STD_LOGIC_VECTOR( ):将INTEGER类型,UNSIGNED类型或 SIGNED类型转换成STD_LOGIC_VECTOR类型.★TO_BIT ( ): 将STD_LOGIC类型转换成BIT类型.★TO_BIT_VECTOR( ):将STD_LOGIC_VECTOR类型转换BIT_VECTOR 类型.★TO_STD_LOGIC( ): 将BIT类型转换成STD_LOGIC类型.★TO_STD_LOGIC_VECTOR( ): 将BIT_VECTOR类型转换成STD_LOGIC_VECTOR类型.注意 :引⽤时必须⾸先打开库和相应的程序包.该函数由STD_LOGIC_UNSIGNED程序包定义该函数由STD_LOGIC_ARITH程序包定义以下函数由STD_LOGIC_1164程序包定义2.2.4 运算符与操作符VHDL中共有四类运算符:(1)算术运算符:包括⼀元算术运算符和⼆元算术运算符.⼀元算术运算符包括:+(正号),—(负号),ABS(求绝对值)⼆元算术运算符包括:+ ,— ,* ,/ ,MOD(求模),REM(求余),**(指数运算)(2)关系运算符:它包括:= ,/= ,=(3)逻辑运算符:包括⼀元逻辑运算符和⼆元逻辑运算符.⼀元逻辑运算符包括:NOT⼆元逻辑运算符包括:AND,OR,NAND,NOR,XOR(4)并置运算符:&(连接),⽤于将多个位连接成为位⽮量.例如:DBUS<=D0&D1&D2&D3,即DBUS= ,,<,/= ,= ;XOR,NOR,NAND,OR,AND .需要注意的是:在编写VHDL程序时,必须保证操作数的数据类型与运算符所要求的数据类型⼀致.VHDL中的操作符:● "" 符号: 在WHEN语句中出现,其含义是"THEN(则)".2.2.5 属性(Attributes)VHDL没有⼀般程序设计语⾔中那些运算类标准函数,取⽽代之的是多种能反映和影响硬件⾏为的属性.VHDL的属性可分为数值类,函数类,信号类,类型类和范围类等属性.属性的⼀般格式为:Object ′Attributes为获取硬件设计中的⼀些有关信息(各类项⽬特性)⽽定义的内部函数某⼀项⽬的属性或特征通常可以⽤⼀个值或⼀个表达式来表⽰;它可以通过VHDL的属性描述语句加以访问.1.数值类属性数值类属性⽤于返回数组,块,或⼀般数据的有关值,如边界,数组长度等.●对⼀般数据属性,返回函数的边界值.其格式为Object ′LEFT;Object ′RIGHT;Object ′HIGH;Object ′LOW;●对于数组的数值属性,返回数组的长度值.其格式为Object ′LENGTH;●对于块结构体的数值属性,返回块的信息.其格式为Object ′BEHAVIOR;Object ′STRUCTURE;例如:TYPE num IS ARRAY RANGE 7 DOWNTO 0;VARIABLE i1,i2,i3,i4,M: INTEGER;BEGINi1:=num ′LEFT; --i1取得num的左边界值 7i2:=num ′RIGHT; --i2取得num的右边界值 0i3:=num ′HIGH; --i3取得num的上限值 7i4:=num ′LOW; --i4取得num的下限值 0M:= num ′LENGTH;2.函数类属性函数类属性是以函数形式为设计⼈员提供数据类型,数组,信号的相关信息的.●数据类型的属性函数.利⽤数组属性可以获得数组的区间,该属性的格式为Object ′SUCC(X); --获取X的下⼀个值Object ′PRED(X); --获取X的前⼀个值Object ′LEFTOF(X); --获取X的左边值Object ′RIGHTOF(X); --获取X的右边值其中, "Object"为数据类型名,X为其中的⼀个元素.例如:TYPE time IS (year,month,day,hour,min,sec);则 time ′SUCC(hour); --获取元素hour的下⼀个值mintime ′LEFTOF(day); --获取元素day的左边值month●数组的属性函数.其格式为Object ′LEFT(n); --获取索引号为n的区间左端边界值Object ′RIGHT(n); --获取索引号为n的区间右端边界值Object ′HIGH(n); --获取索引号为n的区间⾼端边界值Object ′LOW(n); --获取索引号为n的区间低端边界值其中, "Object"为数组名;n为多维数组中所定义的多维区间的序号.默认值n=1,表⽰对⼀维空间进⾏操作.●信号的属性函数.利⽤信号属性可得到信号的⾏为和功能信息,其格式为Object ′EVENT; --反映信号的值是否变化,是,则返回为"真"Object ′ACTIVE; --反映信号是否活跃,是,则返回为"真"Object ′LAST_EVENT; --反映从最近⼀次事件到现在经过的时间,返回⼀个时间值Object ′LAST_VALUE; --反映信号变化前的取值,并将该历史值返回Object ′LAST_ACTIVE; --反映从最近⼀次活跃到现在经过的时间,返回⼀个时间值需要注意的是 :信号的事件(Event)和活跃(Active)是两个不同的概念,必须严格区分.信号的活跃定义为信号值的任何变化.信号值由1变为0是⼀个活跃,⽽从1变为1也是⼀个活跃,唯⼀的准则是发⽣了事情,这种情况被称为⼀个事项处理(Transaction).然⽽,信号的事件则要求信号值发⽣变化.信号值从1变为0是⼀个事件,但从1变为1虽是⼀个活跃却不是⼀个事件.所有的事件都是活跃,但并⾮所有的活跃都是事件.例如:利⽤函数信号属性检查信号的建⽴时间.LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY dff1 ISPORT(d,clk : IN STD_LOGIC;q : OUT STD_LOGIC);END dff1;ARCHITECTURE setup_time_check OF dff1 ISBEGINPROCESS(clk)BEGINIF(clk='1′) AND (clk ′EVENT) THENq5ns) --条件为真,向下执⾏REPORT "SETUP VIOLATION" --条件为假,报告错误信息: 建⽴时间不符合要求SEVERITY ERROR; --出错等级:ERROR。
EDA技术实验报告
EDA技术实验报告实验⼀利⽤原理图输⼊法设计4位全加器⼀、实验⽬的:掌握利⽤原理图输⼊法设计简单组合电路的⽅法,掌握MAX+plusII 的层次化设计⽅法。
通过⼀个4位全加器的设计,熟悉⽤EDA 软件进⾏电路设计的详细流程。
⼆、实验原理:⼀个4位全加器可以由4个⼀位全加器构成,全加器的进位以串⾏⽅式实现,即将低位加法器的进位输出cout 与相邻的⾼位加法器的低位进位输⼊信号cin 相接。
1位全加器f-adder 由2个半加器h-adder 和⼀个或门按照下列电路来实现。
半加器h-adder 由与门、同或门和⾮门构成。
四位加法器由4个全加器构成三、实验内容:1. 熟悉QuartusII 软件界⾯,掌握利⽤原理图进⾏电路模块设计的⽅法。
QuartusII 设计流程见教材第五章:QuartusII 应⽤向导。
2.设计1位全加器原理图(1)⽣成⼀个新的图形⽂件(file->new->graphic editor )(2)按照给定的原理图输⼊逻辑门(symbol ->enter symbol)COCO 1S 2S 3S 4(4)为管脚和节点命名:在管脚上的PIN_NAME处双击⿏标左键,然后输⼊名字;选中需命名的线,然后输⼊名字。
(5)创建缺省(Default)符号:在File菜单中选择Create Symbol Files for Current File项,即可创建⼀个设计的符号,该符号可被⾼层设计调⽤。
3.利⽤层次化原理图⽅法设计4位全加器(1)⽣成新的空⽩原理图,作为4位全加器设计输⼊(2)利⽤已经⽣成的1位全加器的缺省符号作为电路单元,设计4位全加器的原理图.4.新建波形⽂件(file->new->Other Files->Vector Waveform File),保存后进⾏仿真(Processing ->Start Simulation),对4位全加器进⾏时序仿真。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2选1数据选择器的VHDL描述
ENTITY mux21a IS
PORT( a, b : IN BIT ;
s : IN BIT;
y : OUT BIT ) ;
END ENTITY mux21a ;
ARCHITECTURE one OF mux21a IS
BEGIN
y <= a WHEN s = '0'
ELSE b ;
END ARCHITECTURE one ;
译码器的设计
architecture dec_behave of e1 is
signal sel : std_logic_vector( 0 to 3) ;
begin
sel(0) <= en ; sel(1) <= a(0) ; sel(2) <= a(1) ; sel(3) <= a(2) ; with sel select
y <= "00000001" when "1000",
"00000010" when "1001",
"00000100" when "1010",
"00001000" when "1011",
"00010000" when "1100",
"00100000" when "1101",
"01000000" when "1110",
"10000000" when "1111",
"00000000" when others ;
end dec_behave ;
8-3优先编码器
library IEEE; ……;
entity encoder83 is
port (ind: in std_logic_vector(7 downto 0);
outd: out std_logic_vector(2 downto 0)); end ;
architecture behave of encoder83 is
begin
process (ind)
begin
if ind (7) = ‘1' then outd<= "111";
elsif ind (6) = ‘1' then outd<= "110";
elsif ind (5) = ‘1' then outd<= "101";
elsif ind (4) = ‘1' then outd<= "100";
elsif ind (3 )= ‘1' then outd<= "011";
elsif ind (2) = ‘1' then outd<= "010";
elsif ind (1) = ‘1' then outd<= "001";
elsif ind (0) = ‘1' then outd<= "000";
else outd<= "000";
end if;
end process; end behave;。