首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Verilog事件类型和事件触发器->event_a的VHDL语言等价物

Verilog事件类型和事件触发器->event_a的VHDL语言等价物
EN

Stack Overflow用户
提问于 2021-01-22 04:41:52
回答 1查看 198关注 0票数 1

如何用VHDL编写以下代码??

代码语言:javascript
复制
`timescale 1ns/10ps

module tb;

  event event_a;

  initial begin
    #20  ->event_a;
    #30  ->event_a;
    #90  ->event_a;

    #100;
    $stop;
  end


always @(event_a) begin
    $display("hello word (%t)");
end

endmodule

下面是我到目前为止在VHDL中尝试过的:

代码语言:javascript
复制
library STD;
library IEEE;              
use IEEE.std_logic_1164.all;
use STD.textio.all;         
use IEEE.std_logic_textio.all;    

-- VHDL PSEUDO-CODE FOR WHAT I WANT TO DO IN VHDL INSTEAD OF VERILOG
entity tb is
end entity;

architecture sim of tb is
   event_a : event_type;   -- HOW TO DO THIS IN VHDL???
begin

    process
    begin
         ->event_a after 20 ns;  -- HOW TO DO THIS IN VHDL???
         ->event_a after 30 ns;
         ->event_a after 90 ns;
  
         wait; --Wait until simulation finishes
    end process;

    process(event_a)   -- HOW TO DO THIS IN VHDL???
        variable L : line;
    begin
        write(L, string'("hello");
        WriteLine(L, output);
    end process;

end architecture;

-- BEEEP: SYNTAX ERROR BECAUSE WRONG SYNTAX...
EN

回答 1

Stack Overflow用户

发布于 2021-01-22 16:56:25

在VHDL中没有等同于Verilog事件的构造。然而,VHDL确实有一个内置的信号属性,使人们能够模拟Verilog事件。此属性为'transaction;它是一个信号,每当对信号进行赋值时(无论赋值是否更改信号的值),它都会切换。

所以,以正常的方式声明一个信号(任何你喜欢的类型):

代码语言:javascript
复制
signal event_a : boolean := true;

(您不需要特别初始化它。)然后,每次您想要模拟Verilog ->操作符时,您可以将一些值(任何值)驱动到信号上:

代码语言:javascript
复制
event_a <= true;

因为'transaction本身是一个信号(所谓的隐式信号),并且因为'transaction会切换,所以您可以在灵敏度列表中使用它,例如:

代码语言:javascript
复制
process(event_a'transaction)

您不必费心使用'transaction,只需切换信号(在该信号上创建一个事件,导致'event信号属性为true)。不过,使用'transaction会更好一些,因为您不必跟踪信号的值;每次都可以分配相同的值。

顺便说一下,我没有在VHDL语言中使用after,因为信号赋值的行为与Verilog中的非阻塞赋值非常相似。如果我在没有修改延迟值的情况下使用after,我将在20、30和90 ns触发这个过程,而不是在20、50和140 ns (我认为这就是您想要的)。换句话说,这就是:

代码语言:javascript
复制
wait for 20 ns; event_a <= true;
wait for 30 ns; event_a <= true;
wait for 90 ns; event_a <= true;

是这样的

代码语言:javascript
复制
begin
  #20 -> event_a;
  #30 -> event_a;
  #90 -> event_a;
end

鉴于这一点:

代码语言:javascript
复制
event_a <= true after 20 ns;
event_a <= true after 30 ns;
event_a <= true after 90 ns;

实际上只会触发一个(Verilog风格的)事件-一个在90 at。这是因为当执行包含信号赋值的代码行时,由先前对同一信号(尚未执行操作)赋值创建的任何事件都会被最新的信号赋值创建的事件覆盖。

https://www.edaplayground.com/x/i7Z_

代码语言:javascript
复制
use STD.textio.all;         

entity tb is
end entity;

architecture sim of tb is
   signal event_a : boolean  := true;   -- or any other type
begin

    process
    begin
         wait for 20 ns; event_a <= true; 
         wait for 30 ns; event_a <= true;
         wait for 90 ns; event_a <= true;
  
         wait; --Wait until simulation finishes
    end process;

    process(event_a'transaction) 
        variable L : line;
    begin
        write(L, string'("hello"));
        WriteLine(output, L);
    end process;

end architecture;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65835416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档