VHDL的信号声明(也可以叫定义)语句放在结构体的首部,即ARCHITECTURE IS与BEGIN之间,而变量声明则放在进程的首部,PROCESS与BEGIN之间,如果是在子程序(过程或者函数)中声明变量,则放在子程序的首部,即子程序的BEGIN之前。
library ieee; --库说明
use ieeestd_logic_1164all;--前面这几行,是用的package 即数据库
use ieeestd_logic_unsignedall;--
use ieeestd_logic_arithall;--
entity fenx is --实体说明,fenx 实体名
port --端口
(clk:in std_logic;--clk为端口名,in 为端口类型,这里是输入,std_logic指的是标准逻辑数据类型。
qout:out std_logic--类似于上边
);
end fenx;--结束实体
architecture behave of fenx is-- 结构体 behave 为结构体名,fenx 为上边的实体名。
constant counter_len:integer:=1999999;--结构体说明部分,这里定义了一个常数,常数名为counter_len,将1999999赋给了这个常数。
begin
process(clk)--开始进程
variable cnt:integer range 0 to counter_len;--定义了一个变量,范围为0-1999999
begin
if clk'event and clk='1' then --在当前一个相当小的时间间隔内,事件发生了,并且clk为逻辑值1,然后执行下边的语句
if cnt=counter_len then --再如果,cnt这个变量的值等于定的那个常数counter_len, 则,把0赋给cnt
cnt:=0;
else
cnt:=cnt+1; --否刚,让cnt加1;
end if; --结束if语句
case cnt is --case 语句
when 0 to counter_len/2=>qout<='0';--若case 的值为0到counter_len 的一半,刚执行,把0赋给qout;
when others =>qout<='1';--其它,刚把1赋给qout;
end case; --结束case语句;
end if; --与第一个if对应,结束if 语句;
end process; --结束process 进程;
end behave; --结束behave 结构体。
晚上做的,不会我们再交流。
因为bit类型支持在表达式中直接出现连接运算符&,而std_logic类型则不支持,需要通过一个中间信号转接一下。
比如先将'0'&temp_node2(2)&temp_node2(1)&'0'赋值给一个中间信号t,然后在元件例化语句中将Ain关联到这个中间信号t:Ain=>t。
VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体分成外部和内部,既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
扩展资料:
与其他硬件描述语言相比,VHDL具有以下特点:
功能强大、设计灵活:
VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。
VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言所不能比拟的。VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。
支持广泛、易于修改:
由于VHDL已经成为IEEE标准所规范的硬件描述语言,大多数EDA工具几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了基础。在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构化,所以易于修改设计。
参考资料来源:百度百科-vhdl
vhdl是不会运行的!它不同于C、C++等语言,它用于描述一个硬件结构,描述完之后,所生成的硬件就已经成型了,所以这个问题相当于你在问“硬件是怎样运行的?”一样,记住,vhdl是硬件“描述”语言!
写好后存盘
一 将设计项目设置成工程文件(PROJECT)
为了对输入的设计项目进行各项处理,必须将设计文件,设置成Project。如果设计项目由多个设计文件组成,则应该将它们的主文件,即顶层文件设置成Project。如果要对其中某一底层文件进行单独编译、仿真和测试,也必须首先将其设置成Projcet。即需要对哪个设计项目进行编译、仿真等 *** 作时,就设定哪个项目为工程。
将设计项目(如h_addergdf)设定为工程文件,有两个途径:
1、执行菜单File Project Set Project to Current File,即将当前设计文件设置成Project。选择此项后可以看到菜单上面的标题栏显示出所设文件的路径。(前一部分是目前编译器所指向的工程文件名称)。这点特别重要,此后的设计应该特别关注此路径的指向是否正确!如果已经指向待编译的文件,就不必再次设置为工程。
2、如果设计文件未打开,执行菜单File Project Name,然后在跳出的Project Name窗中找到文件夹及文件名,此时即选定此文件为本次设计的工程文件了。
步骤4:选择目标器件并编译
在对文件编译前必须选定最后实现本设计项目的目标器件,执行菜单AssignDevice,d出Device窗口。此窗口的Device Family是器件序列栏,应该首先在此拦中选定目标器件对应的序列名,如EPM7128S对应的是MAX7000S系列、EPF10K10对应的是FLEX10K、EP1K30对应的是ACEXlK系列等。为了选择EPF10K10LC84-4器件,应将此栏下方标有Show only Fastest Speed Grades的勾消去,以便显示出所有速度级别的器件。完成器件选择后,按OK键。
启动编译器。首先选择左上角菜单的MAX+plusII选项,在其下拉菜单中选择编译器项Compiler,此编译器的功能包括网表文件提取、设计文件排错、逻辑综合、逻辑分配、适配(结构综合)、时序仿真文件提取和编程下载文件装配等。如图5所示。
点击Start,开始编译!如果发现有错,一般情况下,会告诉用户错误的位置和情况,双击编译信息(Messages -Compiler)窗错误信息条,会直接跳到错误位置,排除错误后再次编译。
说明:错误位置是用元件左下部的浅色数字显示的,该数字是用户在Enter Symbol的时候自动顺序编号的。
图5 编译窗口
图5编译窗各功能项目块含义如下:
• Compiler Netlist Extractor :编译器网表文件提取器,该功能块将输入的原理图文件或HDL文本文件转化成网表文件并检查其中可能的错误。该模块还负责连接顶层设计中的多层次设计文件;此外还包含一个内置的,用于接受外部标准网表文件的阅读器。
• Database Builder :基本编译文件建立器,该功能块将含有任何层次的设计网表文件转化成一个单一层次的网表文件,以便进行逻辑综合。
• Logic Synthesizer :逻辑综合器,对设计项目进行逻辑化简、逻辑优化和检查逻辑错误。综合后输出的网表文件表达了设计项目中底层逻辑元件最基本的连接方式和逻辑关系。逻辑综合器的工作方式和优化方案可以通过一些选项来实现。
• Partitioner :逻辑分割器,如果选定的目标器件逻辑资源过小,而设计项目较大,该分割器则自动将设计项目进行分割,使得它们能够实现在多个选定的器件中。
• Fitter :适配器,适配器也称结构综合器或布线布局器。它将逻辑综合所得的网表文件,即底层逻辑元件的基本连接关系,在选定的目标器件中具体实现。对于布线布局的策略和优化方式也可以通过设置一些选项来改变和实现。
• Timing SNF Extractor :时序仿真网表文件提取器,该功能块从适配器输出的文件中提取时序仿真网表文件,留待对设计项目进行仿真测试用。对于大的设计项目一般先进行功能仿真,方法是在Compiler窗口下选择Processing项中的Functional SNF Extractor功能仿真网表文件提取器选项。
• Assembler :装配器,该功能块将适配器输出的文件,根据不同的目标器件,不同的配置ROM产生多种格式的编程/配置文件,如用于CPLD或配置ROM用的POF编程文件(编程目标文件);用于对FPGA直接配置的SOF文件(SRAM目标文件);可用于单片机对FPGA配置的Hex文件,以及其它TTFs、Jam、JBC和JEDEC文件等。
步骤5:时序仿真
接下来应该测试设计项目的正确性,即逻辑仿真,简单的说仿真就是人为模拟输入信号,观察输出信号的变化,判断是否合乎预计的设计要求。具体步骤如下:
1、建立波形文件。按照以上“步骤2”,为此设计建立一个波形测试文件。选择File项及其New,再选择图1下侧New窗中的Waveform Editer项,打开波形编辑窗。如图6所示。
图6 波形编辑窗口
2、输入信号节点。执行菜单Node → Enter Nodes from SNF。在d出的窗口(图7)中首先点击List键,这时左窗口将列出该项设计所有信号节点。由于设计者有时只需要观察其中部分信号的波形,因此要利用中间的“=>”键将需要观察的信号选到右栏中,然后点击OK键即可。波形编辑窗口变成图8所示。
图7 列出并选择需要观察的信号节点
3、设置波形参量。图8所示的波形编辑窗中已经调入了半加器的所有节点信号,在为编辑窗的半加器输入信号a和b设定必要的测试电平之前,首先设定相关的仿真参数。如图8所示, 在Options选项中消去网格对齐Snap to Grid的选择(消去勾),以便能够任意设置输入电平位置,或设置输入时钟信号的周期。这点切记
图8 调入所有节点后的图形编辑窗口
4、设定仿真时间宽度。执行菜单File→End Time选项,在End time选择窗中选择适当的仿真时间域,如可选3s(3微秒),以便有足够长的观察时间,但是不要设定时间太长,否则,仿真工作量大,占用的机时太长。软件默认仿真时间为1s。
5、设定输入信号。现在可以为输入信号a和b设定测试电平了。如图9标出的那样,利用必要的功能键为a和b加上适当的电平,以便仿真后能测试so和co输出信号。如果需要对输入信号a在某段时间间隔内赋值,在该信号的该段时间起点拖动鼠标,移动到该段时间终点,使之变成黑色,然后点击左侧工具箱中的相应赋值按键。如果对信号从头至尾(End Time)赋值,只需用鼠标在左部的Name区点击相应的位置,该信号会全部变黑,表示全选。
图9 设定输入信号的测试电平
赋值取反:就是对“黑色”时间段的信号取反码,如:0→1、1→0、B9→46
6、波形文件存盘。执行菜单File →Save,按OK键即可。由于存盘窗中的波形文件名是默认的(这里是h_adderscf),所以直接存盘即可。
7、运行仿真器。执行菜单MAX+plusII →Simulator选项,点击跳出的仿真器窗口(图10)中的Start键。图11是仿真运算完成后的时序波形。如果没有变化,看看是否因为显示比例太大,点击图9的放大按钮或显示全部按钮。
图10 仿真器窗口
图11 半加器仿真波形
上图的Value栏的数值,代表竖线处(830ns)各个信号的电平。
8、观察分析波形。很明显,图11显示的半加器的时序波形是正确的。还可以进一步了解信号的延时情况。图11的竖线是测试参考线,它上方(与Ref数据框处相同)标出的830ns是此线所在的位置;鼠标箭头(该线右侧‘+’处)所在处时间显示在Time数据框里,为930ns;二者的时间差显示在窗口上方的Interval小窗中。由图可见输入与输出波形间有一个小的延时量10ns。
有时,为了观察方便需要将某些信号作为一组来观测。步骤:
①. 鼠标在Name区选择co使之全部变黑,按住ALT键,向下拖动鼠标,复制一个co,或者全黑后,右键→Copy,在其它空白区域再右键→Paste;然后再复制一个so;或者菜单Node → Enter Nodes from SNF,再加上一个co和so。建议co在so的上面,且二者相邻。
②. 将鼠标移动到Name的co上(不要在带红线的“信号性质说明”上),按下鼠标左键并向下拖动鼠标至so,松开后鼠标左键,可选中信号co、so
③. 在选中区域(黑色)上,点击鼠标右键,在浮动菜单上选择Enter Group或直接执行菜单Node → Enter Group,出现如图12所示的设置组对话框
图12 设置组对话框
④. 选择合适进制后,选择OK,可得到如图13所示的波形图。
图13 组显示结果(10进制)
说明:在以后的仿真时,对于多位的数据,双击Value区,也可以改变数据的显示格式,可以直观显示。步骤①不一定是必须的。但是Group的高位是所选数据的最上面的那个,低位是所选数据的最下面的那个。输入数据也可以编组,有时在信号赋值时比较方便。
9、为了精确测量半加器输入与输出波形间的延时量,可打开时序分析器,方法是选择左上角的MAX+plusII项及其中的Timing Analyzer选项,点击跳出的分析器窗口(图14)中的Start键,延时信息即刻显示在图表中。其中左排的列表是输入信号,上排列出输出信号,中间是对应的延时量,这个延时量是精确针对EPF10K10LC84-4器件的。
图14 延时分析结果
10、包装元件入库。重新回到半加器设计文件h_addergdf,执行菜单File → Create Default Symbol项,此时即将当前文件变成了一个包装好的单一元件h_addersym,并被放置在工程路径指定的目录(e:\MYNAME\shiyan_1)中,以备后用。
以上就是关于vHDL语言中,变量定义和信号定义的位置是在结构体特定位置还是结构体任意位置全部的内容,包括:vHDL语言中,变量定义和信号定义的位置是在结构体特定位置还是结构体任意位置、哪位好心人帮我解释下VHDL程序fen100 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_、VHDL代码出现near text "=>"; expecting ")", or ","错误,调用了库文件还是出同样错误,求大神指点!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)