place_design Ошибка ограничения часов VHDL Vivado FPGA

Итак, я пытаюсь спроектировать последовательную схему «торгового автомата» в Vivado для платы ZYBO FPGA. Однако каждый раз, когда я пытаюсь пройти стадию реализации, я получаю кучу ошибок, главная из которых

[Place 30-58] IO placement is infeasible. Number of unplaced terminals (1) is greater than
number of available sites (0).
The following Groups of I/O terminals have not sufficient capacity: 
 IO Group: 0 with : SioStd: LVCMOS18   VCCO = 1.8 Termination: 0  TermDir:  In   RangeId: 1  
has only 0 sites available on device, but needs 1 sites.
Term: clk

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

Вот мой дизайн VHDL

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY des_src IS
    PORT (
        reset       : IN    std_logic;
        clk         : IN    std_logic;
        QDN         : IN    std_logic_vector(2 DOWNTO 0);
        PC          : OUT   std_logic_vector(1 DOWNTO 0)
    );
END des_src;

ARCHITECTURE behavioral OF des_src IS
    TYPE        statetype IS (Start, Five, Ten, Fifteen, Twenty, Twentyfive, Thirty, Thirtyfive, Fourty, Fourtyfive);
    SIGNAL      currentstate, nextstate     : statetype;
BEGIN
    fsm1:   PROCESS (QDN, currentstate)
    BEGIN
        CASE currentstate IS
                WHEN Start =>
                        PC <= "00";
                        CASE QDN IS
                                WHEN "000" =>
                                        nextstate <= Start;
                                WHEN "001" =>
                                        nextstate <= Five;
                                WHEN "010" =>
                                        nextstate <= Ten;
                                WHEN "100" =>
                                        nextstate <= Twentyfive;
                                WHEN OTHERS =>
                                        nextstate <= Start;
                         END CASE;
                WHEN Five =>
                         PC <= "00";
                         CASE QDN IS
                                 WHEN "000" =>
                                         nextstate <= Five;
                                 WHEN "001" =>
                                         nextstate <= Ten;
                                 WHEN "010" =>
                                         nextstate <= Fifteen;
                                 WHEN "100" =>
                                         nextstate <= Thirty;
                                 WHEN OTHERS =>
                                         nextstate <= Start;
                        END CASE;
                WHEN Ten =>
                        PC <= "00";
                        CASE QDN IS
                                WHEN "000" =>
                                        nextstate <= Ten;
                                WHEN "001" =>
                                        nextstate <= Fifteen;
                                WHEN "010" =>
                                        nextstate <= Twenty;
                                WHEN "100" =>
                                        nextstate <= Thirtyfive;
                                WHEN OTHERS =>
                                        nextstate <= Start;
                        END CASE;
                WHEN Fifteen =>
                        PC <= "00";
                        CASE QDN IS
                                WHEN "000" =>
                                        nextstate <=Fifteen;
                                WHEN "001" =>
                                        nextstate <= Twenty;
                                WHEN "010" =>
                                        nextstate <= Twentyfive;
                                WHEN "100" =>
                                        nextstate <= Fourty;
                                WHEN OTHERS =>
                                        nextstate <= Start;
                        END CASE;
                WHEN Twenty =>
                        PC <= "00";
                        CASE QDN IS
                                WHEN "000" =>
                                        nextstate <= Twenty;
                                WHEN "001" =>
                                        nextstate <= Twentyfive;
                                WHEN "010" =>
                                        nextstate <= Thirty;
                                WHEN "100" =>
                                        nextstate <= Fourtyfive;
                                WHEN OTHERS =>
                                        nextstate <= Start;
                        END CASE;
                WHEN Twentyfive =>
                        PC <= "10";
                        nextstate <= Start;
                WHEN Thirty =>
                        PC <= "01";
                        nextstate <= Twentyfive;
                WHEN Thirtyfive =>
                        PC <= "01";
                        nextstate <= Thirty;
                WHEN Fourty =>
                        PC <= "01";
                        nextstate <= Thirtyfive;
                WHEN Fourtyfive =>
                        PC <= "01";
                        nextstate <= Fourty;
        END CASE;
    END PROCESS;

    fsm2:   PROCESS (reset, clk)
    BEGIN
        IF (reset = '0') THEN
                currentstate <= Start;
        ELSIF (clk'EVENT) AND (clk = '1') THEN
                currentstate <= nextstate;
        END IF;
    END PROCESS;
END behavioral;

Вот мои ограничения

##Buttons
##IO_L20N_T3_34
set_property IOSTANDARD LVCMOS33 [get_ports {QDN[0]}]
set_property PACKAGE_PIN R18 [get_ports {QDN[0]}]

##IO_L24N_T3_34
set_property IOSTANDARD LVCMOS33 [get_ports {QDN[1]}]
set_property PACKAGE_PIN P16 [get_ports {QDN[1]}]

##IO_L18P_T2_34
set_property IOSTANDARD LVCMOS33 [get_ports {QDN[2]}]
set_property PACKAGE_PIN V16 [get_ports {QDN[2]}]

##IO_L7P_T1_34
set_property IOSTANDARD LVCMOS33 [get_ports reset]
set_property PACKAGE_PIN Y16 [get_ports reset]

##LEDs
##IO_L23P_T3_35
set_property IOSTANDARD LVCMOS33 [get_ports {PC[0]}]
set_property PACKAGE_PIN M14 [get_ports {PC[0]}]

##IO_L23N_T3_35
set_property IOSTANDARD LVCMOS33 [get_ports {PC[1]}]
set_property PACKAGE_PIN M15 [get_ports {PC[1]}]

create_clock -period 10.000 -name clk -waveform {0.000 5.000} [get_ports clk]
set_input_delay -clock [get_clocks clk] -min -add_delay 0.000 [get_ports {QDN[*]}]
set_input_delay -clock [get_clocks clk] -max -add_delay 0.000 [get_ports {QDN[*]}]
set_input_delay -clock [get_clocks clk] -min -add_delay 0.000 [get_ports reset]
set_input_delay -clock [get_clocks clk] -max -add_delay 0.000 [get_ports reset]
set_output_delay -clock [get_clocks clk] -min -add_delay 0.000 [get_ports {PC[*]}]
set_output_delay -clock [get_clocks clk] -max -add_delay 0.000 [get_ports {PC[*]}]

Я использую Vivado 2015.2 и проектирую для платы разработки ZYBO.

Любая помощь приветствуется.

Изменить 26.08.15

Хорошо, мой код в основном работает. Я смог использовать

set_property PACKAGE_PIN L16 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
create_clock -period 10.000 -name clk -waveform {0.000 5.000} [get_ports clk]

для моих часов. Однако эти часы намного быстрее, чем я хочу (125 МГц), поэтому я знаю, что мне нужно использовать деление часов и в файле ограничений генерировать часы, но нужно ли мне назначать сгенерированные часы на вывод? И есть ли у кого-нибудь советы о том, как включить делитель часов в мой текущий код vhdl? Я просто сделаю это другим процессом и добавлю еще один порт, или это сложнее, чем это?


person sfagin    schedule 24.08.2015    source источник


Ответы (1)


Вы не назначили контакт clk первичному устройству. Я предполагаю, что Vivado решает, что для него необходим вход LVCMOS 1,8 В (вероятно, по умолчанию), но на Zybo нет пользовательских контактов LVCMOS 1V8: единственный банк 1V8 - 501, и он уже полностью используется Ethernet, USB OTG, SD-карта, UART и кнопки. Как вы, вероятно, сказали Vivado, что используете Zybo, он не может решить эту проблему в одиночку.

Итак, если у вас есть внешний источник синхронизации, подключите его к одному из разъемов pmod, объявите соответствующий вывод как LVCMOS3V3 и назначьте его clk. Иначе, если вы хотите, чтобы ваши часы управлялись системой обработки, вы должны явно подключить один из 4 тактовых импульсов FCLK PS-to-PL ко входу clk вашего проекта.

На мой взгляд, самый простой способ сделать это - превратить ваш проект в IP (см. Документацию Vivado), создать его экземпляр в виде блочного дизайна, добавить систему обработки и основные входы / выходы, которые вам нужны, и выполнить разводку.

person Renaud Pacalet    schedule 25.08.2015
comment
Хороший ответ. Я бы не стал делать IP проекта и вместо этого сделал бы блок-схему с часами PL в качестве выхода. Затем блок-схема создается в файле VHDL верхнего уровня. Таким образом, VHDL является верхним уровнем, а не блок-схемой. Это вопрос предпочтений, но я считаю этот подход более масштабируемым при добавлении большего количества интерфейсов PS-PL, поскольку не нужно переопределять настраиваемый IP-адрес. - person kraigher; 25.08.2015
comment
Я попробую это сделать и обновлю, решила ли она проблему. О, и если я выберу решение для внешних часов, подойдет ли для этого Arduino? - person sfagin; 25.08.2015
comment
На самом деле, прежде чем я пойду и подключу внешние часы, есть ли причина, по которой это не работает? В справочном руководстве говорится, что вывод L16 - это тактовая частота 125 МГц. set_property PACKAGE_PIN L16 [get_ports clk] set_property IOSTANDARD LVCMOS33 [get_ports clk] - person sfagin; 26.08.2015
comment
О, и если я выберу решение для внешних часов, подойдет ли для этого Arduino?: да, я так думаю. Пока ваши входные часы проходят через оборудование для буферизации часов вашего ядра Zynq, прежде чем фактически использоваться в качестве часов, все должно быть в порядке. И если вы правильно объявите его часами, Vivado позаботится об этом автоматически. - person Renaud Pacalet; 26.08.2015
comment
Да, вы можете использовать эти внешние часы 125 МГц ... пока ваша конструкция работает хотя бы на этой частоте. Попробуйте: синтезируйте, разместите и проложите маршрут для тактовой частоты 125 МГц и посмотрите отчет о времени после маршрута. - person Renaud Pacalet; 26.08.2015