Verilog источник закрытых часов в Xilinx - PullRequest
1 голос
/ 21 марта 2012

У меня есть вопрос о том, что я не понимаю, что происходит в моем проекте FPGA.Мне нужно управлять двумя устройствами (AGC и ADC) через шину SPI.Поскольку FPGA будет ведущим устройством, я генерирую тактовый сигнал SCK в коде путем деления системных часов.Затем я направляю этот сигнал на выходной провод через буфер состояния.Ниже приведен мой соответствующий код.Он не показан, но сигнал, который управляет буфером с тремя состояниями, en_SCK , управляемый автоматическим автоматом, когда он установлен на низком уровне в состоянии ожидания, а затем на высоком уровне для остальных состояний.

output wire SDI

   //for SCK_clock
reg SCK_gen, SCK_hold;
integer i;
reg en_SCK;
wire neg_edge_SCK;

   //SCK_generator
    always @(posedge clk)
            begin
                i <= i+1;
                SCK_hold <= SCK_gen;
                    if(i == 10)
                        begin
                            SCK_gen <= ~SCK_gen;
                            i <= 0;
                        end
            end


assign SCK = (en_SCK) ? SCK_gen : 1'bz;

Когда я реализую проект, я получаю следующее предупреждение:

ПРЕДУПРЕЖДЕНИЕ: PhysDesignRules: 372 - Закрытые часы.Сеть часов en_SCK_not0001 получена с помощью комбинаторного вывода.Это не очень хорошая дизайнерская практика.Используйте вывод CE для управления загрузкой данных в триггер.

Также я замечаю, что мои часы выглядят очень искаженными.Но если я не использую устройство tristate в своем коде, а direclty назначает сигнал синхронизации на выходной провод (как в коде ниже), я получаю хороший чистый сигнал синхронизации.

assign SCK = SCK_gen;

Ниже приведенрядом с сигналом SCK без тристатового буфера (слева) и с тристатовым буфером (справа).Я довольно новичок в FPGA и Verilog, но, насколько я понимаю, использование этого стиля кода назначения подразумевает использование трехстороннего буфера, поэтому я запутался, почему он, по-видимому, интерпретируется как источник стробируемых тактовых импульсов (сгенерированная схема XST показывает, что это подразумеваетсяс и . Я также запутался в том, как он искажает тактовый сигнал. FSM должен форсировать высокий уровень сигнала включения en_SCK во много раз, так что яЯ не уверен, что происходит. Также, согласно руководству по демонстрационной плате, другие устройства совместно используют этот сигнал, поэтому я должен установить его на высокий импеданс, когда он не используется. Если кто-то может направить меня в правильном направлении или объяснить мнеЯ был бы очень здорово. Спасибо enter image description here

Ответы [ 3 ]

2 голосов
/ 21 марта 2012

Мое понимание SPI состоит в том, что сигнал SCK от мастера никогда не указывается трижды.Он может быть привязан к низкому или высокому уровню, когда не используется, но его не следует указывать трижды.Фактически, ведущему не следует трижды устанавливать какие-либо из своих выходных сигналов SPI: SCK, CS_N, MOSI (SDO).

Обновление на основе комментария:

Вот приложение обратите внимание, используя стартовую плату Spartan 3E .На странице 4 говорится: «Сигналы шины SPI (SDI, SDO и SCK) совместно используются другими устройствами на плате. Очень важно, чтобы другие устройства были отключены при обмене данными с усилителем или аналого-цифровым преобразователем».

1 голос
/ 24 марта 2012

Шины SPI обычно не следует указывать в трехстороннем режиме, если ваше устройство всегда является ведущим.

Как правило, вы выбираете периферийное устройство, с которым вы хотите установить связь, через вывод выбора микросхемы и оставляете все остальное на шине отключенным. Отмененные ведомые периферийные устройства будут затем включать свои выходы (MISO) в три состояния, чтобы они не мешали обмену данными с выбранным периферийным устройством - может быть, именно об этом вы и читали?

Кроме того, вы используете сгенерированные часы внутри своего дизайна или перенаправляете их прямо на контакт? Я не слишком знаком с Verilog (сам пользователь VHDL), но стробированные часы, как правило, потому, что вы выполняете комбинаторную операцию над сигналом (в вашем случае буфером с тремя состояниями), а затем используете его в качестве входа синхронизации на переворот позже.

0 голосов
/ 29 октября 2014

Источник вашего предупреждения

ПРЕДУПРЕЖДЕНИЕ: PhysDesignRules: 372 - Закрытые часы.Сеть часов en_SCK_not0001 получена с помощью комбинаторного вывода.Это не очень хорошая дизайнерская практика.Используйте вывод CE для управления загрузкой данных в триггер.

находится здесь в вашем описании:

assign SCK = (en_SCK) ? SCK_gen : 1'bz;

Внутренние тристаты в современных FPGA обычно реализуются мультиплексорами, которые решают, какие данные будут представлены в общей шине, просматривая различные комбинации управляющих входов.

Итак, ваше назначенное предложение выводит мультиплексор, то есть комбинацию логики, и вывод этого мультиплексорапереходит к контакту синхронизации другого внутреннего модуля (другими словами, он используется внутри списка чувствительности always @(posedge ......) block

Схемы SPI с несколькими подчиненными устройствами (один ведущий SPI и несколько подчиненных SPI) совместно используют SPI,Сигналы MOSI и MISO, поэтому не нужно их тристатировать (если речь не идет о схеме с несколькими мастерами, в этом случае вы бы предпочли реализовать два тактовых сигнала, каждый из которых идет в противоположных направлениях).

...