还在为学习枯燥的VHDL而烦恼吗?为何不结合Quartus一起学习
![Rank: 6](images/default/star_level3.gif) ![Rank: 6](images/default/star_level2.gif)
- UID
- 856476
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
还在为学习枯燥的VHDL而烦恼吗?为何不结合Quartus一起学习
我们通过一个小小的例子来学习VHDL程序设计,同时温习Quartus II工程开发,一举两得。 这个小小的例子最小目标就是要告诉大家怎么使用IF-THEN语句,另一方面通过这个小小的实例告诉大家好的coding就是对设计最大的优化。
IF-THEN是VHDL中典型的行为描述(Behavioral Descriptions)语句,并在进程(Process)中按顺序执行。IF-THEN语句多级嵌套即IF-ELSIF则产生更为复杂的输出逻辑,这些输出又都是互斥关系。同时,IF-ELSIF还将会比IF-THEN使用更多的逻辑资源而且会使得布局布线更加困难。问题在于如何未使用ELSIF的情况下有条件地测试这些互斥信号呢?答案是使用IF-THEN语句。以下代码是我们的测试目标:
以下是代码片段:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY if_thn IS
PORT
(
current_state : IN std_logic_vector(8 DOWNTO 0);
x,y,z : IN std_logic;
state_out : OUT std_logic_vector(2 DOWNTO 0)
);
END if_thn;
ARCHITECTURE behavior OF if_thn IS
CONSTANT s0 : std_logic_vector(8 DOWNTO 0) := "000000000";
CONSTANT s1 : std_logic_vector(8 DOWNTO 0) := "100000001";
CONSTANT s2 : std_logic_vector(8 DOWNTO 0) := "100000010";
CONSTANT s3 : std_logic_vector(8 DOWNTO 0) := "100000100";
CONSTANT s4 : std_logic_vector(8 DOWNTO 0) := "100001000";
CONSTANT s5 : std_logic_vector(8 DOWNTO 0) := "100010000";
CONSTANT s6 : std_logic_vector(8 DOWNTO 0) := "100100000";
CONSTANT s7 : std_logic_vector(8 DOWNTO 0) := "101000000";
CONSTANT s8 : std_logic_vector(8 DOWNTO 0) := "110000000";
SIGNAL output1 : std_logic;
SIGNAL output2 : std_logic;
SIGNAL output3 : std_logic;
BEGIN
PROCESS(current_state,x,y,z)
BEGIN
IF (current_state = s1) OR (current_state = s3) OR (current_state = s4) THEN
output1 <= x;
ELSIF (current_state = s0) OR (current_state = s2) OR (current_state = s5) THEN
output2 <= y;
ELSIF (current_state = s6) OR (current_state = s7) OR (current_state = s8) THEN
output3 <= z;
ELSE
output1 <= '0';
output2 <= '0';
output3 <= '0';
END IF;
END PROCESS;
state_out <= output1 & output2 & output3;
END behavior;
|
下面我们创建一个新的Quartus II工程,打开Quaruts II软件,从File菜单选择New Project Wizard,如图1所示。
![](http://download.bbs.ednchina.com/images/attachments/201307/41415_TIME_1373343298555.jpg)
图1:新建Quartus II工程
第一步:设置工作路径,如图1所示,大家可以在自己的电脑上选择一个没有空格和中文字符的路径作为自己的工作路径。我们为这个新创建的工程命名为if_thn,软件自动为顶层设计实体命名为if_thn。点击Next进入下一步。
第二步:如图2所示,将上述代码保存到一个名为if_thn.vhd的文件里。器件家族选择Cyclone II,并将该源最好放到工作目录下,当然大家以后项目复杂以后可以专门建立一个存放源文件的目录,笔者喜欢在工程目录下创建一个src作为存放所有源文件的目录,创建一个debug目录用于存放虚拟JTAG调试工具以及调试数据的目录。闲话少说,浏览找到源文件,点击Add按钮将源文件加入到工程,点击Next进入下一步。
![](http://download.bbs.ednchina.com/images/attachments/201307/41415_TIME_1373343533452.jpg)
图2:给工程添加设计文件
第三步:如图3所示,器件型号选择笔者demo板上的EP2C5Q208C8,剩下的设置默认即可,点击Finish按钮完成Quartus II工程创建。
![](http://download.bbs.ednchina.com/images/attachments/201307/41415_TIME_1373343577902.jpg)
图3:为工程指定设计目标器件
在Quartus II菜单Process里的Start中选择综合命令,或者直接软件工具条中选择综合命令按钮 ![](http://download.bbs.ednchina.com/images/attachments/201307/41415_TIME_1373343697791.jpg)
对刚刚创建的工程进行综合。综合后可以在软件的编译报告中看到几个警告信息(蓝色信息为警告),如图4所示,同时我们从编译报告中了解到整个设计共消耗了19个逻辑单元。
![](http://download.bbs.ednchina.com/images/attachments/201307/41415_TIME_1373343762011.jpg)
图4:IF语句综合出Latch的警告
我们可以通过RTL Viewer来进一步检查这些警告信息,从Quartus II软件的Tools菜单下Netlist Viewers里选择RTL Viewer命令,即可打开RTL Viewer来查看刚才的综合结果。如图5所示,我们看到三个输出是各自经过一个Latch出来的,后面笔者在介绍时性分析以及优化的时候,会告诉大家编译后意外产生的这些不受欢迎的锁存器会使得设计的时序分析复杂化,而且也不能精确反映设计者脑子里的本领设计意图。 |
|
|
|
|
|