VHDL语言学习总结_第1页
VHDL语言学习总结_第2页
VHDL语言学习总结_第3页
VHDL语言学习总结_第4页
VHDL语言学习总结_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、VHDL 语言学习总结(初学VHDL ,欢迎批评指正)1 VHDL的程序结构一个VHDL 程序包含实体entity 、结构体architecture 、配置configuration 、包集package 和库library 五部分。实体,用于描述设计系统的外部接口信号;结构体,用于描述系统的行为,系统数据的流程或系统组织结构形式;实体结构体设计实体;实体是设计实体的表层设计单元,其功能是对这个设计实体与外部的电路接口进行描述,它规定了设计单元的输入、输出接口信号和引脚,是设计实体与外界的一个通信界面; 结构体是用于描述设计实体的内部结构以及实体端口间的逻辑关系,结构体具体实现一个实体。一个电

2、路系统的程序设计只有一个实体,可以有多个结构体。在实体中类属说明放在端口说明上端,而其他说明类型说明如数据的定义说明则放在端口定义的下面。配置一般用来为实体指定结构体,由于在设计中没有用到配置,故没有做深入研究。 包集是库的一部分,用来存放库中具有类似功能或在某一个部件中使用的元件、函数或过程。库是一个设计中封装所有元器件的总和。2 VHDL与C+的结构类比上述部分可以和C+的工程管理方式做一简单比较。C+中有类的声明部分(一般为.H 文件)和实现部分(一般为.CPP 文件)。在程序的编写过程中,我们首先在一个.H 文件中将类的成员变量和成员函数做定义,然后在.CPP 中使用具体的代码实现它。

3、这样在应用这个类的其他程序代码中,一般在引用文件的开始加入如下语句:#include “*.h” /*代表我们要包含的文件名称就可以随意使用其内部的类和函数了。VHDL 有类似之处。首先我们编写了*.VHD文件,内有实体entity 和结构体architecture ,开始还要引入库library 和包package 。在我们使用其他元件时,通常在architecture 中做元件例化。例如要在myexp 中例化元件myand ,则:Architecture behave of myexp isSignal mysig1 : bit_vector(7 downto 0;component my

4、andport( din1: in bit;din2: in bit;dout:out bit;end component;beginp1: myand port map(din1,din2,dout;end behave;实际上元件例化就是对元件的包含,相当于在C+中#include的功能。有时不在myexp 中做元件例化,但还是要引用这些软件,就用到库和包的概念了。 在工程中建立一个vhd 文件,如mylib.vhd ,在里面定义包mypkg ,包内包含元件例化语句。具体如下:package mypkg iscomponent mycomp1port(;end component;comp

5、onent mycomp2port(;end component;end mypkg;需要指出的是,元件mycomp1和mycomp2的设计实体必须在当前工程下。然后在myexp.vhd 中加入:library mylib;就不必在architecture 中做元件例化说明了,直接做端口映射就可以了。因此上面的两句语句就等同于C+中的头文件引用#include了。如果编程者熟悉C+,则使用上述的类比,就对一般的FPGA 开发软件环境有清楚了了解了,实际上QuartusII 和ISE 与Visual Studio是何等的类似啊!3 结构体的三种描述方法行为描述:对设计实体按算法的路径来描述,行为

6、描述在EDA 工程中称为高级描述; 数据流描述:描述数据流程的运动路径,运动方向和运动结果等。数据流描述一般为并行语句,顺序语句不可以作数据流描述,但数据流描述不能实现同步的功能。结构化描述:对于一个负责的电子系统可以分解为诸多子系统,每个子系统再分解为模块。在多层次设计中,每个层次都可以作为一个元件,再构成一个模块,进而构成子系统,最后构成一个大的系统。每个元件可以分别作功能、时序仿真,然后再进行整体调试。 4 关于进程process在进程process 中的敏感表中,其信号必须为输入,这些信号无论哪个发生变化都将启动进程process ,进程一旦启动,其中的代码将从上至下顺序执行一遍。多个

7、进程并行执行,只要敏感信号发生变化,进程就会并行触发。在一个进程中,一般使用一个ifend if;注意,这里的if 是一个整体,内部当然还可以套用其他的ifend if;但是所有的if 语句必须是一体的(或顺序的),不能是并行的。例如不能是如下格式:process(if a=b thenc<=d;end if;if a=4 thenc<=d+1;end if;end process;这一般是不允许的,容易出现多驱动源的情况。注意,条件信号赋值语句不能进行嵌套,不能将目标值代入目标自身,所以不能使用条件赋值语句设计锁存器。5 关于BLOCK用VHDL 中的BLOCK 模块对程序进行仿

8、真时,用BLOCK 模块所描述的各个语句是并行执行的,与模块中的语句书写顺序无关。6 关于过程Procedure在过程语句中,参数可以是输入,也可以是输出,一般in 做常数处理,out 和inout 作为变量拷贝。当过程语句在主程中调用结束后,将变量out 和inout 拷贝到调用者的信号和变量中。在过程调用时,若调用者需要将out 和inout 作为信号使用时,需要用定义语句特别指明。这里过程类似于C+中函数使用指针传递的形参。7 关于函数function一般地,function 的各种功能函数都被集中在包集合package 中。8 关于信号的驱动源狭义定义:在时间域内,给某个信号赋值的序列

9、,都称为该信号的驱动源。一个进程只能为某个信号建立一个驱动源,而不论赋值多少次。下面是错误的驱动源程序:library ieee;entity mux isport(i0,i1,i2,i3,a,b: in bit;q: out bit;end mux;architecture behave of mux isbeginq<=i0 when a=0 and b=0 else 0;q<=i1 when a=0 and b=1 else 0;q<=i2 when a=1 and b=0 else 0;q<=i3 when a=1 and b=1 else 0;end beha

10、ve;该程序的错误之处在于:若a=0&b=0成立,则q<=i0;但同时a=0&b=1不成立,则q<=0;a=1&b=0不成立,则q<=0;a=1&b=1不成立,则q<=0;若i01,则由第一个条件的q<=1,而第二、三、四个条件则q<=0,出现结果的多样化,这就是驱动源不唯一,因此是错误的。正确的设计如下:architecture behave of mux isbeginq<=i0 when a=0 and b=0 elsei1 when a=0 and b=1 elsei2 when a=1 and b=0 else

11、i3 when a=1 and b=1 else0;end behave;总结出来的结论是,在所有的并行结构中,不能对信号在并行语句中进行二次赋值,因此应特别注意。有时钟信号给信号设定驱动源。在process 语句中要设定的敏感表即是该变化的信号,这样可以进行赋值(有些难陈述,可我也不知道如何更好将我的想法表达出来)。注意上述驱动源的定义是在某时间域内不可多重赋值,典型的如状态机。9 关于状态机单进程的状态机结构architecture behave of xxx istype state is(s0,s1,s2,s3;signal st : state;beginstctrl: proces

12、s(clk,clrbeginif clkevent and clk=1 thenif clr =1 thenst <= s0;elsecase st iswhen s0 => st <= s1;when s1 => st <= s2;when s2 => st <= s3;when s3 => st <= s0;when others => st <= s0;end case;end if;end if;end process;pout <= “00” when st = s0 else“01” when st = s1

13、else“10” when st = s2 else“11” when st = s3 else“XX”;end behave;典型的三进程状态机设计如下:architecture behave of xxx istype state is (s0,s1,s2,s3;signal val : integer range 0 to 3;signal currst,nextst : state;beginstxchg : process(clk, clrbeginif clkevent and clk=1 thenif clr = 1 thencurrst<=s0;elsecurrst &l

14、t;= nextst;end if;end if;end process stxchg;stdisc: process(currstbegincase currst iswhen s0 => nextst <= s1;when s1=> nextst <= s2;when s2=> nextst <= s3;when s3=> nextst <= s1;when others => nextst <= s0;end case;end process stdisc;stvalu: process(currstbegincase currst iswhen s0 => val <=0;when s1 => val <=1;when s2 => val <=3;when s3 => val <=4;end case;end process stvalu;pout <= CONV_STD_LOGIC_VECTOR(val,2;end behave;从上述可以看出,不在同一时间域内对同一信号赋值就可以避免多驱动源现象。 10 关于常量和

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论