У меня есть объект 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
?
Использование Вивадо 2024.1
Спасибо всем.
Вот что следует иметь в виду:
din : in std_logic_vector(7 downto 0);
в объекте VHDL. Сделайте то же самое изменение для dout. Если вам нужна переносимость, используйте универсальный VHDL.
Другой классический пример: в Verilog целые числа всегда имеют длину 32 бита; VHDL не будет знать этого.Общее правило смешивания VHDL и Verilog заключается в том, чтобы снизить ваши ожидания и не разочароваться, однако биты и битовые векторы должны вести себя так, как ожидалось. Просто указывайте размер вектора везде, где это возможно, в коде.
Спасибо, Майк. Жаль, я заметил, что указание размера вектора для
din
, как вы указали, устранило проблему, но я очень надеялся избежать этого. Я все равно добавлю это, так как моя проблема, похоже, не нашла решения в предоставленном вами документе Vivado.