У меня есть вопрос о том, что я не понимаю, что происходит в моем проекте 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 во много раз, так что яЯ не уверен, что происходит. Также, согласно руководству по демонстрационной плате, другие устройства совместно используют этот сигнал, поэтому я должен установить его на высокий импеданс, когда он не используется. Если кто-то может направить меня в правильном направлении или объяснить мнеЯ был бы очень здорово. Спасибо