我有一个 VHDL 实体,其中包含一些不受约束的
std_logic_vector
端口,该实体由 verilog 模块封装,该模块明确定义了这些端口宽度。
Verilog 包装器:
module conv_wrapper (din,dout,clk,ce);
input [7:0] din;
output [7:0] dout;
input clk;
input ce;
conv conv_inst (
.din(din),
.dout(dout),
.clk(clk),
.ce(ce));
endmodule
VHDL模块:
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;
entity conv is
port(
clk : in std_logic;
ce : in std_logic;
din : in std_logic_vector;
dout : out std_logic_vector
);
end entity conv;
architecture behavioural of conv is
signal s_nosignbit : std_logic_vector(din'high - 1 downto din'low) := (others => '0');
signal s_nosignbit_not : std_logic_vector(din'high - 1 downto din'low) := (others => '0');
signal s_dout : std_logic_vector(din'range) := (others => '0');
signal msb : std_logic := '0';
begin
-- Assign the MSB
msb <= din(din'high);
-- Assign the rest of the bits excluding the MSB
s_nosignbit <= din(din'high - 1 downto din'low);
-- Perform bitwise NOT operation on s_nosignbit
s_nosignbit_not <= not s_nosignbit;
-- Concat
s_dout <= msb & s_nosignbit_not;
dout <= s_dout;
end architecture behavioural;
VHDL 模块本质上只是将数字转换为 2 的补码。可能有更简单的方法可以做到这一点,但这并不是真正的重点。
我在模拟过程中收到错误消息:
s_nosignbit <= din(din'high - 1 downto din'low);
错误地分配了值,因为“切片方向与其索引类型范围不同”。
我经常在设计中使用不受约束的端口,但以前从未见过这种情况。 Vivado 是否无法正确地将 7:0
翻译为 7 downto 0
?
使用 Vivado 2024.1
有几件事
din : in std_logic_vector(7 downto 0);
。对 doout 进行相同的更改。混合 VHDL 和 Verilog 的一般规则是降低您的期望,而不是失望。