基于VHDL数据分流方法程序实现
过程(procedure)
- 过程与函数的使用目的相似,也是希望将其功能实现的代码被共享和重用,使主代码简洁并易于理解。 过程通常用来定义一个算法,而函数用来产生一个具有特定意义的值;
- 注意:过程与函数的主要差别就是过程可以有多个返回值。
- 过程的使用过程:先定义过程,再调用过程。
过程的存放形式
功能描述:
过程sort的功能描述:对输入两个8位的无符号整数进行比较,数值小的从min_out输出,数值大的从max_out输出。多个输出,宜采用过程方式;
**实现方式:**在包集中定义函数,在主代码中调用。
实验内容
(1) 用VHDL通过在包集中定义函数,实现过程sort的数据分流。
(2) 将源程序进行综合、优化及功能仿真。
(3)软件说明:ModelSimSetup-13.1.0.162,QuartusSetup-13.1.0.162。
建立工程:
第一步:打开Quartus软件。
第二步:点击New Project Wizard -> next.
第三步:选择工程文件的存放位置,输入工程名 -> next -> next。
第四步:在family栏选择芯片型号-Cyclone IV E,在Name栏选择EP4CE115F29C7,选择完之后点击next。(如果不进行硬件调试时,此处默认即可)
第五步:检查工程有没有建错,点击完成。如下图:
程序设计:
方法一:(在包集中定义过程)
在包集中定义过程,可以方便地被其它设计所重用和共享。注意:函数在package中声明,在package body中定义。
全加器顶层文件设计:
--文件名:min_max1.vhd 应与工程名保持一致:
----------------在主代码中调用包集中的过程sort-----------------
library ieee;
use ieee.std_logic_1164.all;
USE work.my_package.all;
entity min_max1 is
generic(limit: integer :=255);
port ( ena: in bit;
inp1, inp2: in integer range 0 to limit;
min_out, max_out: out integer range 0 to limit);
end min_max1;
architecture my_arch of min_max1 is
begin
process (ena)
begin
if (ena='1') then sort (inp1, inp2, min_out, max_out);
end if;
end process;
end my_arch;
–在包集中定义过程程序实现:
--文件名:my_package.vhl
-------在包集中定义过程sort------------
library ieee;
use ieee.std_logic_1164.all;
package my_package is
CONSTANT limit: integer :=255;
PROCEDURE sort (
signal in1, in2: in integer range 0 to limit;
signal min, max: out integer range 0 to limit);
end package;
package body my_package is
procedure sort (
signal in1, in2: in integer range 0 to limit;
signal min, max: out integer range 0 to limit) is
begin
if (in1>in2) then max<=in1; min<=in2;
else max<=in2; min<=in1;
end if;
end sort;
end my_package;
方法二:(在主代码中定义过程)
在主代码中定义过程, 可以出现在entity中,也可以出现在architecture中。如存放于architecture中的声明:
--文件名:min_max1.vhd 应与工程名保持一致:
-------在主代码中调用包集中定义的函数--------------
library ieee;
use ieee.std_logic_1164.all;
entity min_max1 is
generic(limit: integer :=255);
port ( ena: in bit;
inp1, inp2: in integer range 0 to limit;
min_out, max_out: out integer range 0 to limit);
end min_max1;
architecture my_arch of min_max1 is
procedure sort (signal in1, in2: in integer range 0 to limit;
signal min, max: out integer range 0 to limit) is
begin
if (in1>in2) then max<=in1; min<=in2;
else max<=in2; min<=in1;
end if;
end sort;
begin
process (ena)
begin
if (ena='1') then sort (inp1, inp2, min_out, max_out);
end if;
end process;
end my_arch;
文件仿真(这里采用modelsim仿真波形):
- 选择File-> New -> Verification/Debugging Files ->University Program VWF。
2.打开测试文件。(右键点击添加端口,对输入信号初始化,赋值。)
3.仿真结果:
逻辑电路图:
显示编译成功后,选择菜单栏 Tools –>Netlist Viewers –>RTL Viewer 显示逻辑电路图