《第五讲-VHDL数据对象及属性课件.ppt》由会员分享,可在线阅读,更多相关《第五讲-VHDL数据对象及属性课件.ppt(64页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 1lVHDLVHDL处理处理静态数据静态数据的两种对象:的两种对象:constconst和和genericgeneric。lVHDLVHDL处理处理非静态数据非静态数据的两种对象:的两种对象:信号和变量信号和变量。l常量和信号是全局的,既可以用于顺序代码,也可常量和信号是全局的,既可以用于顺序代码,也可用于并发代码;用于并发代码;l变量只能在顺序代码中使用,相对于信号而言,变变量只能在顺序代码中使用,相对于信号而言,变量只能是局部的,所以变量值不能传递到量只能是局部的,所以变量值不能传递到processprocess、functio
2、nfunction和和procedureprocedure外部。外部。l但是,在有些情况下,选择信号还是变量却是比较但是,在有些情况下,选择信号还是变量却是比较难以抉择的。难以抉择的。信号信号(Signal)(Signal)和变量和变量(Variable)(Variable)。第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 2n 常量常量用于确定默认值,语法结构:用于确定默认值,语法结构:CONST 常量名:常量名:type:=值值;例子:例子:CONST set_bit:BIT:=1;CONST datamemory:memory:=(0,0,1,1),0,0,1,1);常量可
3、以在包集、实体或结构体中声明:常量可以在包集、实体或结构体中声明:包集中:全局;包集中:全局;实体中:对该实体内的所有结构体而言是全局的;实体中:对该实体内的所有结构体而言是全局的;结构体中:结构体内是全局的。结构体中:结构体内是全局的。第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 3n 信号信号VHDLVHDL中中信号信号代表电路单元、功能模块间的硬件连线,代表电路单元、功能模块间的硬件连线,也可表示电路单元的也可表示电路单元的IN/OUTIN/OUT端口;端口;实体的所有端口都默认为信号,语法结构:实体的所有端口都默认为信号,语法结构:Signal 信号名:type ran
4、ge:=初始值;注意:注意:当信号用于顺序描述语句如当信号用于顺序描述语句如processprocess中中时,其值时,其值不是立刻更新的不是立刻更新的;只有当其所在的;只有当其所在的processprocess、函数或过程、函数或过程完成之后才进行更新完成之后才进行更新。第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 4信号的赋值符号:信号的赋值符号:=注意注意1:对信号赋初值的操作是不可综合的,通常只用于对信号赋初值的操作是不可综合的,通常只用于 仿真。仿真。例如:例如:signal control:BIT:=0;注意注意2:不要对同一个信号进行多重赋值不要对同一个信号进行多
5、重赋值。(。(buffer模式的模式的端口信号除外!)端口信号除外!)例如:例如:process(.).for i IN 0 TO 10 LOOP control=control+1;-error!或最后一次有效!或最后一次有效!.第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 5例例1 1“1 1”计数器计数器功能描述:功能描述:计算一个二进制矢量中计算一个二进制矢量中1的个数的个数din7:0one2:0第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 6实现代码:-错误使用信号的例子 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.al
6、l;ENTITY count_ones iS PORT(din:IN std_logic_vector(0 to 7);ones:OUT integer range 0 to 8);END count_ones;ARCHITECTURE not_ok OF count_ones IS signal temp:integer range 0 to 8;BEGIN process(din)BEGIN temp=0;FOR i IN 0 TO 7 LOOP IF(din(i)=1)then temp=temp+1;END if;END LOOP;ones=temp;END process;END n
7、ot_ok;进程结束后才更新进程结束后才更新第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 7两种代码更正方法:两种代码更正方法:1、使用变量来记录中间值,可以将、使用变量来记录中间值,可以将signal temp.改为改为variable temp.;同时修改相应;同时修改相应的的赋值语句赋值语句;2、取消、取消temp,同时将端口信号,同时将端口信号ones重新定重新定义为:义为:ones:BUFFER integer range 0 to 8;使得使得ones可以被内部调用。可以被内部调用。在进程结束后,在进程结束后,ones值将被更新。值将被更新。(编码风格不好,不提倡编
8、码风格不好,不提倡此种方式!此种方式!)第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 8n 变量变量(variable)(variable)变量代表电路单元内部的操作,代表暂存的临时数变量代表电路单元内部的操作,代表暂存的临时数据。与信号和常量相比,据。与信号和常量相比,变量仅用于局部的电路描变量仅用于局部的电路描述,只能用于进程、函数和过程内部述,只能用于进程、函数和过程内部。注意注意:对变量的赋值是立即生效的,无需等待进程对变量的赋值是立即生效的,无需等待进程结束结束。新的值可以在下一行代码中立即使用。新的值可以在下一行代码中立即使用。变量的赋值符号变量的赋值符号“:=”,
9、语法结构:,语法结构:variable 变量名:变量名:type range:=初始值初始值;注意:注意:对变量赋初值的操作也是不可综合的,通常只用于仿真对变量赋初值的操作也是不可综合的,通常只用于仿真。第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 9例:“1”计数器的实现代码:LIBRARY ieee;USE ieee.std_logic_1164.all;entity count_ones is port(din:IN std_logic_vector(0 to 7);ones:OUT integer range 0 to 8);end count_ones;archite
10、cture ok of count_ones isbeginprocess(din)variable temp:integer range 0 to 8;begin temp:=0;FOR i IN 0 TO 7 LOOP IF(din(i)=1)then temp:=temp+1;END if;END LOOP;ones=temp;end process;end ok;变量的赋值是立即生效变量的赋值是立即生效第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 OK!Not OK?第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 11n 信号和变量的比较信号和变量的比较赋
11、值方式的不同赋值方式的不同:变量变量:=表达式;表达式;信号信号 =表达式;表达式;硬件实现的功能不同:硬件实现的功能不同:信号信号代表电路单元、功能模块间的互联,代表电路单元、功能模块间的互联,代表实际的硬件连线;代表实际的硬件连线;变量变量代表电路单元内部的操作,代表暂代表电路单元内部的操作,代表暂存存的临时数据。的临时数据。第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 12有效范围的不同:有效范围的不同:信号:信号:程序包、实体、结构体;全局量。程序包、实体、结构体;全局量。变量:变量:进程、子程序;局部量。进程、子程序;局部量。ARCHITECTURE SIGNAL D
12、eclarationslabel1:PROCESSVARIABLE Declarationslabel2:PROCESSVARIABLE Declarations第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 13 赋值行为的不同:赋值行为的不同:信号信号赋值延迟更新数值、时序电路;赋值延迟更新数值、时序电路;变量变量赋值立即更新数值、组合电路。赋值立即更新数值、组合电路。信号的多次赋值信号的多次赋值 a.a.一个进程:最后一次赋值有效一个进程:最后一次赋值有效 b.b.多个进程:多源驱动多个进程:多源驱动,线与、线与、线或、三态线或、三态 第第5 5讲讲 VHDLVHDL数据对
13、象及属性数据对象及属性 14例:信号的多次赋值例:信号的多次赋值 architecture rtl of ex is signal a:std_logic;begin process()begin a=b;a=c;end process;end rtl;architecture rtl of ex is signal a:std_logic;begin process()begin a=b;end process;process()begin a=c;.end process;end ex;第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 15例:信号赋值与变量赋值的比较例:信号赋
14、值与变量赋值的比较 信号赋值:信号赋值:architecture rtl of sig isarchitecture rtl of sig is signal a,b:std_logic;-signal a,b:std_logic;-定义信号定义信号 begin begin process(a,b)process(a,b)begin begin a=b;a=b;b=a;b=a;end process;end process;end rtl;-end rtl;-结果是结果是 a a 和和 b b 的值互换的值互换第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 16 变量赋值变量赋值
15、 architecture rtl of var isarchitecture rtl of var is begin begin process process variable a,b:std_logic;-variable a,b:std_logic;-定义变量定义变量 begin begin a:=b;a:=b;b:=a;b:=a;end process;end process;end rtl;end rtl;-结果是结果是a a和和b b的值都等于的值都等于b b的初值的初值 第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 17例:变量赋值实现循环语句功能例:变量赋值实
16、现循环语句功能 process(indicator,sig)process(indicator,sig)variable temp:std_logic;variable temp:std_logic;begin begin temp:=temp:=0 0;for i in 0 to 3 loop for i in 0 to 3 loop temp:=temp xor(sig(i)and temp:=temp xor(sig(i)and indicator(i);indicator(i);end loop;end loop;output=temp;output=temp;end process;
17、end process;第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 18以上语句等效为:process(indicator,sig)process(indicator,sig)variable temp:std_logic;variable temp:std_logic;beginbegin temp:=temp:=0 0;temp:=temp xor(sig(0)and indicator(0);temp:=temp xor(sig(0)and indicator(0);temp:=temp xor(sig(1)and indicator(1);temp:=temp xor
18、(sig(1)and indicator(1);temp:=temp xor(sig(2)and indicator(2);temp:=temp xor(sig(2)and indicator(2);temp:=temp xor(sig(3)and indicator(3);temp:=temp xor(sig(3)and indicator(3);output=temp;output=temp;end process;end process;第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 19如改为信号,则无法实现原功能:如改为信号,则无法实现原功能:signal temp:s
19、td_logic;signal temp:std_logic;process(indicator,sig,temp)process(indicator,sig,temp)begin begin temp=temp=0 0;temp=temp xor(sig(0)and indicator(0);temp=temp xor(sig(0)and indicator(0);temp=temp xor(sig(1)and indicator(1);temp=temp xor(sig(1)and indicator(1);temp=temp xor(sig(2)and indicator(2);temp
20、=temp xor(sig(2)and indicator(2);temp=temp xor(sig(3)and indicator(3);temp=temp xor(sig(3)and indicator(3);output=temp;output=temp;end process;end process;第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 20例3:多路复用器的对比设计 方案一:使用信号(not OK)LIBRARY ieee;USE ieee.std_logic_1164.all;entity mux is port(a,b,c,d,s0,s1:IN std_l
21、ogic;y:OUT std_logic);end mux;architecture not_ok of mux is signal sel:integer range 0 to 3;begin 值不能立即更新,不能在值不能立即更新,不能在process的其它代码中继续使用的其它代码中继续使用不能进行同一信号的多次不能进行同一信号的多次赋值,要么出错,要么赋值,要么出错,要么“线与线与”,要么只考虑最后,要么只考虑最后一次赋值,取决于编译器一次赋值,取决于编译器process(a,b,c,d,s0,s1)begin sel=0;if(s0=1)then sel=sel+1;end if;if(
22、s1=1)then selyyyyyyyy=d;end case;end process;end ok;第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 22例例5.1.4 5.1.4 带带q q和和qbarqbar的的DFFDFF DFFqdclkqbar功能描述:功能描述:D触发器触发器 qbar为为q的反相输出端。的反相输出端。第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 23方案方案1:not_ok-library ieee;use ieee.std_logic_1164.all;-entity dff is port(d,clk:IN std_logic;
23、q:BUFFER std_logic;qbar:OUT std_logic);end dff;-architecture not_ok of dff is begin process(clk)begin if(clkevent AND clk=1)then q=d;qbar=NOT q;end if;end process;end not_ok;-方案方案2:ok-library ieee;use ieee.std_logic_1164.all;-entity dff is port(d,clk:IN std_logic;q:BUFFER std_logic;qbar:OUT std_logi
24、c);end dff;-architecture ok of dff is begin process(clk)begin if(clkevent AND clk=1)then q=d;end if;end process;qbar=NOT q;end mux2;-q值在process之后更新,引起qbar的同步更新q不能立即更新,导致qbar值将延后一个时钟周期buffer类型输出信号可供内部电路使用第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 Not okOK第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 25u分频器分频器功能描述功能描述:对时钟进行:对时钟
25、进行6 6分频;分频;设计要点设计要点:两个输出,一个基于:两个输出,一个基于信号信号,另一个,另一个基于基于变量变量。分频器分频器fclkfclk/6第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 26实现代码:LIBRARY ieee;USE ieee.std_logic_1164.all;entity freq_divider is port(clk:IN std_logic;out1,out2:BUFFER std_logic);end freq_divider;architecture example of freq_divider is SIGNAL count1:i
26、nteger range 0 to 7;begin process(clk)variable count2:integer range 0 to 7;begin if(clkevent AND clk=1)then count1=count1+1;count2:=count2+1;if(count1=_)then out1=NOT out1;count1=0;end if;if(count2=_)then out2=NOT out2;count2:=0;end if;end if;end process;end example;未赋初值,但范围固定未赋初值,但范围固定buffer类型,可以实现
27、电平翻转;类型,可以实现电平翻转;另,将另,将std_logic改为改为bit类型更好些类型更好些!计数计数清零清零信号延迟更新,变量即时更新,填空区别?第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 28 寄存器的数量寄存器的数量-对电路面积的重要影响对电路面积的重要影响 不同的编译器(仿真工具、综合工具等)对不同的编译器(仿真工具、综合工具等)对不同风格的代码进行编译时产生的寄存器数量不同风格的代码进行编译时产生的寄存器数量是不同的是不同的。本小节目的:。本小节目的:了解可以使用什么方法来减少寄存器数量;了解可以使
28、用什么方法来减少寄存器数量;了解代码是否可以实现预期的结果;了解代码是否可以实现预期的结果;第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 n寄存器生成的条件寄存器生成的条件对信号来说:当一个信号的赋值是以另一个信号的边沿或跳对信号来说:当一个信号的赋值是以另一个信号的边沿或跳变为条件时(即发生同步赋值时),该信号经编译后就会生变为条件时(即发生同步赋值时),该信号经编译后就会生成寄存器。成寄存器。同步赋值只能在进程、函数或过程等顺序代码中同步赋值只能在进程、函数或过程等顺序代码中出现,一般在语句出现,一般在语句if signalevent.或或wait until之后。之后。对
29、变量来说:对变量来说:(1)若一个变量是在一个信号跳变时被赋值,若一个变量是在一个信号跳变时被赋值,并且该值最终又被赋给了另外的信号(数值传递作用),则并且该值最终又被赋给了另外的信号(数值传递作用),则将生成寄存器将生成寄存器。(2)一个变量未进行赋值操作时已经被信号一个变量未进行赋值操作时已经被信号使用,也将产生寄存器(使用,也将产生寄存器(用以存储用以存储process上一次执行后上一次执行后c的值的值)。)。如果未被进程、函数或过程之外的代码调用,则不一定生成如果未被进程、函数或过程之外的代码调用,则不一定生成寄存器。寄存器。第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性
30、 30例:例:output1和和output2都被寄存的情况都被寄存的情况 process(clk)begin if(clkevent AND clk=1)then output1=temp;-被存储或生成寄存器;被存储或生成寄存器;output2=a;-被存储或生成寄存器;被存储或生成寄存器;end if;end process;原因:原因:对对信号信号来说:当一个信号的赋值是以另一个信号的来说:当一个信号的赋值是以另一个信号的边沿或跳变为条件时(即发生同步赋值时),该信号经编边沿或跳变为条件时(即发生同步赋值时),该信号经编译后就会生成寄存器。同步赋值只能在进程、函数或过程译后就会生成寄存
31、器。同步赋值只能在进程、函数或过程等顺序代码中出现,一般在语句等顺序代码中出现,一般在语句if signalevent.if signalevent.或或wait untilwait until之后。之后。第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 31例:例:output1被寄存、被寄存、output2未被寄存的情况未被寄存的情况 process(clk)begin if(clkevent AND clk=1)then output1=temp;-被存储或生成寄存器;被存储或生成寄存器;end if;output2=a;-未以另一个信号的边沿跳变进行赋值未以另一个信号的边沿
32、跳变进行赋值,-故未被存储;故未被存储;end if;end process;第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 32例:变量被寄存的情况例:变量被寄存的情况 process(clk)variable temp:BIT;begin if(clkevent AND clk=1)then temp:=a;end if;x=temp;-temp促使促使x被存储;被存储;end process;原因:原因:对对变量变量来说:来说:若一个变量是在一个信号跳若一个变量是在一个信号跳变时被赋值,并且该值最终又被赋给了另外的信号变时被赋值,并且该值最终又被赋给了另外的信号(数值传递作
33、用),则将生成寄存器(数值传递作用),则将生成寄存器 。第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 33例例6:带:带q和和qbar的的DFF 带带q和和qbar的的 DFFqdclkqbar功能描述:功能描述:D触发器触发器 qbar为为q的反相输出端。的反相输出端。两种实现方案两种实现方案:方案一生成两:方案一生成两个寄存器,方案二生成一个寄个寄存器,方案二生成一个寄存器。存器。第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 34方案方案1:two-dff-library ieee;use ieee.std_logic_1164.all;-entity df
34、f is port(d,clk:IN std_logic;q:BUFFER std_logic;qbar:OUT std_logic);end dff;-architecture two_dff of dff is begin process(clk)begin if(clkevent AND clk=1)then q=d;qbar=NOT q;end if;end process;end two_dff;-生成两个寄存器生成两个寄存器 DFFqdclk DFFqbar第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 35方案方案2:one-dff-library ieee;use
35、 ieee.std_logic_1164.all;-entity dff is port(d,clk:IN std_logic;q:BUFFER std_logic;qbar:OUT std_logic);end dff;-architecture one_dff of dff is begin process(clk)begin if(clkevent AND clk=1)then q=d;end if;end process;qbar=NOT q;end one_dff;-DFFqdclkqbar生成一个寄存器生成一个寄存器使用组合逻辑,而使用组合逻辑,而不是寄存器不是寄存器第第5 5讲讲
36、 VHDLVHDL数据对象及属性数据对象及属性 36小结小结 如果不对代码进行有效合理的组织,则会生如果不对代码进行有效合理的组织,则会生成额外的寄存器。成额外的寄存器。另外,在一些另外,在一些FPGA/CPLDFPGA/CPLD器件中,对同一个代器件中,对同一个代码,综合工具与布局布线工具的报告文件显示寄码,综合工具与布局布线工具的报告文件显示寄存器的数目可能是不一致的。存器的数目可能是不一致的。第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 37例例7 7 模模8 8计数器计数器 计数器计数器clkcount(2:0)rst功能描述:功能描述:模模8计数器。计数器。两种实现方
37、案两种实现方案:方案一使用变:方案一使用变量进行同步赋值,方案二使用量进行同步赋值,方案二使用信号进行同步赋值。信号进行同步赋值。第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 38方案方案1:变量方式变量方式-entity counter is port(clk,rst:IN BIT;count:OUT integer range 0 to 7);end counter;-architecture counter of counter is begin process(clk,rst)variable temp:integer range 0 to 7;begin if(rst
38、=1)then temp:=0;elsif(clkevent AND clk=1)then temp:=temp+1;end if;count=temp;end process;end counter;方案方案2:信号方式信号方式-entity counter is port(rst,clk:IN BIT;count:BUFFER integer range 0 to 7);end counter;-architecture counter of counter is begin process(clk,rst)begin if(rst=1)then count=0;elsif(clkeven
39、t AND clk=1)then count=count+1;end if;end process;end counter;buffer类型端口类型端口不必声明包集不必声明包集都需要使用寄存器来保存都需要使用寄存器来保存3 3位的当前计数值,位的当前计数值,综合时均会生成综合时均会生成3 3个寄存器。个寄存器。第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 39例例8 8 移位寄存器移位寄存器 DFFdoutdinclk DFF DFF DFF三个设计方案:三个设计方案:三个变量顺序排列三个变量顺序排列三个信号顺序排列三个信号顺序排列三个变量颠倒顺序排列三个变量颠倒顺序排列第第5
40、 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 40方案方案1:三个变量顺序排列三个变量顺序排列-entity shift is port(clk,din:IN BIT;dout:OUT BIT);end shift;-architecture shift of shift is begin process(clk)variable a,b,c:BIT;begin if(clkevent AND clk=1)then dout=c;c:=b;b:=a;a:=din;end if;end process;end shift;方案方案2:三个信号顺序排列三个信号顺序排列-entity sh
41、ift is port(din,clk:IN BIT;dout:OUT BIT);end shift;-architecture shift of shift is signal a,b,c:BIT;begin process(clk)begin if(clkevent AND clk=1)then a=din;b=a;c=b;dout=c;end if;end process;end shift;生成生成4个寄存器个寄存器不必声明包集不必声明包集生成生成1个寄存器个寄存器c、b、a的值被赋给的值被赋给dout、c、b之前没有被赋过值,综合时之前没有被赋过值,综合时会生成会生成3个寄存器,用以
42、存储个寄存器,用以存储process上一次执行后上一次执行后c、b、a的值。的值。方案一、二的波形相同,方案一、二的波形相同,dout较较din延后延后4个时钟周期个时钟周期第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 41方案方案3 3:三个变量颠倒顺序排列三个变量颠倒顺序排列 entity shift is port(clk,din:IN BIT;dout:OUT BIT);end shift;-architecture shift of shift is begin process(clk)variable a,b,c:BIT;begin if(clkevent AND
43、clk=1)then a:=din;b:=a;c:=b;dout=c;end if;end process;end shift;方案方案1:三个变量顺序排列三个变量顺序排列-entity shift is port(clk,din:IN BIT;dout:OUT BIT);end shift;-architecture shift of shift is begin process(clk)variable a,b,c:BIT;begin if(clkevent AND clk=1)then dout=c;c:=b;b:=a;a:=din;end if;end process;end shif
44、t;赋值顺序与方案一相反,赋值顺序与方案一相反,因对变量的赋值是立即生因对变量的赋值是立即生效的,三行代码可以简化效的,三行代码可以简化为为c:=dinc:=din。整个四行代码可以简化为整个四行代码可以简化为dout=din;dout=din;方案三中方案三中dout较较din延后延后1个时钟周期,未能实现设计初衷个时钟周期,未能实现设计初衷第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 42例例9 9 移位寄存器移位寄存器#2#2增加了一个复位端增加了一个复位端两种设计方案:两种设计方案:用信号生成寄存器用信号生成寄存器用变量生成寄存器用变量生成寄存器 DFFdclk DFF
45、 DFF DFFrstinternal(3)internal(2)internal(1)internal(0)第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 方案方案1:内部信号方式内部信号方式 library ieee;use ieee.std_logic_1164.all;entity shiftreg is port(d,clk,rst:IN std_logic;q:OUT std_logic);end shiftreg;architecture behavior of shiftreg is signal internal:std_logic_vector(3 downt
46、o 0);begin process(clk,rst)begin if(rst=1)then internal0);elsif(clkevent AND clk=1)then internal=d&internal(3 donwto 1);end if;end process;q0);elsif(clkevent AND clk=1)then internal:=d&internal(3 donwto 1);end if;end process;q=internal(0);end behavior;第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 44 属性(ATTRIBUTE)l
47、属性是指从指定的客体或对象(如属性是指从指定的客体或对象(如entity entity/type/architecture/type/architecture等)中获取关心的数据等)中获取关心的数据或信息。或信息。l利用属性可以使利用属性可以使VHDLVHDL源代码更加简明扼要,源代码更加简明扼要,易于理解;易于理解;l语法:语法:对象对象属性属性l预定义的属性:数值类属性和信号类属性预定义的属性:数值类属性和信号类属性第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 45数值类属性:获取数组、块或一般数据数值类属性:获取数组、块或一般数据 的相关信息。的相关信息。u VHDL V
48、HDL预先定义的、可综合的数值类属性:预先定义的、可综合的数值类属性:leftleft:索引的左边界值:索引的左边界值 rightright:索引的右边界值:索引的右边界值 highhigh:索引的上限值:索引的上限值 lowlow:索引的上限值:索引的上限值 lengthlength:索引的长度值:索引的长度值 rangerange:索引的位宽范围:索引的位宽范围 reverse_rangereverse_range:索引的反向位宽范围:索引的反向位宽范围 第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 46例:例:variable my_vector:bit_vector(5
49、 downto-5);各属性如下:各属性如下:my_vectorleft 5 my_vectorright -5 my_vectorhigh 5 my_vectorlow -5 my_vectorlength 11 my_vectorrange (5 downto-5)my_vectorreverse_range (-5 to 5)第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 47u枚举类型数值的属性:通常枚举类型数值的属性:通常是不可综合的是不可综合的 VAL(pos)VAL(pos):指定位置(指定位置(pospos)的值)的值 POS(value)POS(value):给
50、定数值的位置序号:给定数值的位置序号 LEFTOF(value)LEFTOF(value):给定数值的左侧值:给定数值的左侧值 VAL(row,column)VAL(row,column):位于行、列位置的值:位于行、列位置的值 第第5 5讲讲 VHDLVHDL数据对象及属性数据对象及属性 48 信号类属性信号类属性u VHDL VHDL预定义的,对于信号预定义的,对于信号s s:l EVENT:EVENT:如果如果s值发生了变化,则返回值为值发生了变化,则返回值为true,否则为,否则为false,常用于常用于时钟信号的判定时钟信号的判定。l STABLESTABLE 如果如果s值保持不变,