Вождение двунаправленных линий в Verilog - PullRequest
2 голосов
/ 21 февраля 2011

этот вопрос, вероятно, не очень хорошо объясним, и это потому, что я не совсем понимаю, что происходит в моем дизайне.

Мне нужно использовать коммуникационную шину I2C для связи с камерой (Terasic D5M), поэтому я попытался написать ее с помощью Verilog. Мне нужен только мастер. На моем логическом анализаторе все выглядит отлично, за исключением того, что я продолжаю получать сигналы NACK от камеры. Сначала я понятия не имел, что случилось, поэтому просто отложил это в сторону.

Сегодня вечером я попытался использовать IP ядро ​​Университета Альтера, в котором есть модуль для D5M. После настройки автоматической инициализации я наблюдал за тем, что происходит на моем анализаторе. Трассировка выглядит так же, как вывод из моего модуля I2C, за исключением того, что устройство регистрирует ACK.

Моя проблема в том, что я не могу понять, почему я не получаю подтверждения. Возможно, я не позволяю камере тянуть линию sda на низком уровне (scl работает нормально), но я не могу понять, почему это так.

У кого-нибудь есть подобный опыт или есть идеи, куда мне обратиться, посмотреть / опубликовать / прочитать? Я бы опубликовал некоторый код, но я не знаю, насколько он будет полезен, если он не полностью. Извините за то, что я такой расплывчатый, но я действительно потерян и даже не знаю, о чем должен спрашивать; Я думаю, что это аналогичный эффект запроса. Спасибо за любую помощь, вот немного кода для строк вывода из модуля i2c.


`define HIGH  1'bZ
`define TRUE  1'b1
`define FALSE 1'b0

inout sda;
assign sda = (ena_sda)?sda_bit:`HIGH;

inout scl;
assign scl = (ena_scl)?pSCL:`HIGH;

pSCL - это часы, которые работают с желаемой частотой, а sda_bit - это значение линии sda во время работы. Вот раздел, который выпускает и ждет подтверждения. Это встроено в мое состояние смещения, отсюда и начало, если.


// Data shifting complete, check for ACK
// Release the SDA line and set our bit to high Z
else if(shiftComplete == `TRUE) begin
    ena_sda = `FALSE;
    sda_bit = `HIGH;
    if(negedge_SCL) begin
        ena_sda = `TRUE;                        
        case(i2cState)
            `DATA_STATE:
                begin
                    shiftComplete = `FALSE;
                    nxState = `DATA_STATE;
                end
            `START_STATE: nxState = `REPEAT_START_STATE;
             default: nxState = `STOP_STATE;
        endcase
    end
end /* end ACK */

Я бы подумал, что выпуска ena_sda будет достаточно, чтобы позволить камере управлять модулем. Я думаю, что я поставил sda_bit = HIGH перед тестом (я не смотрел на это в течение месяца).

Я был бы рад поделиться большим количеством кода или показать свои логические следы, но я не хочу больше загромождать это. Спасибо за чтение.

1 Ответ

2 голосов
/ 21 февраля 2011

Я бы разделил ввод и вывод и добавил бы к этому разрешение на вывод, в основном не использовал бы inout. Поддерживает ли панель ввода / вывода вашего altera устройства такое использование? (они должны) Если это так, пусть панель ввода / вывода выполняет входную работу. Также вы определили площадку ввода / вывода как двухтактную или проводную или слабую или любую другую? В некоторых случаях вы можете выбрать двухтактный режим, когда выход включен, а когда вход - три состояния, позволяющие другой стороне контролировать линию данных.

...