如何用VHDL编写以下代码??
`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中尝试过的:
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...发布于 2021-01-22 16:56:25
在VHDL中没有等同于Verilog事件的构造。然而,VHDL确实有一个内置的信号属性,使人们能够模拟Verilog事件。此属性为'transaction;它是一个信号,每当对信号进行赋值时(无论赋值是否更改信号的值),它都会切换。
所以,以正常的方式声明一个信号(任何你喜欢的类型):
signal event_a : boolean := true;(您不需要特别初始化它。)然后,每次您想要模拟Verilog ->操作符时,您可以将一些值(任何值)驱动到信号上:
event_a <= true;因为'transaction本身是一个信号(所谓的隐式信号),并且因为'transaction会切换,所以您可以在灵敏度列表中使用它,例如:
process(event_a'transaction)您不必费心使用'transaction,只需切换信号(在该信号上创建一个事件,导致'event信号属性为true)。不过,使用'transaction会更好一些,因为您不必跟踪信号的值;每次都可以分配相同的值。
顺便说一下,我没有在VHDL语言中使用after,因为信号赋值的行为与Verilog中的非阻塞赋值非常相似。如果我在没有修改延迟值的情况下使用after,我将在20、30和90 ns触发这个过程,而不是在20、50和140 ns (我认为这就是您想要的)。换句话说,这就是:
wait for 20 ns; event_a <= true;
wait for 30 ns; event_a <= true;
wait for 90 ns; event_a <= true;是这样的
begin
#20 -> event_a;
#30 -> event_a;
#90 -> event_a;
end鉴于这一点:
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_
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;https://stackoverflow.com/questions/65835416
复制相似问题