2015-08-24 3 views
0

Итак, я пытаюсь создать последовательную схему вендингового автомата в Vivado для платы FPGA ZYBO. Тем не менее, каждый раз, когда я пытаюсь пройти стадии осуществления, я получаю кучу ошибок, главная из которыхplace_design Ошибка для ограничения часов VHDL Vivado 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 

Я попробовать планирование Auto I/O, но все, что в конечном итоге делает удалял штифт ограничения. Он прошел через реализацию в тот момент, но затем, конечно, не смог создать поток бит, потому что ни один из портов не был сопоставлен с выводами.

Вот мой 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.

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

Редактировать 8/26/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? Я просто делаю это еще один процесс и добавляю еще один порт, или это сложнее?

ответ

1

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

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

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

+0

Хороший ответ. Я бы избегал делать IP-дизайн и вместо этого составлял блок-схему с PL-часами в качестве вывода. Затем блок-схема создается в файле VHDL верхнего уровня. Таким образом, VHDL - это верхний уровень, а не блок-схема. Это вопрос предпочтения, но я нахожу этот подход более масштабируемым при добавлении дополнительных интерфейсов PS-PL, поскольку пользовательский IP-адрес не должен быть переопределен. – kraigher

+0

Я попробую это и уточню, разрешило ли оно проблему. О, и если я поеду с внешним решением для часов, будет ли это работать на ардуине? – sfagin

+0

На самом деле, прежде чем я пойду и подключу внешние часы, есть ли причина, по которой это не работает? Справочное руководство говорит, что Pin L16 - это тактовая частота 125 МГц.set_property PACKAGE_PIN L16 [get_ports clk] set_property IOSTANDARD LVCMOS33 [get_ports clk] – sfagin

Смежные вопросы