如何在 VHDL 中将 inout 端口分配给内部信号,反之亦然?

问题描述 投票:0回答:0

我有一个像这样的 VHDL 代码

`library IEEE;
entity slave is
Port (   clk     : in STD_LOGIC;
          rst        : in STD_LOGIC;
          Pdata_0  : inout STD_LOGIC;
          Pdata_1  : inout STD_LOGIC;
          Pdata_2  : inout STD_LOGIC
);
end slave;
architecture Behavioral of slave is
signal mem : std_logic_vector(2 downto 0);
….`

我想将 inout 端口分配给 internal 信号,将 internal 信号分配给 inout 端口。为此,我做了以下工作:

`Pdata_0 <= mem(0) when mem(0) = ‘0’ else ‘Z’;
Pdata_1 <= mem(1) when mem(0) = ‘0’ else ‘Z’;
Pdata_2 <= mem(2) when mem(0) = ‘0’ else ‘Z’;

mem(0) <= Pdata_0;
mem(1) <= Pdata_1;
mem(2) <= Pdata_2;`

我还有一个使用Systemverilog写的接口如下

`Interface intf (input bit clk);

    bit rst;
    tri1 [2:0] data;
    logic [2:0] data_i;

    assign data = data_i;

    clocking cb_drv @(posedge clk);
        // Input #1step 
        output #1ns data;
    endclocking

    clocking cb_mon @(posedge clk);
        // Input #1step 
        input #1ns data;
    endclocking

    task write(input bit[2:0] data_in );
        @(cb_drv);
        data_i <= data_in;
        repeat(3) @(cb_drv);
        data_i <= ‘0;
    entask

endinterface` 

最后,在tesbench文件中,我使用来自接口的信号如下:

`Module tb();       

bit clk;        
always #5ns clk = ~clk;                 

interface evif(clk)         

slave dut(      .clk    (clk),      
.rst    (evif.rst),         
.Pdata_0 (evif.data[0]),        
.Pdata_1 (evif.data[1]),        
.Pdata_2 (evif.data[2])         );

endmodule`

在仿真中,我得到的波形仅在 P_data 信号的上升沿具有竞争条件,如下例所示。我该如何解决这个问题并获得清晰的信号?

enter image description here

我在 VHDL 中尝试了不同的组合赋值方式,但都没有奏效。

vhdl system-verilog fpga inout
© www.soinside.com 2019 - 2024. All rights reserved.