第 3 页 共 20 页
给初学者一个误区,认为采用位(矢量)则足够设计之用,而不必像 std_logic 那样出现’X’,’U’,’W’
各种状态,增加编程难度。但实际情况却并非如此,以一个最简单 D 型触发器设计为例
… …
① process(clk)
② begin
③ if clk’event and clk=’1’ then
④ Q<=D;
⑤ end if;
⑥ end process;
… …
实际中 clk 对数据端 D 的输入有一定的时间限制,即在 clk 上升沿附近(建立时间和保持时间之
内),D 必须保持稳定,否则 Q 输出会出现亚稳态。
当 clk 和 D 时序关系不满足时,由于 bit 只有’0’或’1’,系统只能随机的从’0’和’1’中给 Q 输出,
这样的结果显然是不可信的;而采用 std_logic 类型,则时序仿真时会输出为一个’X’,提醒用户建立
保持时间存在问题,应重新安排 D 和 clk 之间时序关系。
此外,对于双向总线设计(前面已提及)、 FPGA/CPLD 上电配置等问题,如果没有’Z’,’X’等状
态,根本无法进行设计和有效验证。
4. 关于进程
进程(Process)是 VHDL 中最为重要的部分,大部分设计都会用到 Process 结构,因此掌握
Process 的使用显得尤为重要。以下是初学和使用 Process 经常会出错的例子。
(一). 多余时钟的引入
在设计时往往会遇到这种情况,需要对外部某个输入信号进行判断,当其出现上跳或下跳沿时,
执行相应的操作,而该信号不像正常时钟那样具有固定占空比和周期,而是很随机,需要程序设计
判断其上跳沿出现与否。这时,很容易写出如下程序:
① process(Ctl_a) -- Ctl_a 即为该输入信号
② begin
③ if Ctl_a’event and Ctl_a=’1’ then
④ … … ; --执行相应操作
⑤ end if ;
⑥ end process;
由于出现第③行这类语句,综合工具自动默认 Ctl_a 为时钟,某些 FPGA 更会强行将该输入约
束到时钟引脚上。而设计者的初衷只是想将其作为下位机的状态输入以进行判断。上面的程序容易
造成多时钟现象,增加设计的难度。解决的办法可以如下,将 Ctl_a 增加一级状态 Ctl_areg 寄存,
通过对 Ctl_a 和 Ctl_areg 状态判断上跳与否,改正程序如下: