基於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 顯示邏輯電路圖