在VHDL中使用IF语句

时间:2014-07-09 10:01:17

标签: vhdl

两个陈述之间有什么区别,虽然两个过程都是相同的,但两者之间存在一些差异

if(rising_edge clk)和 如果rising_edge(clk)

1 个答案:

答案 0 :(得分:0)

if语句中的条件表达式应该返回一个布尔值。

函数调用的形式为:

function_call ::=
    function_name [ ( actual_parameter_part ) ]     actual_parameter_part ::= parameter_association_list

注意所需的开括号和右括号括起参数(参数)。

 association_list ::= 
     association_element { , association_element }

 association_element ::= 
     [ formal_part => ] actual_part

包std_logic_1164的包声明包含声明:

FUNCTION rising_edge  (SIGNAL s : std_ulogic) RETURN BOOLEAN;
FUNCTION falling_edge (SIGNAL s : std_ulogic) RETURN BOOLEAN;

我们看到这些都是具有信号的单个参数的函数。

扩展的Baccus-Naur形式(EBNF,VHDL的定义,而不是ISO标准)在IEEE标准的正文和附录中的语法摘要中是规范性的。那些开括号和右括号都需要包含函数调用中传递的任何参数。

然后Brian或Fru1tbat更加巧妙地提到,在分析过程中可以发现函数调用语法问题。

另一方面,如果您的问题是错误的,并且您认为包装正文包含两个函数的区别:

-------------------------------------------------------------------
-- edge detection
-------------------------------------------------------------------
FUNCTION rising_edge  (SIGNAL s : std_ulogic) RETURN BOOLEAN IS
BEGIN
    RETURN (s'EVENT AND (To_X01(s) = '1') AND
                        (To_X01(s'LAST_VALUE) = '0'));
END;

FUNCTION falling_edge (SIGNAL s : std_ulogic) RETURN BOOLEAN IS
BEGIN
    RETURN (s'EVENT AND (To_X01(s) = '0') AND
                        (To_X01(s'LAST_VALUE) = '1'));
END;

我们发现它们对事件敏感(边缘或转换),并且rising_edge检测到正转换,而fall_edge则为负转换。

To_X01函数调用有效地将'H'包含在'L'和'L'到'H'的转换中,这些转换是可以映射到二进制值的有效std_ulogic值。