У меня появляется довольно странное предупреждение, когда я пытаюсь синтезировать проект VHDL, который у меня есть. Я пытаюсь построить тетрис, поэтому объект моей модели имеет следующее определение типа:
constant PAIR_WIDTH: natural := 6;
type pair_type is
record
x, y: signed(PAIR_WIDTH - 1 downto 0);
end record;
type tetromino_shape_type is array(0 to 3) of pair_type;
type tetromino_type is
record
shape: tetromino_shape_type;
color: std_logic_vector(3 downto 0);
end record;
Эта структура типа дает мне тетромино, которое имеет 4 пары signed
для представления положения 4 блоков и std_logic_vector
, обозначающее, какой блок следует использовать для рисования тетромино. Единственная «странная» вещь здесь заключается в том, что tetromino_type
— это запись с массивом (tetromino_shape_type
) записей (pair_type
).
Я предположил, что все будет хорошо, используя этот тип для некоторых сигналов, которые действуют как регистры:
signal current_pos_reg, current_pos_next: pair_type; -- position of the current tetromino in grid coordinates
signal current_tetromino_reg, current_tetromino_next: tetromino_type; -- current tetromino piece
Итак, я сделал процесс установки регистров:
process(clk, rst)
begin
if (rst = '1') then
state_reg <= idle;
elsif (clk'event and clk = '1') then
current_pos_reg <= current_pos_next;
current_tetromino_reg <= current_tetromino_next;
end if;
end process;
И еще один процесс для логики следующего состояния:
process(current_pos_reg, current_tetromino_reg)
begin
--even just keeping the same state as before causes this issue I'm about to show
current_pos_next <= current_pos_reg;
current_tetromino_next <= current_tetromino_reg;
end process;
Затем синтезатор (независимо от того, что использует Xilinx ISE (не WebPack)) выдает мне следующее предупреждение:
One or more signals are missing in the process sensitivity list. To enable synthesis of FPGA/CPLD hardware, XST will assume that all necessary signals are present in the sensitivity list. Please note that the result of the synthesis may differ from the initial design specification. The missing signals are:
<current_tetromino_reg.shape<0>.x>, <current_tetromino_reg.shape<0>.y>, <current_tetromino_reg.shape<1>.x>, <current_tetromino_reg.shape<1>.y>, <current_tetromino_reg.shape<2>.x>, <current_tetromino_reg.shape<2>.y>, <current_tetromino_reg.shape<3>.x>, <current_tetromino_reg.shape<3>.y>
По какой-то странной причине члены записей в массиве в записи не включаются в список конфиденциальности. Я ожидал, что они будут включены так же, как будут включены отдельные std_logic
членов массива std_logic_vector
. Также явно отсутствует в ошибке current_tetromino_reg.block
, что также говорит мне о том, что проблемы вызываются только элементами записи массива.
Мой вопрос:
- Что я делаю неправильно? Я мог бы просто добавить этих отдельных членов в список конфиденциальности, но это кажется утомительным.
- Это ошибка? Я не эксперт в VHDL (пока я даже не полностью владею языком), но я не могу придумать ни одной причины, по которой это могло бы произойти. Возможно, есть конкретное исключение из правила о том, что автоматически включается в список конфиденциальности, о котором я не знаю?