本帖最后由 ucx 于 2017-9-18 14:38 编辑
二、IncDec()与DecInc(),读作ink dick与dick ink
例2中,提到了增减计数,用子进程描述如下:
Procedure IncDec(signal cnt : inout std_vector; inc : in boolean; dec : in boolean := false) is
begin
if inc then
cnt< = cnt + 1;
elsif dec then
cnt< = cnt - 1;
end if;
End;
其中dec用给出默认值false,其目的是适用于仅仅增计数场合IncDec(cnt, inc)只使用两个参数时等效为
if inc then
cnt< = cnt + 1;
end if;
同理定义减计数优先级高的子进程DecInc:
Procedure DecInc(signal cnt : inout std_vector; dec : in boolean; inc : in boolean := false) is
begin
if dec then
cnt< = cnt - 1;
elsif inc then
cnt< = cnt + 1;
end if;
End;
类似于LoadValue(),重载这两个子进程。
Procedure IncDec(signal cnt : inout std_vector; inc : in std_logic; dec : in std_logic := '0') is
begin
IncDec(cnt, inc = '1', dec = '1');
End;
Procedure DecInc(signal cnt : inout std_vector; dec : in std_logic; inc : in std_logic := '0');
三、RstIncDec、SetIncDec、RstDecInc、SetDecInc
例2中的增减计数,增加复位或置位条件,又可得四个子进程,并分别重载后增添到ucx_2008pkg包中。文件ucx_2008pkg.vhd头部如下图所示:
其中,Procedure RstIncDec(signal cnt : inout std_vector; rst,inc : in boolean; dec : in boolean := false);定义如下:
Procedure RstIncDec(signal cnt : inout std_vector; rst,inc : in boolean; dec : in boolean := false) is subtype T is std_vector(1 to cnt'length); begin if rst then cnt< = T'(others => '0'); elsif inc then cnt< = cnt + 1; elsif dec then cnt< = cnt - 1; end if; End; Procedure RstIncDec(signal cnt : inout std_vector; rst,inc : in std_logic; dec : in std_logic := '0') is begin RstIncDec(cnt, rst = '1', inc = '1', dec = '1'); End; 其余三个子进程类似定义。 四、一个简单实例 写到这里,我们用一个简单的实例来说明如何使用这些子函数(或进程),也算作休息一下。 例3:设计一个时钟工作在50M的计数器,其状态转换为0→1→2→3→7→5→4→0,如此7个状态循环,并且,用一个高电平脉冲指示输出值为4。 分析:可用一个3位计数器cnt实现上述功能,计数器的复位、置位、加1、减1和装载条件分别是cnt=4,cnt=3,cnt <4,cnt>4和cnt=7。程序代码如下图。
将ucx_2008pkg.vhd拷贝到Quartus II安装目录\quartus\libraries\ucxLib文件夹下即可在编译成功。 将ucxLib库添加到altera_modelsim中,即可仿真成功,结果如下。
modelsim的teshbench文件名为top_IO.vht,内容如下: Library ieee; USE ieee.std_logic_1164.all, ieee.std_logic_unsigned.all; Library ucxLib; Use ucxLib.ucx_2008pkg.all; entity top IS end top; architecture pure_sim of top is signal clock : std_logic := '0'; signal cnt : std_vector(2 downto 0); signal q_4v : std_logic; begin i1: entity work.dm_cnt Port Map(clock=>clock, qCnt=>cnt, q_end=>q_4v); Process begin wait for 20 ns; clock <= not clock;
End process; End pure_sim;
|