版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VHDL入门需掌握的根本知识一、信号〔signal〕的含义和信号的2种最常 用类型:std_logic和td_logic_vector二、四种常用语句的根本用法 赋值语句、if语句、case语句和process语句三、实体〔entity〕、结构体〔architecture)和一个实 体和一个结构体组成的设计实体。四、层次结构的设计掌握元件〔component〕语句和端口映射〔portmap〕语句。五、库〔library〕和程序包〔pachage〕的根本使用。有了上述的入门知识,一般的设计没有什么问题。
信号和变量信号〔signal)是硬件中连线的抽象描述,信号在元件的端口连接元件。变量(varable)在硬件中没有类似的对应关系,它们主要用于硬件特性的高层次建模所需的计算中。信号在逻辑电路
设计中最常用的数据类型在VHDL语言中有10种数据类型,但是在逻辑电路设计中最常用的是std_logic和std_logic-vector提供的数据类型。Std_logic类型分为布尔〔boolean〕型、位〔bit〕型、位矢量(bit_vector)型。信号在逻辑电路
设计中最常用的数据类型Std_logic有9种状态,常用的是三种状态:‘0’高电平‘1’低电平‘z’ 高阻
高阻状态是为了双向总线的描述信号的说明
一个信号只有说明语句说明后才能使用。用VHDL语言进行设计就是写一系列语句。一个语句用分号结束。设计说明形式如下:Signalclock,T1,T2:std_logic;Signalr0,r1,r2,r3:std_logic_vector(15downto0);Signalr0,r1,r2,r3:std_logic_vector(0upto15);信号的说明整数不能看作矢量,不能按位运算。整数不能进行逻辑运算,只能进行算术运算。从信号说明看不出一个信号是组合逻辑还是时序逻辑〔例如存放器〕,这与ABEL语言是不同的。逻辑运算符有6种逻辑运算符:NOT、OR、AND、NAND、NOR、XOR。常用的为前三种。
signala,b:std_logic;signalc,d:std_logic_vector(7downto0);aandb aorb nota正确
canddcxord notc
正确
aandc错误
2个进行逻辑运算的信号,类型必须相同。这些逻辑运算符优先级相同。
算术运算符常用的算术运算符有:+
-
Signala,b:std_logic_vector(15downto0);a+ba+‘1’A+“01”并置运算符
&并置运算符用于位的连接,形成矢量。也可连接矢量形成更大的矢量。Signala,b:std_logic_vector(3downto0);Signalc,d:a,b:std_logic_vector(2downto0);aand(‘1’&c)c&a
关系运算符关系运算符有以下几种:=等于 /=不等于<小于 >大于<=小于等于 >=大于等于等于、不等于运算符适用于所有的数据类型,其他的运算符适用于整数、位及矢量等。在进行关系运算时,两边的数据类型必须相同,但位长度可以不同。关系运算的结果为“真”或者“假”。
常用的4种语句VHDL有许多类型的语句,我们这里讲4种。一、赋值语句
signala,b,c:std_logic;signald,e,q:std_logic_vector;c<=not(aandb);q<=dorq;常用的4种语句二、if语句1、if语句的三种形式•if条件then假设干语句endif;•if条件then假设干语句else假设干语句endif;常用的4种语句二、if语句1、if语句的三种形式•if条件1then假设干语句elsif条件2then假设干语句┆
else条件nthen假设干语句endif;
常用的4种语句二、if语句2、例子1—16位存放器--Signalreset,clk,wen:std_logic;--Signald,q:std_logic_vector(15downto0);Ifreset=‘0’thenq<=x”0000”;Elsifclock’eventandclock=‘1’thenifwen=‘1’thenq<=d;else q<=q;endif;Endif;说明:--是注释开始的标志,signal语句的存在只是为了说明这些信号的类型,供阅读方便使用。
常用的4种语句二、if语句3、例子2—16位存放器的另一种形式--Signalreset,clk,wen:std_logic;--Signald,q:std_logic_vector(15downto--0);Ifreset=‘0’thenq<=x”0000”;Elsifclock’eventandclock=‘1’thenifwen=‘1’thenq<=d; endif;Endif;常用的4种语句二、if语句4、例子3—16位存放器的第三种形式--Signalreset,clk,wen:std_logic;--Signald,q:std_logic_vector(15downto--0);Ifreset=‘0’thenq<=”0000000000000000”;Elsifclock’eventandclock=‘1’thenifwen=‘1’thenq<=d;endif;Endif;常用的4种语句二、if语句5、信号沿的几种表示方法clock’eventandclock=‘1’上升沿clock’eventandclock=‘0’下降沿rising_edge〔clock〕上升沿falling_edge(clock)下降沿
常用的4种语句二、if语句6、例子4—时钟下降沿触发的16位存放器--Signalreset,clk,wen:std_logic;--Signald,q:std_logic_vector(15downto--0);Ifreset=‘0’thenq<=X”0000”;Elsiffalling_edge(clock)thenifwen=‘1’thenq<=d;endif;Endif;常用的4种语句二、if语句7、例子5—二选一多路开关
--Signalsel:std_logic;--Signala,b,c:std_logic_vector(15--downto0);Ifsel=‘0’thenc<=a;Elsec<=b;Endif;常用的4种语句三、进程〔process〕语句PROCESS语句是VHDL语言中描述硬件系统行为的最根本的语句。本质上描述了一个功能独立的电路块。1、process语句的根本形式PROCESS[〔敏感信号1,敏感信号2,…〕]BEGIN┇ENDPROCESS;常用的4种语句三、process语句2、说明敏感信号表中的任何一个发生变化,都启动process语句工作。敏感信号表中的信号是一局部输入信号,或者在process语句中形成的反响信号;纯粹输出的信号或者在本语句中不发生变化的信号不能放入敏感信号表。常用的4种语句三、process语句我们在if语句中介绍的电路如果不和PROCESSS语句结合起来,不能构成一个功能独立的电路,编译时就会出错。下面是改造后的16位存放器和2选1多路开关。3、改造后的16位存放器--Signalreset,clk,wen:std_logic;
--Signald,q:std_logic_vector(15downto0);
register_pro:process(reset,clock)
begin
Ifreset=‘0’then
q<=x”0000”;
Elsifclock’eventandclock=‘1’then
ifwen=‘1’then
q<=d;
endif;
Endif;
endprocess;
注意:敏感信号表中没有信号D,因为只需要reset和clock启动这个process语句;信号q是个输出信号,因此不能放入process语句的敏感信号表中。
Register_pro:表示一个标号,标号可有可无。
常用的4种语句三、process语句4、改造后的2选一多路开关--Signalsel:std_logic;
--Signala,b,c:std_logic_vector(15
--downto0);
process(sel,a,b)
begin
Ifsel=‘0’then
c<=a;
Else
c<=b;
Endif;
endprocess;
常用的4种语句三、process语句5、程序计数器PC的一种设计--signalpc,zjmp_pc,cjmp_pc:
--std_logic_vector(15downhto0);
--signalt,zj_flag,cj_flag,dw_flag,reset:std_logic;
pc_proc:process(pc,zjmp_pc,cjmp_pc,t,zj_flag,cj_flag,
dw_flag,reset)
begin
ifreset=‘0’then
pc<=x”0000”;
elsift’eventandt=‘1’then
ifzj_flag=‘1’then
pc<=zjmp_pc;
elsifcj_flag=‘1’then
pc<=cjmp_pc;
elsifdw_flag=‘1’then
pc<=pc+“10”;
else
pc<=pc+‘1’;
endif;
endif;
endprocess;常用的4种语句三、process语句6、1000000计数器设计--signalcounter:std_logic_vector(19downto0);
--signalcounterclk,reset:std_logic;
--16进制f423f等于10进制999999
process(reset,clk)
begin
ifreset=‘0’then
counter<=x”00000”;
elsifclk’eventandclk=‘1’then
ifcounter/=x”f423f”then
counter<=counter+‘1’;
else
counter<=x”00000”;
endif;
endif;
endprocess;
常用的4种语句三、process语句7、锁存器设计--signalreset,set,clk:std_logic;
--siganld,q:std_logic_vector(15downto0);
process(reset,set,clk)
ifreset=‘0’then
q<=x”0000”;
elsifset=‘0’then
q<=x”ffff”;
elsifclk=‘1’then
q<=d;
endif;
endprocess;常用的4种语句四、CASE语句1、CASE语句的书写格式CASE条件表达式ISWHEN条件表达式值1=〉假设干语句 ┆WHEN条件表达式n=〉 假设干语句WHENOTHERS=〉 假设干语句ENDCASE;常用的4种语句四、CASE语句2、例子1—运算器设计
一个有加、减、与、或功能的16位运算器。其中,cin是原来的进位值,cout是运算后的进位值,q是运算的结果,a和b是2个操作数,sel是个2位的运算选择码。
--signala,b,q:std_logic_vector(15downto0);
--signalsel:std_logic_vector(1downto0);
--signalcin,cout:std_logic;
--signalresult:std_logic_vector(16downto0);
process(a,b,sel,cin)
begin
caseselis
when“00”=>
result<=‘0’&a+‘0’&b;
q<=result(15downto0);
cout<=result(16);
when“01”=>
result<=‘0’&a+‘0’&b;
q<=result(15downto0);
cout<=result(16);
when“10”=>
q<=aandb;
cout<=cin
whenothers=>
q<=aorb;
cout<=cin;
endcase;
endprocess;常用的4种语句四、CASE语句3、例子2—一个2与非门--signal
a:std_logic_vector(1downto0);
--signalc:std_logic;
process(a)
begin
caseselis
when“00”|“01”|“10”=>
c<=‘1’;
when“11”=>
c<=‘0’;
whenothers=>
null;
endcase;
endprocess;
在本例子中,第一个when中的“|“代表或者,即三个条件中的任何一个满足,都执行c<=‘1’。实际上与非门很少这样设计。
Null是个什么也不做的空语句。常用的4种语句四、CASE语句4、例子3—一个状态机设计该状态机可用于指令cache的在不命中时的控制。指令cache容量是8x8字。每个字16位。存储器数据总线是16位。Miss是不命中标志。
--signalstate,next_state:std_logic_vector(3downto0);
--signalreset,clk,miss:std_logic;
proceee(reset,clk)
begin
ifreset=‘0’then
state<=“0000”;
elsifclk’eventandclk=‘1’then
state<=next_state;
endif;
endprocess;
process(miss,state)
begin
casestateis
when“0000”=>
ifmiss=‘1’then
next_state<=“0001”;
else
next_state<=“0000”;
endif;
when“0001”=>--1
next_state<=“0011”;
when“0011”=>--2
next_state<=“0010”;
when“0010”=>--3
next_state<=“0110”;
when“0110”=>--4
next_state<=“0111”;
when“0111”=>--5
next_state<=“0100”;
when“0100”=>--6
next_state<=“1100”;
when“1100”=>--7
next_state<=“1000”;
when“1000”=>--8
next_state<=“0000”;
whenothers=>
next_state<=“0000”;
endcase;
endprocess;设计实体VHDL适合做大型工程的设计。除了极少数十分简单的工程外,根本上都采用层次结构的设计。在层次结构的设计中,设计实体是一个根本单元。使用VHDL语言设计一个工程的过程中,经常要使用厂家提供各种库,库中存放的是供用户使用的已经设计好的设计实体。因此可以认为,一个工程就是用户设计的各个设计实体和库中提供的设计实体通过适当的信号连接完成的。设计实体在一个工程中除了最高层的设计实体外,其他设计实体都是子系统,或者称为元件。这里的元件是广义的,不是市场上卖的现成的元件。最高层的设计实体就是系统总体。
设计实体一个设计实体由三局部构成:实体〔entity〕定义系统对外联系的信号,信号的方向和数据类型。相当于电子器件的引脚。结构体(architecture)完成设计实体规定的功能,就是子系统的内部电路结构。库(library)和程序包(package)设计实体前面要写明该设计实体用到的库和程序包。实体〔entity〕Entity定义流出、流入设计实体的信号。Entity的书写形式如下:
Entity
实体名is
端口说明;
end实体名;实体〔entity〕下面举一个实体的例子:ENTITYmuxISPORT(d0,d1,sel:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux;
其中,MUX是实体名。PORT〔端口〕说明的是端口信号的数据类型的和流动方向。在本例中,d0、d1和sel是STD_LOGIC数据类型,是流入实体的信号;q是STD_LOGIC数据类型,是流出实体的信号。实体〔entity〕Port(端口的书写形式)
PORT(端口名,…,端口名:模式数据类型; 端口名,…,端口名:模式数据类型;
. . .
端口名,…,端口名:模式数据类型);
实体说明中的每一个输出/输入被称为一个端口。一个端口实际上表示一个或者一组具有相同模式和数据类型的负责与外部通讯的信号,相当于元件的引脚。实体〔entity〕下面是一个PORT语句的例子:PORT (reset,cs: in std_logic; rd,wr in std_logic; a1,a0: in std_logic; pa,pb inout std_logic_vector(7downto0); pc out std_logic_vector(17downto0));
端口的模式用来说明信号通过端口的方向和通过方式,有以下几种方式:实体〔entity〕IN〔流入实体〕OUT〔从实体流出〕INOUT〔双向端口,即可流入实体,又可从实体流出〕BUFFER〔双向端口,可从实体流出,也能用于内部反响〕
OUT模式的端口不能用于被设计实体的内部反响。BUFFER模式的端口能够用于被设计实体的内部反响。INOUT模式可以代替IN、INOUT、BUFFER模式,INOUT模式允许内部反响。虽然INOUT模式能代替其他模式,但在设计时,除非真正需要双向端口时,建议不要使用INOUT模式。惯例是把输入端口指定为IN模式,把输出端口指定为OUT模式,把双向端口指定INOUT模式。这一良好的设计习惯,从端口的名称和端口模式就可以一目了然地判定信号的用途、性质、来源和去向,十分方便。对于一个大型设计任务,大家协同工作,这样的描述不会引起歧义。另一方面,指定满足端口性能的最根本模式,可以减少占用的器件内部的资源。结构体(architecture)完成设计实体规定的功能,就是子系统的内部电路结构。结构体的书写形式如下:ARCHITECTURE结构体名OF实体名IS内部信号,常量,数据类型,函数等的定义;BEGIN 假设干并行执行语句;END结构体名;注意:实体名一定要与对应的实体名完全一致。ARCHITECTURE后面的结构体名与END后的结构体名完全一致。结构体的名字可以随便起,因为别的地方都用不着这个名字。结构体内要求并行执行语句,类似IF之类的顺序执行语句,只要将它们放在并行语句〔如process)之内即可。结构体(architecture)一个实体可以对应几个结构体,我们这里只介绍一个实体只对应一个结构体的情况。结构体有许多构成的方法,就是把各类的并行语句加以不同的组合方式形成各种构成方法。我们使用赋值语句、PROCESS语句和COMPONENT〔元件语句〕构成结构体的方法,这是初学者最常使用的方法,也是很管用的方法。库在层次结构设计中,程序包〔PACKAGE〕和库(LIBRARY)都是很重要的工具,即使是由一个设计实体构成的设计,也要用到库。VHDL的库是用来存储可编译的设计单元的地方,也就是用来存放可编译的程序包的地方,这样它就可以在其他设计中被调用。库中的设计单元〔实体说明、结构体、配置说明、程序包说明和程序包体等〕可以用作其他VHDL设计的资源。VHDL语言的库分为两种,一种是设计库,一种是资源库。被IEEE认可的资源库称为IEEE库。VHDL工具厂商和EDA工具专业公司都有自己的资源库,有的自行参加到各自的开发工具IEEE库中,也有自行建库,另行独立调用的资源库。库IEEE库是最常用的资源库,其中包含的程序包是:Std_logic_1164 一些常用函数和数据类型程 序包Numeric_bit bit类型程序包 Numeric_Std 用于综合的数值类型和算术 函数程序包Math_Real 实数的算术函数程序包Math_Complex 复数的算术函数程序包Vital_Timing Vital时序程序包Vital_Primitives Vital元件程序包
上述程序包中,不是每一个EDA软件都全部提供。使用时应该详细了解EDA软件的功能,看有无相应的程序包,或者找出替代的程序包。
库除了IEEE标准资源库外,各可编程器件的厂家提供的EDA软件提供自己独特的资源程序包。由于这些程序包是为它们制造的器件效劳的,往往更有针对性。QartusⅡ中提供了一个LPM库,库中有许多称之为MegaFunctions的功能强大的函数。在QartusⅡ中使用菜单命令Tools→MegaWizardPlug-InManager能够很容易地掌握QartusⅡ提供的许多元件和函数的使用。使用Cyclone芯片中的存储器时,Altera公司强烈推荐通过Tools→MegaWizardPlug-InManager进行设计。一个设计实体例子
libraryieee;useieee.std_logic_1164.all;
ENTITYand_gateIS PORT(op1,op2:instd_logic; and_result:outstd_logic);ENDand_gate;
ARCHITECTUREbehavOFand_gateISBEGIN and_result<=op1ANDop2;ENDbehav;
库使用库中的元件和函数之前,需要使用LIBRARY子句和USE子句予以说明。没有说明的库中的元件通常不能使用。如果一个设计实体中使用了某个库中的元件和函数,就要使用相应的LIBRARY子句和USE子句,LIBRARY子句和USE子句放在总是放在设计文件的最前面〔可以放在注释之后〕,LIBRARY子句的作用是使该库在当前文件中“可见”。LIBRARY子句说明使用哪个库,它的格式是 LIBRARY库名1,库名2,…,库名n;USE子句说明使用哪个库中的哪个程序包中的元件或者函数。它的格式是: USE库名.程序包名.ALL;下面是使用,LIBRARY子句和USE子句的例子:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;对于一般使用而言,这些库的说明语句够用了。
component〔元件〕语句
和portmap〔端口映射〕语句在层次化结构设计中,要经常用到component〔元件〕语句和portmap〔端口映射〕语句。component语句的作用是说明设计实体中使用的哪个低层设计实体和该低层设计实体的端口。该低层设计实体在本设计实体中作为现成的元件使用。component〔元件〕语句一般放在结构体中architecture语句和首次出现的begin之间,给人以一目了然的感觉。portmap语句完成低层设计实体的端口信号和本设计实体其他局部的信号连接问题。它必须放在结构体内首次出现的begin之后。component〔元件〕语句
和portmap〔端口映射〕语句高层的设计实体可以把低层设计实体当作元件来引用称作例化。在一个高层设计实体中可以对一个元件例化屡次。component〔元件〕语句
和portmap〔端口映射〕语句COMPONENT语句的书写形式是:COMPONENT元件名--指定调用元件PORT 说明--被调用元件端口ENDCOMPONENT;端口的说明和被调用元件〔设计实体〕中ENTITY中的说明要完全一致〔次序可以改变〕。component〔元件〕语句
和portmap〔端口映射〕语句PORT语句的书写格式如下: [标号]:POETMAP(MS1=>S1,MS2=>S2,…,MSn=>Sn); 其中,MS1,MS2,…,MSn和S1,S2,…,Sn都是信号名。标号是可选的,即可有可无。S1,S2,…,Sn是高层设计实体中使用的信号名;MS1,MS2,…,MSn是低层建立元件时使用的端口信号名〔引脚名〕。这种映射方式称为显式映射方式,它把元件端口的信号和高层中使用的信号显式对应起来,书写的顺序不受任何限制。请注意:高层中使用的信号名和元件端口对应的信号名可以相同,也可以不同;但是完全相同有时根本做不到。component〔元件〕语句
和portmap〔端口映射〕语句每次引用该元件都要使用portmap〔端口映射〕语句例化一次。标号是可选的。然而我主张,为了区别同一个元件在一个设计实体内的屡次例化,最好使用标号将屡次例化加以区分。在一个设计实体的独立电路〔如process〕原那么上都应该有标号,以便阅读。一个层次结构设计的例子设计一个由2个与门、1个或门构成的与或门低层的设计实体“与门”
libraryieee;
useieee.std_logic_1164.all;
ENTITYand_gateIS
PORT(op1,op2:instd_logic;
and_result:outstd_logic);
ENDand_gate;
ARCHITECTUREbehavOFand_gateIS
BEGIN
and_result<=op1ANDop2;
ENDbehav;低层的设计实体“或门”
libraryieee;
useieee.std_logic_1164.all;
ENTITYor_gateIS
PORT(op1,op2:instd_logic;
or_result:outstd_logic);
ENDor_gate;
ARCHITECTUREbehavOFor_gateIS
BEGIN
or_result<=op1ORop2;
ENDbehav;高层设计中使用元件and_gate和or_gate设计与或门
libraryieee;
useieee.std_logic_1164.all;
ENTITYand_or_gateIS
PORT(a1,a2,a3,a4:instd_logoc;
and_or_result:outstd_logic);
ENDand_or_gate;
ARCHITECTUREstructOFand_or_gateIS
SIGNALb1,b2:std_logic;--高层设计中使用的内 --部信号
COMPONENTand_gate--说明元件“与门”and_gate
PORT(op1,op2:instd_logic;
and_result:outstd_logic);
ENDCOMPONENT;
COMPONENTor_gate--说明元件“或门”or_gate
PORT(op1,op2:instd_logic;
or_result:outstd_logic);
ENDCOMPONENT;
BEGIN
--对“与门”and_gate的一次例化
G1:and_gate
PORTMAP(op1=>a1,op2=>a2,
and_result=>b1);
--对“与门”and_gate的一次例化
G2:and_gatePORTMAP(op1=>a3,op2=>a4,
and_result=>b2);
--对“或门”or_gate的一次例化
G3:or_gatePORTMAP(op1=>b1,or_result=>
and_or_result,op2=>b2);
ENDstruct;
Pachage(程序包)
和工作库work在上面与或门的构建中,我们会觉察一个问题:如果每个高层设计实体在使用同一个低层设计实体时都要对引用的低层设计实体进行说明岂不是太麻烦?解决这个问题的的方法是使用package(程序包)和工作库work。程序包〔PACKAGE〕是一种使包体中的类型、常量、元件和函数对其他模块〔文件〕是可见,可以调用的设计单元。程序包是公用的存储区,在程序包内说明的数据,可以被其他模块〔文件〕使用。程序包由包头和包体2局部组成。WORK库是设计库,在任何设计文件中隐含都是“可见”的,不需要特别说明。也就是说,每一个设计文件中总是隐含以下不可见的行: LIBRARY WORK;下面仍将与或门的设计为例,说明pachage和库work的使用。与门和活门的设计不变,增加一个PACKAGE的设计,对与或门设计进行修改。LIBRARYieee;
USEieee.std_logic_1164.all;
PACKAGEand_or_componentsIS
COMPONENTor_gate--说明元件“或门”or_gate
PORT(op1,op2:instd_logic;
or_result:outstd_logic);
ENDCOMPONENT;
COMPONENTand_gate --说明元件“与门”and_gate
PORT(op1,op2:instd_logic;
and_result:outstd_logic);
ENDCOMPONENT;
ENDand_or_components;LIBRARYieee;
USEieee.std_logic_1164.all;
USEwork.and_or_components.all;--指明调用的程序包,使其成为可用
ENTITYand_or_gateIS
PORT(a1,a2,a3,a4:instd_logoc;
and_or_result:outstd_logic);
ENDand_or_gate;
ARCHITECTUREstructOFand_or_gateIS
SIGNALb1,b2:std_logic;--高层设计中使用的内部信号
BEGIN
--对“与门”and_gate的一次例化
G1:and_gate PORTMAP(op1=>a1,op2=>a2,and_result=>b1);
--对“与门”and_gate的一次例化
G2:and_gatePORTMAP(op1=>a3,op2=>a4,and_result=>b2);
--对“或门”or_gate的一次例化
G3:or_gatePORTMAP(op1=>b1,or_result=>and_or_result,op2=>b2);
ENDstruct;一个存放器堆的设计要求:1、设计4个16位的存放器堆2、当reset信号为低时,使所有存放器复位。3、用rd〔2位〕选择写入的存放器。当写允许信号write为高时,在时钟信号clk的上升沿将数据d_input写入rd选中的存放器。4、用rs〔2位〕信号选择读出的存放器,读出的内容送q_out。一个存放器堆的设计设计方案:1、低层设计实体有3个:16位的存放器register_162—4译码器decoder2_to_44选1多路开关mux4_to_12、使用上述元件的高层设计实体regfile16位存放器register_16LIBRARYieee;USEieee.std_logic_1164.all;ENTITYregiister_16IS PORT ( reset :IN STD_LOGIC; d_input :IN STD_LOGIC_vector(15downto0); clk :IN STD_LOGIC; write :IN STD_LOGIC; sel :IN STD_LOGIC; q_output :OUT STD_LOGIC_vector(15downto0) );
ENDregister_16;ARCHITECTUREaOFregister_16IS
BEGIN
PROCESS(reset,clk)
BEGIN
IFreset='0'then
q_output<=x"0000";
elsif(clk'EVENTANDclk='1')THEN
IFsel='1'andwrite='1'THEN
q_output<=d_input;
ENDIF;
ENDIF;
ENDPROCESS;
ENDa;
2-4译码器decoder2_to_4LibraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entitydecoder2_to_4is port( rd:instd_logic_vector(1downto0); sel00:outstd_logic; sel01:outstd_logic; sel02:outstd_logic; sel03:outstd_logic);enddecoder2_to_4;architectureBehavioralofdecoder2_to_4isbegin sel00 <=(notrd(1))and(notrd(0)); sel01 <=(notrd(1))andrd(0); sel02 <=rd(1)and(notrd(0)); sel03 <=rd(1)andrd(0);endBehavioral;4选1多路开关mux4_to_1libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entitymux4_to_1isport( Input0,Input1,Input2,Input3 :instd_logic_vector(15downto0); Sel :instd_logic_vector(1downto0); Out_put:outstd_logic_vector(15downto0));endmux4_to_1;architectureBehavioralofmux4_to_1isbeginmux:process(Sel,Input0,Input1,Input2,Input3)begincaseSelis when"00"=>Out_put<=Input0; when"01"=>Out_put<=Input1; when"10"=>Out_put<=Input2; when"11"=>Out_put<=Input3; endcase;endprocess;endBehavioral;存放器堆regfile高层设计实体libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entityregfileis
Port( rs:instd_logic_vector(2downto0);
rd:instd_logic_vector(2downto0);
reset :instd_logic;
write :instd_logic;
clk :instd_logic;
d_input:instd_logic_vector(5downto0);
q_out:outstd_logic_vector(5downto0)
);
endregfile;architecturestructureofregfileis
componentregister_16PORT(--16bit存放器
reset,clk,write,sel:INSTD_LOGIC;
d_input :IN STD_LOGIC_vector(15downto0);
q_output:OUTSTD_LOGIC_vector(15downto0));
endcomponent;
comp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026湖北荆州市文化旅游投资发展集团有限公司社会招聘28人考试备考题库及答案解析
- 26年养老护理安全准则课件
- 26年老年护理原则培训讲义课件
- 2026陕西星邑空间技术有限公司招聘9人考试参考试题及答案解析
- 26年银发护理睦邻友好课件
- 2026河北唐山滦南县城市供水中心招聘工作人员10人考试参考题库及答案解析
- 2026湖北荆州市沙市区面向城市社区党组织书记专项招聘事业岗位人员5人考试备考试题及答案解析
- 钢结构网架顶升施工方案
- 2026年福建泉州德化县韵丽陶瓷有限公司招聘49名工作人员考试参考题库及答案解析
- 2026山东港华燃气集团有限公司校园招聘10人考试备考题库及答案解析
- 2025年四川省遂宁市中考物理试卷及答案
- 冀教版小学数学六年级下册小升初毕业会考模拟卷(四) (含答案)
- 数据库应用技术-第三次形考作业(第10章~第11章)-国开-参考资料
- 2025年实验室生物安全风险评估报告总结
- 人工智能在家电中的应用-深度研究
- 古建筑工程施工组织设计方案
- 绘本小熊的森林课件
- 2023年高考辽宁卷化学真题(解析版)
- 《论语》导读(复旦版)学习通超星期末考试答案章节答案2024年
- TAPD 0010-2024 公路大件运输加固计算方法
- 压力管道使用单位压力管道安全日管控制度及压力管道安全员守则和每日压力管道安全检查记录
评论
0/150
提交评论