vhdl笔记.docx
《vhdl笔记.docx》由会员分享,可在线阅读,更多相关《vhdl笔记.docx(10页珍藏版)》请在冰点文库上搜索。
vhdl笔记
1std_logic拥有九种逻辑:
U(未设置)、X(浮接不定)、1(高电平)、0(低电平)、Z(高阻态)、W(弱浮接)、L(弱低电平)、H(弱高电平)、—(随意)而bit只有0、1两种逻辑,一般都用std_logic来代替bit因为它包含的逻辑更多,更符合硬件电路的特性
2变量只能在进程语句中说明和使用(是一个局部变量,该变量若要从进程内输出就必须将其代入信号量,信号量是全局变量,通过输出信号带出进程);信号、常量可以在结构体和进程语句中使用。
信号通常在实体、结构体和程序包中说明,但不能在进程中说明,只能在进程中使用。
3当时钟信号作为进程的敏感信号时,在敏感信号表中不能出现一个以上的时钟信号,除时钟信号以外,复位信号等是可以与时钟信号一起出现在敏感信号表中的。
4所谓同步复位,就是当复位信号有效且在给定的时钟边沿到来时,触发器才被复位;而非同步复位则是,一旦复位信号有效,触发器就被复位。
非同步触发器也称为异步复位。
5同步复位:
process(clk)
异步复位:
process(clk,clr)
6算术运算符+-<><=>=仅对integer类型有效。
逻辑运算符andornot仅对bit类型有效。
7U+=u-虚短
I+=i-虚断
8如果没有others分支条件存在,则分支条件必须覆盖表达式所有可能的值。
对std_logic,std_logic_vector数据类型要特别注意使用others分支。
9begin
Tmp:
=’1’;--jixiaoyantmp:
=’0’;--oujiaoyan
Foriin0to7loop
Tmp:
=tmpxora(i);
Endloop;
Y=tmp;
For循环变量是loop内部自动声明的局部变量,仅在loop内部可见;不需要指定其变化方式。
离散范围必须是可计算的整数范围:
整数表达式to/downto整数表达式。
一般综合工具不支持while…..loop语句。
在loop语句中next语句用来跳出本次循环。
格式:
next【标号】【when条件表达式】;
分三种情况:
(1)next;无条件终止当前的循环,跳回到本次循环loop语句开始处,开始下次循环。
(2)next【标号】;无条件终止当前的循环,跳转到指定标号的loop语句开始处,重新开始执行循环操作。
(3)next【标号】【when条件表达式】;当条件表达式的值为true,则执行next语句,进入跳转操作,否则继续向下执行。
10copmponent元件名【is】--is可以缺省
【generic(类属声明);】
【port(端口声明);】
Endcomponent【元件名】;元件声明类似实体声明(entity)
11componentadd
Generic(n:
positive);参数声明
Port(x,y:
inbit_vector(n-1downto0);
Z:
outbit_vector(n-1downto0);
Carry:
outbit);
Endcomponent;
12元件的例化
例化名称:
元件名称
【genericmap(类属名称=>表达式,类属名称=>表达式)
Portmap(端口名称=>表达式,端口名称=>表达式);】
端口映射方式:
名称关联方式:
低层次端口名(原来的端口名)=>当前层次端口名、信号名例:
or2portmap(i1=>n3,i2=>n1,o=>n6)
位置关联方式:
(当前端口名,当前端口名,……..)
例:
or2portmap(n3,n1,n6)
注:
位置关联方式中,例化的端口表达式(信号)必须与元件声明语句中的端口顺序一致。
13可以在结构体(architecture),程序包(package),块(block)中声明元件(component)。
14q:
outstd_logic_vector(3downto0)我们不能把输出的进行放在赋值的右边,也就是说如果去q<=1,合法;如果q<=q+1,q在右边了,不合法。
15for循环变量in范围generate
{并行语句}
Endgenerate;
范围:
整数表达式to/downto整数表达式
不需要设计者对变量干预。
16用生成语句创建多个备份
Componentcomp
Port(x:
inbit;
Y:
outbit);
Endcomponent;
…………………..
Signala,b:
bit_vector(0to7);
Gen:
forIina’rangegenerate
U:
compportmap(x=>a(I),y=>b(I));
Endgenerategen;
17子程序可以在package,architecture,process中定义。
子程序与进程语句的区别:
子程序不能从结构体的其余部分直接读写信号。
所有通信都是通过子程序的接口来完成的。
进程可以直接读出结构体内的其它信号。
子程序和进程内部都是顺序结构,但子程序不具有并发性,而进程具有并发性。
17子程序的类型:
过程(procedure):
0个或多个inout或inout参数,可以获得多个返回值。
函数(function):
0个或多个in参数,一个return值。
只能获得一个返回值。
过程可以作为一种独立的语句结构而单独存在,函数通常作为表达式的一部分来调用。
18子程序包含两部分:
字程序声明和子程序主体。
1,过程声明语法procedure过程名【(参数声明)】;参数声明指明输入输出端口的数目和类型。
参数的传递方向有inoutinout三种形式。
2,函数声明语法function函数名【(参数声明)】;return类型;
参数声明如:
【参数名:
方式参数类型】函数的方式只有in方式。
1)过程主体语法:
procedure过程名【(参数声明)】is{子程序声明项}
Begin{顺序语句}
End【过程名】;
19signalcount_6std_logic_vector(5downto0);在用到count_6<=count_6+1时,因为是位矢量和整数的相加需要调用library_ieee_std_logic_unsigned.all库。
20异步计数器又称为行波计数器,它的低位计数器的输出作为高位计数器的时钟信号。
21process(rst,clk)
Begin
Ifrst=’1’then
ForIin7downto0loop
IfI=4then
Next;
Else
Fifo(i)<=(others=>’0’);
Endif;
Endloop;
功能:
当rst有效时,fifo(4)之外的所有fifo寄存器都被复位。
22Next<循环标号>when<条件>;
1,循环标号和条件都是可选项。
2,执行了next语句之后,控制语句就转到由循环标识的循环体尾部(如果未给出循环标号,就转到当前循环的尾部),并且开始新的一次循环。
3,Next语句有判断条件,对条件进行测试并且测试结果为真时,就推出当前一轮循环,同时进入下一轮循环。
4,测试结果为假时,则不执行next语句。
23测试平台:
--声明本地变量用于赋值和观察
Signala_tb,b_tb,sum_tb,carry_out_tb:
std_logic;
--对被测电路进行例化
Uut:
entityhalf_adderportmap(a=>a_tb,b=>b_tb,sum=>sum_tb,carry_out=>carry_out_tb);
24to_unsigned(m,32)函数的功能是,将整数m转换为32位的unsigned类型(实际上就是一个std_logic_vector(31downto0)类型)。
Constantn:
integer:
=2;
Begin
ForIin0to2**n-1loop
(a_tb,b_tb)<=to_generate(I,n);
Waitforperiod;
Assert((sum=(a_tbxorb_tb)and(carry_out_tb=a_tbandb_tb))
Report”testfailed”severityerror;
Endloop;
25sll逻辑左移;srl逻辑右移;
Sla算术左移;sra算术右移;
Rol循环逻辑左移;ror循环逻辑右移。
26在写数据和擦除数据时,nandflah由于支持整块擦除操作,所以速度比norflash快了近千倍;读取时,由于nandflah要先向芯片发送地址信息进行寻址才能开始读写数据,而它的地址信息包括块号,块内页号和页内字节号等部分,需要顺序选择才能定位到要操作的字符,这样每进行一次数据访问要进行三次寻址,至少要三个时钟周期;而norflah操作是以字或字节为单位进行的直接读取,所以读取数据时,norflash有优势。
27NANDFLASH内部结构由粗到细依次分为器件(device),目标(target),单元(unit),块(block),分页(page)以及扇区(sector)。
器件是指NANDFLASH本身,一个器件由一个或多个目标构成。
而各个目标是否工作是由CE(chipenable)信号来控制,同一时刻只有一个目标处于工作状态。
一个目标又分为一个或多个逻辑单元。
逻辑逻辑单元是独立地执行命令和报告状态的最小单位。
原则上NANDFLASH支持多逻辑单元操作。
每个逻辑单元都包含至少一个分页寄存器和一个存储阵列。
分页寄存器用于暂存由外部读入
NANDFLASH的数据以及由NANDFLASH读出的数据。
存储阵列由许多分块组成。
一个分块是逻辑单元中进行擦除操作的最小单位。
一个分块又包含若干个分页,对于支持约束性连续分页操作的器件来说,分页是最小的可寻址操作单位。
一个分块所包含的分页数规定为32的倍数。
最后为了与其他存储器件的统一并且满足分页在字节数上的要求,引进了扇区这个单位。
一个扇区仍然是512个字节,由于NANDFLASH寻址及工作原理的特殊性,在每个512字节的扇区后会有一个16个字节的备注区域。
在这个备注区域中不存放用户数据,而是存放了与地址转换、ECC校验、坏块标记/判断等有关的信息。
可以看到只含有一个目标的NANDFLASH和含有多个目标的NANDFLASH的差别只是在CE这个控制信号上,除此之外工作原理是一样的。
28STD_ULOGIC和STD_ULOGIC_VECTOR比STD_LOGIC类型多引入了一个逻辑值’U’,代表初始不定值。
但没有指定两个STD_ULOGIC信号连接到同一个节点上发生冲突后的逻辑值,因此要避免两个输出信号直接进行连接的情况。
29信号声明语法格式如下:
Signal<信号名>:
数据类型【约束条件】【:
=表达式】;
已声明的信号用“<=”延时赋值符号为其代入新的值。
:
=(立即赋值符号,没有延迟)
30Buf_num*2<=buf_num(1downto0)&’0’
Buf_num*2取的num的偶数值
31infor_we_0:
out_std_logic_vector(1downto0)
Infor_we_0(0),infor_we_0
(1)代表一位(bit)值。