vhdl中的'事件有什么用?

电器工程 视频文件
2022-01-19 03:10:20

在同步计数器的 vhdl 代码中,我替换了以下部分

process(clock)
begin
    if(clock'event and clock='1')then
        count <= count + 1;
    end if;
end process

process(clock)
begin
    if(clock='1')then
        count <= count + 1;
    end if;
end process

结果保持不变。那么为什么clock'event总是推荐使用第一种编码方式。?

2个回答

敏感度列表主要是模拟器用来调度进程执行的概念。综合工具通常会丢弃敏感度列表。
通过综合工具运行上述代码片段的结果是什么?没有的实现'event将推断出锁存器,因为这是综合工具在查看代码时“看到”的内容。

Xilinx XST 的结果if clk'event and clk = '1' then

Adders/Subtractors : 1  
8-bit adder        : 1  
Registers          : 1  
8-bit register     : 1 

Xilinx XST 的结果if clk = '1' then

Adders/Subtractors : 1  
8-bit adder        : 1  
Latches            : 8  
1-bit latch        : 8

上面的结果是通过合成一个 8 位向上计数器获得的。

编辑(2015-06-11):在 IEEE-1076.6-1999“IEEE VHDL 寄存器传输级别(RTL)综合标准”中, “在if语句中用作条件时应表示正时钟沿”的表达式是明确的定义为:

  • 上升沿(clk_signal_name)
  • clk_signal_name'EVENTclk_signal_name = '1'
  • clk_signal_name = '1'clk_signal_name'EVENT
  • 不是clk_signal_name'STABLEclk_signal_name = '1'
  • clk_signal_name = '1' 不是clk_signal_name'STABLE

从维基百科对 VHDL的定义开始

VHDL(VHSIC 硬件描述语言)是一种用于电子设计自动化的硬件描述语言,用于描述数字混合信号系统,例如现场可编程门阵列和集成电路。VHDL 也可以用作通用并行编程语言。

VHDL 主要用于描述 ASIC 或 FPGA 的数字电路,但它可以用于数字模拟系统(混合信号),甚至可以用于描述并行过程。

'事件意味着数字信号的变化,即边缘结合“1”定义上升沿这与rising_edge(clk)函数几乎相同。这里它们之间的细微差别(对于高级用户)。

所以,如果你不使用'event,你描述的是在clk的高级别激活的进程。例如,对于 40MHz 时钟 50% 占空比,时钟在 12.5ns 期间处于“1”状态。在这 12.5ns 期间计数器会发生什么?在这 12.5ns 期间将计算多少次?最重要的是,写入这些代码的系统能够使用时钟电平递增计数器吗?可能不会,尽管您的模拟器会为您提供相同的结果。小心模拟器结果,因为模拟器与合成器不同,可以提供非常不同的结果。

VHDL 是一种通用语言,广泛用于描述数字电路。因此,每个制造商都有自己的最佳模板来描述计数器、寄存器、存储器……而clock'event 和 clock='1'rising_edge(clk)是事实上的标准来描述灵敏度中列出的信号的上升沿列表。同样,如果您描述异步复位,则将复位信号放在灵敏度列表中,并在信号被断言时始终初始化寄存器的高或低电平,而不是在用边沿定义的瞬间。

process (clock, reset) 
begin
   if reset='1' then 
      count <= (others => '0');
   elsif clock='1' and clock'event then
      <count> <= <count> + 1;
   end if;
end process;

总而言之,每个可编程逻辑制造商都使用一组有限且已定义的 VHDL 定义来描述他们的系统。我建议您搜索 Xilinx 或 Altera 的 VHDL 或 Verilog 模板。这些模板被合成器正确理解,以转换为特定可编程逻辑芯片或 ASIC 或其他系统的元素。