Неправильная длина массива 5-битного входного ПЗУ в коде VHDL

Я пытаюсь создать 5-битный входной 32-битный выходной ПЗУ, но в разделе тестового стенда я получаю сообщение об ошибке, в котором говорится следующее:

COMP96 ERROR COMP96_0367: "Improper array length (8). Expected length is 5." "testbench.vhd" 18 26
COMP96 ERROR COMP96_0367: "Improper array length (8). Expected length is 5." "testbench.vhd" 17 26
COMP96 ERROR COMP96_0367: "Improper array length (8). Expected length is 5." "testbench.vhd" 16 14
COMP96 ERROR COMP96_0367: "Improper array length (4). Expected length is 5." "testbench.vhd" 15 26

И код тестового стенда следующий:

library IEEE;
use IEEE.std_logic_1164.all;

entity rom_test is
end entity rom_test;

architecture dataflow of rom_test is
    signal input_address: std_logic_vector (4 downto 0);
    signal output_data: std_logic_vector (31 downto 0);
    
begin
    g1: entity work.rom(dataflow)
        port map(addr=>input_address, data_out=>output_data);
        
        input_address <= x"0",
                         x"01" after 20 ns,
                         x"02" after 40 ns,
                         x"03" after 60 ns;
end architecture dataflow;

Кто-нибудь может помочь?


person xxs899    schedule 12.02.2021    source источник
comment
Вычисление строки шестнадцатеричных битов из двух цифр дает длину строки 8, строку шестнадцатеричных битов из одной цифры - длину 4. Типы литералов строки и строки битов берутся из контекста (здесь присвоение input_address). Присвоение требует сопоставления элементов между правосторонним выражением и левосторонним целевым значением. Если вы использовали инструменты, совместимые с -2008, битовая строка может иметь десятичный префикс, указывающий длину строки и реализующий заполнение слева или отсечение. В противном случае укажите значение массива правильной длины (5).   -  person    schedule 12.02.2021
comment
Еще раз спасибо за ответ, но меня не научили тому, как предоставить значение массива длиной 5.   -  person xxs899    schedule 12.02.2021
comment
Вы можете преобразовать число в значение std_logic_vector. Вызов функции преобразования также можно использовать в элементе сигнала.   -  person    schedule 13.02.2021


Ответы (1)


input_address — это std_logic_vector длины 5 (от 4 до 0). Вы пытаетесь присвоить ему одно- или двухзначное шестнадцатеричное значение длины 4 и 8.

Один из способов исправить это - объединить 0 с однозначным шестнадцатеричным числом, в результате чего получится вектор длины 5:

input_address <= '0' & x"0",
                         '0' & x"1" after 20 ns,
                         '0' & x"2" after 40 ns,
                         '0' & x"3" after 60 ns;

Другой способ - назначить только 4 младших бита input_address:

input_address(4) <= '0';
input_address(3 downto 0) <= x"0",
                             x"1" after 20 ns,
                             x"2" after 40 ns,
                             x"3" after 60 ns;
person Björn    schedule 13.02.2021
comment
Спасибо за ваш ответ, это было очень полезно! - person xxs899; 15.02.2021
comment
Кроме того, я не осознавал, что длина кода операции в коде ALU составляет 6 бит, поэтому теперь у меня есть проблема с длиной массива: тест архитектуры alu_test - это сигнал in1, in2, out1: std_logic_vector (31 до 0); сигнал in3: std_logic_vector (от 5 до 0); begin g1: карта портов объекта work.alu(dataoperations) ( A =› in1, B = › in2, код операции = › in3, Result = › out1 ); in1 (5) ‹= '0' и x0001, '0' и x7FAF через 20 нс, '0' и xF000 через 40 нс; in2 (5) ‹= '0' и x0100, '0' и x7FFF через 10 нс, '0' и xFFFF через 30 нс; in3 (от 4 до 0) ‹= 000; - person xxs899; 15.02.2021