LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY half_adder IS
GENERIC(tpd:TIME:=10 ns);
PORT(in1, in2: IN STD_LOGIC
sum, carry: OUT STD_LOGIC)
END half_adder
ARCHITECTURE behavioral OF half_adder IS
BEGIN
PROSESS (in1, in2)
BEGIN
sum <= in1 XOR in2 AFTER tpd
carry <= in1 AND in2 AFTER tpd
END PROCESS
END behavioral - -半加器设计完毕
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY or_gate IS
GENERIC(tpd:TIME:=10 ns);
PORT(in1, in2: IN STD_LOGIC
out1: OUT STD_LOGIC)
END or_gate
ARCHITECTURE structural OF or_gate IS
BEGIN
out1 <= in1 OR in2 AFTER tpd
END structural- - 或门设计完毕
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY full_adder IS
GENERIC(tpd:TIME:=10 ns);
PORT(x,y,c_in: IN STD_LOGIC
Sum, c_out: OUT STD_LOGIC)
END full_adder
ARCHITECTURE structural OF full_adder IS
COMPONENT half_adder
PORT(in1, in2: IN STD_LOGIC
sum, carry: OUT STD_LOGIC)
END COMPONENT
COMPONENT or_gate
PORT(in1, in2: IN STD_LOGIC
out1: OUT STD_LOGIC)
END COMPONENT
SIGNAL a, b, c:STD_LOGIC
FOR u1,u2 : half_adder USE ENTITY WORK.half_adder (behavioral)
FOR u3: or_gate USE ENTITY WORK. or_gate (structural)
BEGIN
u1: half_adder PORT MAP (x, y, b, a)
u2: half_adder PORT MAP (c_in, b, sum, c)
u3: or_gate PORT MAP (c, a, c_out)
END structural
1、设计原理电路结构图或原理图
电路功能描述
定义了8位二进制全加器顶层设计元件端口信号,输入端口:AIN, BIN,是八个二进制数,数据类型被定义为STD_LOGIC_VECTOR。 CIN是输入的进位,数据类型IN STD_LOGIC;输出端口:SUM为和,数据类型IN STD_LOGIC COUT为输出的进位。 定义了7个信号C1, C2, C3,C4,C5,C6,C7作为器件内部的连接线,采用映射语句port map()将8个一位二进制全加器连接起来构成一个完整的全加器。低位全加器进位输出端连到高一位全加器的进位输入端,任何一位的加法运算必须等到低位加法完成时才能进行,这种进位方式称为串行进位
2、实验程序
程序1:半加器描述
功 能:程序功能简介
VHDL源程序代码
LIBRARY IEEE
USE IEEE.STD_LOGIC_1164.ALL
ENTITY H_ADDER IS
PORT (A, B : IN STD_LOGIC
CO, SO : OUT STD_LOGIC )
END ENTITY H_ADDER
ARCHITECTURE FH1 OF H_ADDER IS
BEGIN
SO <= NOT (A XOR (NOT B))
CO <= A AND B
END ARCHITECTURE FH1
程序2:一位二进制全加器设计顶层描述
功能:程序功能简介
VHDL源程序代码
LIBRARY IEEE
USE IEEE.STD_LOGIC_1164.ALL
ENTITY F_ADDER IS
PORT (AIN, BIN, CIN : IN STD_LOGIC
COUT, SUM : OUT STD_LOGIC )
END ENTITY F_ADDER
ARCHITECTURE FD1 OF F_ADDER IS
COMPONENT H_ADDER IS
PORT (A, B : IN STD_LOGIC
CO, SO : OUT STD_LOGIC )
END COMPONENT
SIGNAL D, E, F : STD_LOGIC
BEGIN
U1 : H_ADDER PORT MAP(A =>AIN, B =>BIN, CO =>D, SO =>E)
U2 : H_ADDER PORT MAP(A =>E, B =>CIN, CO =>F, SO =>SUM)
COUT <= D OR F
END ARCHITECTURE FD1
程序3:8位并行二进制全加器顶层文件
功能:程序功能简介
VHDL源程序代码
LIBRARY IEEE
USE IEEE.STD_LOGIC_1164.ALL
ENTITY F_ADDER8 IS
PORT ( AIN, BIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0)
CIN : IN STD_LOGIC
SUM : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
COUT : OUT STD_LOGIC )
END F_ADDER8
ARCHITECTURE ONE OF F_ADDER8 IS
COMPONENT F_ADDER IS
PORT (AIN, BIN, CIN : IN STD_LOGIC
COUT, SUM : OUT STD_LOGIC )
END COMPONENT
SIGNAL C1, C2, C3,C4,C5,C6,C7: STD_LOGIC
BEGIN
U1 : F_ADDER PORT MAP(AIN =>AIN(0), BIN =>BIN(0), CIN =>CIN, SUM =>SUM(0), COUT =>C1)
U2 : F_ADDER PORT MAP(AIN =>AIN(1), BIN =>BIN(1), CIN =>C1, SUM =>SUM(1), COUT =>C2)
U3 : F_ADDER PORT MAP(AIN =>AIN(2), BIN =>BIN(2), CIN =>C2, SUM =>SUM(2), COUT =>C3)
U4 : F_ADDER PORT MAP(AIN =>AIN(3), BIN =>BIN(3), CIN =>C3, SUM =>SUM(3), COUT =>C4)
U5 : F_ADDER PORT MAP(AIN =>AIN(4), BIN =>BIN(4), CIN =>C4, SUM =>SUM(4), COUT =>C5)
U6 : F_ADDER PORT MAP(AIN =>AIN(5), BIN =>BIN(5), CIN =>C5, SUM =>SUM(5), COUT =>C6)
U7 : F_ADDER PORT MAP(AIN =>AIN(6), BIN =>BIN(6), CIN =>C6, SUM =>SUM(6), COUT =>C7)
U8 : F_ADDER PORT MAP(AIN =>AIN(7), BIN =>BIN(7), CIN =>C7, SUM =>SUM(7), COUT =>COUT)
END ONE
写好后存盘一 将设计项目设置成工程文件(PROJECT)
为了对输入的设计项目进行各项处理,必须将设计文件,设置成Project。如果设计项目由多个设计文件组成,则应该将它们的主文件,即顶层文件设置成Project。如果要对其中某一底层文件进行单独编译、仿真和测试,也必须首先将其设置成Projcet。即需要对哪个设计项目进行编译、仿真等 *** 作时,就设定哪个项目为工程。
将设计项目(如h_adder.gdf)设定为工程文件,有两个途径:
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_adder.scf),所以直接存盘即可。
7、运行仿真器。执行菜单MAX+plusII →Simulator选项,点击跳出的仿真器窗口(图10)中的Start键。图11是仿真运算完成后的时序波形。如果没有变化,看看是否因为显示比例太大,点击图9的放大按钮或显示全部按钮。
图10 仿真器窗口
图11 半加器仿真波形
上图的Value栏的数值,代表竖线处(83.0ns)各个信号的电平。
8、观察分析波形。很明显,图11显示的半加器的时序波形是正确的。还可以进一步了解信号的延时情况。图11的竖线是测试参考线,它上方(与Ref数据框处相同)标出的83.0ns是此线所在的位置;鼠标箭头(该线右侧‘+’处)所在处时间显示在Time数据框里,为93.0ns;二者的时间差显示在窗口上方的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_adder.gdf,执行菜单File → Create Default Symbol项,此时即将当前文件变成了一个包装好的单一元件h_adder.sym,并被放置在工程路径指定的目录(e:\MYNAME\shiyan_1)中,以备后用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)