Спартанская индексация массива 3E - PullRequest
0 голосов
/ 14 марта 2020

Я изучал проектирование и моделирование схем Педрони в VHDL с 2010 года. У меня есть плата разработки Open3S500E, и я использую Xilinx ISE 14.7 (новые версии не поддерживают Spartan 3). Я застрял на «Упражнении 9.5: функция my_not», которое требует использования таблицы разрешения (?):

-----------------------------------------------
CONSTANT not_table: stdlogic_1d :=
-----------------------------------------------
-- U    X    0    1    Z    W    L    H    -
-----------------------------------------------
( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X');
-----------------------------------------------

независимо от того, что я делал, всегда получал ошибку Unsupported type stdlogic_1d . Я пробовал разные вещи, но не удалось каждый раз. Наконец я решил скопировать и собрать Пример 9.6, в котором использовалась похожая таблица:

 TYPE stdlogic_table IS ARRAY(STD_ULOGIC, STD_ULOGIC) OF STD_ULOGIC;
 CONSTANT and_table: stdlogic_table := (
 -----------------------------------------------
 --U     X    0    1    Z    W    L    H    -
 -----------------------------------------------
 ( 'U', 'U', '0', 'U', 'U', 'U', '0', 'U', 'U' ), --| U |
 ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), --| X |
 ( '0', '0', '0', '0', '0', '0', '0', '0', '0' ), --| 0 |
 ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ), --| 1 |
 ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), --| Z |
 ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), --| W |
 ( '0', '0', '0', '0', '0', '0', '0', '0', '0' ), --| L |
 ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ), --| H |
 ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' )); --| - |
 -----------------------------------------------   `

.. и я получил тот же результат. Наконец, я пришел к выводу, что со Спартанцем 3 должно быть что-то не так, и изменил семью на Спартанец 6, который работал как шарм.

Здесь у меня есть пара вопросов. Почему это работает на спартанец 6 и спартанец 3? Об индексировании с помощью STD_LOGI C, верно? Я думал, что это особенность языка c, а не аппаратная часть. Значения STD_LOGI C перечислены где-нибудь? Если так, то какая разница, если я индексирую с помощью U или 0? Я знаю, что это своего рода конкретный c вопрос, и в конце концов он не имеет значения, так как Спартанец 3 уже древний, но я хотел бы знать ответ.

Отказ от ответственности: я новичок VHDL ie и программист-любитель.

---------Package:-----------------------------------------------------
 LIBRARY ieee;
 USE ieee.std_logic_1164.all;
 ----------------------------------------------------------------------
 PACKAGE PEX9_6 IS
 FUNCTION my_and (a, b: STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR;
 END PACKAGE;
 ----------------------------------------------------------------------
 PACKAGE BODY PEX9_6 IS
 TYPE stdlogic_table IS ARRAY(STD_ULOGIC, STD_ULOGIC) OF STD_ULOGIC;
 CONSTANT and_table: stdlogic_table := (
 -----------------------------------------------
 --UX01ZWLH-
 -----------------------------------------------
 ( 'U', 'U', '0', 'U', 'U', 'U', '0', 'U', 'U' ), --| U |
 ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), --| X |
 ( '0', '0', '0', '0', '0', '0', '0', '0', '0' ), --| 0 |
 ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ), --| 1 |
 ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), --| Z |
 ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ), --| W |
 ( '0', '0', '0', '0', '0', '0', '0', '0', '0' ), --| L |
 ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ), --| H |
 ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' )); --| - |
 -----------------------------------------------
 FUNCTION my_and (a, b: STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS
 ALIAS aa: STD_LOGIC_VECTOR(1 TO a'LENGTH) IS a;
 ALIAS bb: STD_LOGIC_VECTOR(1 TO b'LENGTH) IS b;
 VARIABLE result: STD_LOGIC_VECTOR(1 TO a'LENGTH);
 BEGIN
 FOR i IN result'RANGE LOOP
 result(i) := and_table (aa(i), bb(i));
 END LOOP;
 RETURN result;
 END FUNCTION;
 END PACKAGE BODY;

Основной код:

LIBRARY ieee;
USE ieee.std_logic_1164.all;

library functions_and_procedures;
USE functions_and_procedures.PEX9_6.all;
-------------------------------------------------
ENTITY EX9_6 IS
 PORT (x1, x2: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
y: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY;
-------------------------------------------------
ARCHITECTURE myand OF EX9_6 IS
BEGIN
 y <= my_and(x1, x2);
END ARCHITECTURE;
-------------------------------------------------
Error message: ERROR:Xst:2092 - "D:/FPGA/Projects/Pedroni2010/PEX9_6.vhd" line 40: Unsupported type stdlogic_table.
...