Полная версия этой страницы:
inout
Methane
Dec 17 2010, 10:57
inout pin;
assign pin = (enable) ? bus_out: 1'bz;
assign bus_in = pin;
В итогде pin сдвинут на такт относительно bus_out а bus_in сдвинут еще на такт относительно pin. Куда копать?
Цитата(Methane @ Dec 17 2010, 16:57)

inout pin;
assign pin = (enable) ? bus_out: 1'bz;
assign bus_in = pin;
В итогде pin сдвинут на такт относительно bus_out а bus_in сдвинут еще на такт относительно pin. Куда копать?
Наверно enable с выхода триггера получаете
Methane
Dec 17 2010, 11:13
Цитата(sazh @ Dec 17 2010, 16:05)

Наверно enable с выхода триггера получаете
А какая разница?
Ну написал я
if(...)begin
enable <= 1'b1;
bus_out <= 1'b1;
end
Koluchiy
Dec 17 2010, 11:37
Посоветовал бы копать в сторону примитивов типа tri, iobuf, и т.д..
Т.е. явно указывать о двунаправленной ноге.
Цитата(Methane @ Dec 17 2010, 17:13)

А какая разница?
Ну написал я
if(...)begin
enable <= 1'b1;
bus_out <= 1'b1;
end
Этот кусок ни о чем не говорит. Если это без else, квартус должен выкинуть этот триггер по умолчанию.
Наверно идея далека от реальности.
пример
Код
`timescale 1 ns / 1 ps
module bi_dir
(
input clk_60,
input ena,
inout [3:0] data,
input oe_n
);
reg [3:0] data_rg = 4'd0;
always @(posedge clk_60)
begin
if(ena) data_rg <= data;
end
assign data = (!oe_n) ? data_rg : 4'hz;
endmodule
Methane
Dec 17 2010, 11:53
Не понял. Так что мне написать чтобы задержек не было?
EvgenyNik
Dec 17 2010, 12:05
А дело не может быть банально в малом соотношении временного шага моделирования и периода тактирования?
Methane
Dec 17 2010, 12:30
Цитата(Methane @ Dec 17 2010, 16:53)

Не понял. Так что мне написать чтобы задержек не было?
Понял. Пробую.
С ALTIOBUF таже фигня.
Koluchiy
Dec 17 2010, 12:37
Цитата
С ALTIOBUF таже фигня.
Покажите текст.
Methane
Dec 19 2010, 04:03
Цитата(Koluchiy @ Dec 17 2010, 17:37)

Покажите текст.
Ну какой текст может быть? Есть модуль, у него есть oe, пин, вход и выход нарисованый в мегавизарде. На вход модуля подаю сигнал синхронно с oe, (SPI делаю). Подключил signal tap ко входу, выходу и пину. Вижу что на пине сигнал сдвинут на один такт, относительно входа модуля, и выход модуля сигнал еще на 1 сдвинут.
Koluchiy
Dec 19 2010, 07:18
Вы понимаете, эти буферы - очень простая штука, с которыми проблем быть не должно в принципе.
А они есть.
Значит, что-то простое или написано не так, как надо, или работает не так, как надо.
Кстати, какое семейство?
Methane
Dec 19 2010, 07:22
Цитата(Koluchiy @ Dec 19 2010, 12:18)

Вы понимаете, эти буферы - очень простая штука, с которыми проблем быть не должно в принципе.
А они есть.
Значит, что-то простое или написано не так, как надо, или работает не так, как надо.
Вот то-то и оно. Но. Сигнал-тап говорит совсем иначе. Что там можно напутать я не представляю. Может быть какая-то фишка именно реализации порта. Хотя КАК?
Цитата
Кстати, какое семейство?
Ария вторая. Но фишка в том, что тот кусок должен работать и на максе втором. Не хочется плодить сущностей.
Koluchiy
Dec 19 2010, 07:40
Цитата
Что там можно напутать я не представляю.
Если Вы рассчитываете на помощь, давайте необходимые данные.
А что говорит симулятор?
Цитата
Ария вторая.
А там нет какой-нибудь фишки типа обязательного подключения сигнала разрешения через триггер блока I/O?
Methane
Dec 19 2010, 07:53
Цитата(Koluchiy @ Dec 19 2010, 12:40)

Если Вы рассчитываете на помощь, давайте необходимые данные.
Так я уже сказал что мог.
Цитата
А что говорит симулятор?
О! Это идея. Надо сделать небольшой проектик и прогнать только IO в симуляторе.
Цитата
А там нет какой-нибудь фишки типа обязательного подключения сигнала разрешения через триггер блока I/O?
Не встречал. Я просто попробовал на верилоге написать, через assign, потом сгенерил мегавизардом. Одинаково работает. В понедельник буду дальше копать.
Так сделайте простейший проект с "глюком" и выложите сюда. Может быть, и выкладывать не придется, все окажется просто. Как говорится, "разделяй и властвуй".
P.S. пока писал, сами к этому пришли
Shtirlits
Dec 19 2010, 08:04
Где видна проблема, в симуляторе или в железе, осциллографом, signal-tap-ом или микроконтроллером на SPI?
По слову SPI возникла ассоциация - времянки, задержки на буферах, clock-to-output.
Кстати, какая частота?
Если вы делаете SPI-slave, который тактируется внешним клоком, то допустимая частота может оказаться довольно низкой, так как пройдет несколько наносекунд пока клок пройдет входной буфер, пока запитает клоковую сеть, потом должен выходной регистр сработать и его выход дойти до ножки и остатка от периода должно хватить приемнику на другом конце провода.
Мне пришлось задать все констрейны (в xilinx offset in, offset out), отрегулировать slew rate, а главное - использовать локальные ресурсы разводки для клока.
Methane
Dec 19 2010, 08:11
Цитата(Shtirlits @ Dec 19 2010, 13:04)

Где видна проблема, в симуляторе или в железе, осциллографом, signal-tap-ом или микроконтроллером на SPI?
По слову SPI возникла ассоциация - времянки, задержки на буферах, clock-to-output.
Кстати, какая частота?
Тактовая в системе 125. SPI - половина от нее.
Цитата
Если вы делаете SPI-slave,
Нет. Мастер. И частота не большая. Причем если OE всегда в 1, то все нормально работает. Собственно я сделал двунаправленную шину, и у меня флешка перестала отвечать. Стал копать в чем дело, а оказалось что на такт MOSI сместился.
Shtirlits
Dec 19 2010, 08:18
Предлагаю гипотезу - сместился не на такт, а на время сопоставимое с периодом.
Добавление OE может блокировать упаковку выходного регистра и он, бедный, лежит теперь где-то посреди фабрик.
Проверьте, не пропущены ли какие-то констрейны.
Methane
Dec 19 2010, 08:24
Цитата(Shtirlits @ Dec 19 2010, 13:18)

Предлагаю гипотезу - сместился не на такт, а на время сопоставимое с периодом.
Сдвиговый регистр в 8бит на второй Арии при тактовой 125?
Цитата
Добавление OE может блокировать упаковку выходного регистра и он, бедный, лежит теперь где-то посреди фабрик.
Проверьте, не пропущены ли какие-то констрейны.
Не понял. На тайминги квартус не ругается, и ворнинги на мой SPI не говорит.
Shtirlits
Dec 19 2010, 08:35
Неужели на 16 ns +/- 1ns смещение?
Утверждение, что сломалось после добавления OE вызывает подозрение, что OE мешает упаковке, так как некоторые ресурсы в блоке ввода-вывода разделены между входным, выходным и регистром OE. В том числе reset, ClkOut и CE.
Aria - большая микросхема. Если регистр положить в один конец уже подзабитого кристалла, то до другого конца оно может не за одну наносекунду долететь.
Кроме того, если делать выход клока не по-пацански, через DDR, то будет заметный skew между данными и клоком на выходе.
Сочетание перечисленного может мешать работе схемы.
У вас констрейны как заданы, только частота или смещения входа и выхода относительно клока тоже?
Может, съехал сам клок?
Methane
Dec 19 2010, 13:08
У меня клок один - 125 мегагерц. А клок SPIя не клок вовсе с точки зрения альтеры.
Shtirlits
Dec 19 2010, 13:20
Правильно ли я понял, что общий клок 125 MHz распространяется через глобальное дерево, им же питается инвертируемый на каждом такте регистр для генерации клока SPI (который потом перезахватывается в регистре выходного блока) и выдается наружу?
PS:
Кроме клока есть еще clock enable и set/reset, которые зависят от синтеза и тоже мешают упаковке регистров в блок ввода-вывода.
Signal tap тут не поможет.
Methane
Dec 19 2010, 13:28
Цитата(Shtirlits @ Dec 19 2010, 18:20)

Правильно ли я понял, что общий клок 125 MHz распространяется через глобальное дерево, им же питается инвертируемый на каждом такте регистр для генерации клока SPI (который потом перезахватывается в регистре выходного блока) и выдается наружу?
Угу.
что-то вроде
spi_clk <= ~spi_clk;
if (spi_clk)begin
data[7:0] <= { data[6:0] , 1'b0}
spi_data <= data[7]
spi_oe <= 1'b1;
end
Цитата
PS:
Кроме клока есть еще clock enable и set/reset, которые зависят от синтеза и тоже мешают упаковке регистров в блок ввода-вывода.
Signal tap тут не поможет.
Где clock enable? В двунаправленной шине?
Shtirlits
Dec 19 2010, 14:07
spi_clk вполне может синтезироваться в ClockEnable для всех сигналов внутри if, если я правильно понял выдранный из контекста участок кода.
Теперь, если выдать этот самый spi_clk наружу, то непонятно, как его регистр может быть упакован.
Можно ли задержать на такт и клок и данные? Тогда дополнительные регистры помогут размещению.
В общем, если так уж не хочется делать констрейны, то можно применить какие-то базовые элементы для регистров внутри блоков ввода-вывода. Сходу не нашел ничего лучше ALTDDIO_BIDIR. У xilinx обычно для этого применял отдельно буфер ввода-вывода и отдельно регистр рядом с ножкой.
Прикручивание этих элементов к своей схеме и выявит все, что на самом деле хочет квартус.
Смотрю на "Figure 6–3"
http://www.altera.com/literature/hb/arria-...gx_handbook.pdf
warrior-2001
Dec 20 2010, 04:22
По опыту работы с констрейны могу посоветовать следующее: После обявление двунаправленной шины старые команды типа set_false_path -from [get_clocks {A}] -to [get_clocks {B}] сбивают с толку компилятор. Отсюда и отсутствие ворнингов о том, что констрейны выполнены. Сам не раз натыкался на подобное.
Methane
Dec 20 2010, 04:27
Цитата(warrior-2001 @ Dec 20 2010, 09:22)

По опыту работы с констрейны могу посоветовать следующее: После обявление двунаправленной шины старые команды типа set_false_path -from [get_clocks {A}] -to [get_clocks {B}] сбивают с толку компилятор. Отсюда и отсутствие ворнингов о том, что констрейны выполнены. Сам не раз натыкался на подобное.
Если честно, то не понял ничего.
Сейчас смотрю altddio_bidir
warrior-2001
Dec 20 2010, 10:53
Цитата(Methane @ Dec 19 2010, 14:24)

...На тайминги квартус не ругается, и ворнинги на мой SPI не говорит.
Цитата(Methane @ Dec 20 2010, 10:27)

Если честно, то не понял ничего.
Сейчас смотрю altddio_bidir
Я высказал предположение о том, почему квартус не ругается на тайминги. Думается мне, что действительно сдвиг не на так, а просто задержка оказалась примерно равна такту, вот сигналтап и показывает вам смещение на такт. Он по другому не умеет. Если у вас в проекте вообще отсутствуют *.sdc файлы, то тогда - другое дело.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.