Quartus II入门详细教程实例讲解写在前面:1.本教程适合以前没有接触过QuartusII开发软件的新手,本教程是基础的入门,后续的学习还得大家自己努力。
2.本教程非常详细手把手带大家入门,网上现存的很多教程,有的过于跳跃,难以跟上;有的遇到错误,但教程没有指出,导致我们不知道怎么做。
3.本教程首先通过简单的仿真实验带大家入门。
VHDL源代码会附在文档最后。
4.本教程使用Quartus II 9.1版本进行演示,其他版本的操作差别不是太大,也可以进行学习。
目录一、Quartus II开发软件基本介绍1.1 Quartus Ⅱ简介Quartus Ⅱ是Altera公司推出的专业EDA工具,支持原理图输入、硬件描述语言的输入等多种输入方式。
硬件描述语言的输入方式是利用类似高级程序的设计方法来设计出数字系统。
1.2 Quartus Ⅱ开发流程使用Quartus II 软件进行开发的流程如图1.2.1所示。
需注意的是,Quartus II还可以使用命令行模式的TCL批处理脚本进行自动流程控制。
图1.2.1 Quartus Ⅱ开发流程二、用3-8译码器的设计介绍QuartusⅡ的基本使用方法(VHDL仿真)1.1打开软件双击桌面安装好的QuartusⅡ 9.1图标,打开软件,主页面如图1所示。
图1在图1中,1区为菜单栏:软件所有功能的控制选项都可以在其下拉菜单中找到。
2区为快捷工具栏:提供设置(setting),编译(compile)等快捷方式,方便用户使用,用户也可以在菜单栏的下拉菜单找到相应的选项。
3区为资源管理窗口。
4区为编译及综合的进度栏:编译和综合的时候该窗口可以显示进度,当显示100%是表示编译或者综合通过。
5区为工作区。
6区为信息栏:编译或者综合整个过程的详细信息显示窗口,包括编译通过信息和报错信息。
2.2新建工程运行菜单命令“File->New Project Wizard”,打开新工程向导,首先出现如图2所示的工程向导介绍对话框。
点击Next按钮,进入如图3所示的下一设置页面,在其中设置工程目录、工程名称、顶层设计实体名称。
工程目录点击选择我们提前在D盘altera文件中的SCU文件夹,工程名称为liuzhen,顶层设计实体名称自动与工程名称相同。
图2 工程向导介绍图3 工程设置点击Next按钮,进入如图4所示的对话框,在其中可以添加已存在的文件至工程和设定库的路径,我们在此可跳过。
接着出现如图5所示的目标器件系列和具体芯片型号的设置对话框,如图5所示,用户可根据实际所使用的目标芯片和QuartusII的支持情况具体进行设置,当QuartusII不能支持时,则需要更换目标芯片或开发工具(MAX+ plus II)。
因为本次测试只进行设计和软件仿真,不进行硬件仿真,故任意选择。
点击“Next”进入下一步设置,选择仿真,综合工具本次实验全部利用quartus做,三项都选None,如图6所示。
然后next,最后将给出一个工程信息摘要,如图7所示,点击Finish按钮,完成工程建立并退出向导过程。
图4 添加文件至工程图5器件系列和目标芯片设置图6选择仿真,综合工具图7工程信息摘要2.3 创建VHDL文件,编写程序运行菜单命令“File->New”,如图8所示,点击“VHDL File”,然后点击OK。
图8 图93-8译码器的VHDL描述源文件如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY decoder_38 isport( a: in std_logic_vector(2 downto 0);b: out std_logic_vector(7 downto 0));end decoder_38;architecture Behavioral of decoder_38 isbeginprocess(a)begincase a iswhen "000"=> b <="11111110";when "001"=> b <="11111101";when "010"=> b <="11111011";when "011"=> b <="11110111";when "100"=> b <="11101111";when "101"=> b <="11011111";when "110"=> b <="10111111";when "111"=> b <="01111111";when others=> b <="11111111";end case;end process;end Behavioral;把程序写在图9所示VHDL文件中,接着按Ctrl+S 保存,文件保存在我们的工程文件夹SCU中,文件名为decoder_38.vhd,勾选Add file to current project。
如图10。
图102.4检查语法点击工具栏的这个按钮(start Analysis & synthesis),出现如图11所示错误:“Error: Top-level design entity "liuzhen" is undefined”。
图11出现这个错误的原因是保存的文件名和结构体名字不一致,在quartus软件中要求这样做,不然就出错。
解决方法是点击工程里的文件本身,然后右键单击后点击“Set as Top-Level Entity”,如图12所示。
图12 Set as Top-Level Entity再次点击工具栏的这个按钮,我们可以看见,已经没有错误了,如图13所示。
图13然后点击工具栏的这个按钮,进行整体编译。
[在执行本步以后,若要进行硬件仿真,需要锁定引脚,锁定引脚步骤在后面的注意处会介绍,若只是进行软件仿真则直接跳过锁定引脚这步]2.5功能仿真把仿真类型设置为功能仿真(Assignments->setting 单击->Simulator Settings 点击 ->下拉Simulation mode >Functional),如图14所示。
其中Functional表示功能仿真,既不包括时序信息,timinng表示时序仿真,加入线及寄存器的延时信息。
图14然后建立一个波形文件:(File->new->Vector Waveform File)。
添加波形文件作为信号输出文件,以便观察信号的输出情况.如图15所示。
图15然后导入引脚,双击如图16所示Name下面空白区域,接着点击如图17所示Node Finder,然后先点击图18中的list再点击,再点击OK即可。
图16 图17图18接着设置激励信号,单击,再点击,如图19所示。
再点击Timing,再Multiplied by 1,如图20所示。
设置a[1]信号源的时候类同设置a[0]信号源,最后一步改为Multiplied by 2;设置a[2]信号源的时候类同设置a[0]信号源,最后一步改为Multiplied by 3。
图19 图20图21图21中红框内为我们自定义的输入信号。
接着生成仿真需要的网表(工具栏processing->Generate Functional Simulation Netlist)。
弹出如图22所示,点击“是”进行保存,我们保存为liuzhen.vwf,如图23,再点击保存跳出图24表示成功。
图22 图23图24接下来开始仿真,点击工具栏开始仿真,结果如图25所示。
图25 仿真结果观察波形,3-8译码器产生的结果刚好符合我们的理论。
因此该功能仿真通过,本次仿真正确。
注意:1.在检查语法后,功能仿真前若需要下载到硬件进行仿真,要进行锁定引脚操作,下面大概介绍一下,因为一般新手刚入门还不需要进行硬件仿真。
点击工具栏的(pin planner),然后点击跳出来界面(图26)的 view-> ALL PIN LIST,接着根据实际选用的芯片的输入输出配置引脚,填写图27。
这里在创建工程的时候,在器件系列和目标芯片设置处要对应选自己的芯片型号。
图26图272.若需要下载到硬件进行仿真,最后一步还需要进行下载。
下载点击(Programmer),再点击Hardware Setup配置下载电缆,单击弹出窗口的“Add Hardware”按钮,选择并口下载ByteBlasterMV or ByteBlasterMVⅡ,单击“Close”按钮完成设置。
CPLD器件生成的下载文件后缀名为.pof,点击下图所示方框,选中下载文件,然后直接点击start按钮开始下载三、用原理图进行仿真(用与门作为例子进行仿真)3.1新建工程请参考上一种方法,此处不赘述。
为了不出错,请重新建一个工程,不要用第一种方法的工程。
3.2新建原理图文件(File->new->Block Diagram/Schematic File)图3.2.1 图3.2.2接着选择对应原器件放置并连接好,首先点击Symbol Tool(图3.2.2所示),然后再Library里面选择我们要用的器件,我们这里用的是and2,如图3.2.3,点击OK,接着再点击,同样的方法选出2个输入和1个输出,如图3.2.4所示。
图3.2.3 图3.2.4然后把对应的引脚连接起来,同时可以点击pin_name对引脚进行改名。
连接好的原理图如图3.2.5所示。
图3.2.5接着按Ctrl+S 进行保存,我们把名字改为and_2.bdf,如图3.2.6。
图3.2.6接下来就是进行仿真,其步骤和我们VHDL方法中的2.5是类似的,请阅读2.5步骤。
最后我们会发现结果是正确的。
用原理图的方法就讲到这里。
四、VHDL源程序附录4.1 3-8译码器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY decoder_38 isport( a: in std_logic_vector(2 downto 0);b: out std_logic_vector(7 downto 0));end decoder_38;architecture Behavioral of decoder_38 isbeginprocess(a)begincase a iswhen "000"=> b <="11111110";when "001"=> b <="11111101";when "010"=> b <="11111011";when "011"=> b <="11110111";when "100"=> b <="11101111";when "101"=> b <="11011111";when "110"=> b <="10111111";when "111"=> b <="01111111";when others=> b <="11111111";end case;end process;end Behavioral;4.2 二输入与门LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY and2 ISPORT(a,b:IN STD_LOGIC;c:OUT STD_LOGIC);END and2;ARCHITECTURE and2_behavior OF and2 ISBEGINc<= a AND b;END and2_behavior;4.3二输入或门LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY or2 ISPORT(a,b:IN STD_LOGIC;c:OUT STD_LOGIC);END or2;ARCHITECTURE or2_behavior OF or2 ISBEGINc<=a OR b;END or2_behavior;4.4非门LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY not_gate ISPORT(a:IN STD_LOGIC;f:OUT STD_LOGIC);END not_gate;ARCHITECTURE not_gate_behavior OF not_gate ISBEGINf<= NOT a;END not_gate_behavior;4.5一位半加器LIBRARY IEEE;LIBRARY IEEE.STD_LOGIC_1164.ALL;ENTITY half_add_1 ISPORT(a:IN STD_LOGIC;b:IN STD_LOGIC;co:OUT STD_LOGIC;s:OUT STD_LOGIC);END half_add_1;ARCHITECTURE half_add_1_behavior OF half_add_1 ISBEGINco<= a AND b;s<= a XOR b;END half_add_1_behavior;。