IF语句在VHDL中的应用

IF语句在VHDL中的应用,vhdl,Vhdl,两个语句之间的区别是什么?虽然它们都执行相同的过程,但它们之间存在一些差异 如果(上升沿时钟)和 if rising_edge(clk)if语句中的条件表达式应返回布尔值 函数调用的形式如下: 函数调用::=   nbsp函数名称[(实际参数部分)]   nbsp实际参数部分:=参数关联列表 请注意,包含参数(参数)的必需的左括号和右括号 包std_logic_1164的包声明包含以下声明: FUNCTION rising_edge (SIGNAL s : std_ulogic

两个语句之间的区别是什么?虽然它们都执行相同的过程,但它们之间存在一些差异

如果(上升沿时钟)和
if rising_edge(clk)

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

函数调用的形式如下:

函数调用::=
  nbsp函数名称[(实际参数部分)]   nbsp实际参数部分:=参数关联列表 请注意,包含参数(参数)的必需的左括号和右括号

包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;
我们看到它们都对事件(边缘或过渡)敏感,上升边缘检测到正过渡,下降边缘检测到负过渡


To_X01函数调用实际上包含了从“H”到“L”以及从“L”到“H”的转换,这些转换是有效的标准逻辑值,可以映射到二进制值。

简单:第一个是等待发生的编译错误。只是稍微不那么简单:如果更改语法,则不太重要,但是要更改函数语法。
-------------------------------------------------------------------
-- 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;