Перейти к содержанию
    

Прием и последовательная передача данных .

Добрый день всем! Начал потихоньку осваивать Verilog . Сейчас хотелось сделать проектик для работу с микросхемой AD73322 (front-end processor для речи и телефонии).

 

Протокол обмена между fpga и AD73322 следующий:

1. Ждать импульса на линии SDOFS , говорит о том что сейчас будет прием, AD73322 будет передавать пакет fpga

2. Затем принять 16 бит

3. Сделать чего- нибудь с ними(принятыми битами)

4. Сформировать импульс на линии SDIFS , говорит о том что сейчас будет передача ,AD73322 будет принимать пакет от fpga

5. Передать 16 бит

 

как я вижу задачу можно решить с применением FSM(Finite State Machine) дизайна . Просмотрев мануал "Synthesizable Finite State Machine Design Techniques Using the New SystemVerilog 3.0 Enhancements", я остановился на методе с применением 3-х always блоков.

 

вопросы следующие:

 

1. Правильно ли решать подобную задачу с помощью Finite State Machine Design? Есть ли альтернативы?

2. Допусти у меня есть состояния wait_for_SDOF и ready_to_receive, переход из первого во второй осуществляется , по импульсу на линии SDOFS , как это должно выглядеть ? Мой вариант :

 

always @(state,SDOFS) 
begin
    next = 'bx;
    case (state)
        wait_for_SDOFS:     if     (SDOFS)                       next = ready_to_receive;
                        else                           next = wait_for_SDOFS ;
        
        ...
                                
    endcase 
end

 

не надо ли использовать конструкцию

posedge SDOFS

, так как мне нужен именно переход из "0" в "1", но как использовать его в блоке always, если я его запихну туда, ничего хорошего думаю не получиться.

Вообщем как поступают при ожидании синхронизирующего сигнала , как и в моей ситуации ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день всем! Начал потихоньку осваивать Verilog .

Вообщем как поступают при ожидании синхронизирующего сигнала , как и в моей ситуации ?

У меня на сайте "Краткий Курс".

Главы про FSM, Пересечение клоковых доменов и пр...

Еще поищите в сети "синхронное проектирование"...

Остальное - по скайпу...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообщем как поступают при ожидании синхронизирующего сигнала , как и в моей ситуации ?

я бы так

always @(posedge iCLK)
begin
  SDOF_D1 <= SDOF;
  SDOF_D2 <= SDOF_D1;
  SDOF_LOW_TO_HIGH <= ~SDOF_LOW_TO_HIGH & SDOF_D2;
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я бы так

Код

always @(posedge iCLK)

begin

SDOF_D1 <= SDOF;

SDOF_D2 <= SDOF_D1;

SDOF_LOW_TO_HIGH <= ~SDOF_LOW_TO_HIGH & SDOF_D2;

end

 

лучше как iosifk советует через его краткий курс:)...

 

SDOF_LOW_TO_HIGH = 0

SDOF_D2 стал 1

на первом клоке

((~0) & 1) = 1

на втором клоке

((~1)& 1) = 0

на следующем клоке

((~0) & 1) = 1

и так далее - генережка...

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и так далее - генережка...

было бы так, если бы не

Ждать импульса на линии SDOFS

 

---

а вообще да, надо читать :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа спасибо за пищу для размышлений ! будем читать значит :biggrin:

 

и вопрос конечно офтоп , но хотелось бы очень узнать , как ближе перевести понятие "inferred latches" , что защелка это понятно, но какой смысл вкладывают в слово inferred ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

было бы так, если бы не

 

вы знаете длину импульса? Почему вы решили что он будет всего 1 такт? Надо делать надежно, это лучше чем искать почему все так странно...

 

a1<=a
a2<=a1
a3<=a2

if((a3 == 0)&&(a2 == 1)) 
front <= 1;
else
front <= 0;

 

или как в вашем случае

 

 front <= ((~a3)&a2)

 

вот так вы точно получите строб по фронту длительностью в 1 такт. Переменная зависит только от сигнала, нет обратной связи с ней самой, и нет генережки.

 

П,С, все под always @(posedge clk) естественно

 

inferred - это не та случаем которая сохраняет данные без клока, по изменению на входах?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и вопрос конечно офтоп , но хотелось бы очень узнать , как ближе перевести понятие "inferred latches" , что защелка это понятно, но какой смысл вкладывают в слово inferred ?

Обычно так говорит синтезатор, когда в процессе прожёвывания Вашего кода, считает что в нём описаны некие "latches" (а могут быть и любые другие компоненты) и хочет уведомить Вас, что он их там нашёл.

Типа такого (так пишет синтезатор Xilinx-а):

Synthesizing Unit <XXX>.

Related source file is "***.v".

Found 1-bit register for signal <xxx>.

Found 1-bit register for signal <yyy>.

Found 1-bit register for signal <zzz>.

Summary:

inferred 3 D-type flip-flop(s).

Unit <XXX> synthesized.

Т.е. в модуле XXX синтезатор насинтезил три FF-а, о чём и сообщает по завершении процесса.

P.S. Имена действующих лиц изменены по их желанию. :)

Изменено пользователем o_khavin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:) а я какую то глупость написал про инферед), надо было просто перевести дословно что это предполагаемая защелка:)...

 

http://www.xilinx.com/support/answers/39136.htm

вот здесь ксалинкс пишет почему он варнинг дает по этому поводу. в ПЛИС на несколько порядков больше варнингов чем в программизме, да еще часть из них надо прочитать и понять, а не бороться с ними...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

премного благодарствую !

 

вот здесь капиталисты тоже рассматривают почему inferred latch есть плохо :rolleyes:

 

http://electronics.stackexchange.com/quest...red-latches-bad

Изменено пользователем egorman44

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По мере чтения возникают вопросы.

Во-первых правильно ли я понял, для синхронизации сигнала мне необходим синхронизатор :biggrin: (например два последовательных D- триггер). Он выглядит следующим образом:

 

always @(posedge SCLK)
begin
    a1 <= SDOFS;
    a2 <= a1;
    a3 <= a2;    
    SDOFS_risingedge <= ((~a3)&a2);
end

 

В таком случае , задержка при определение переднего фронта SDOFS составит 2 такта синхросигнала. Как мне говорит даташит

 

"SDOFS Framing Signal Output for SDO Serial Transfers. The frame sync is one bit wide and is active one SCLK period

before the first bit (MSB) of each output word. SDOFS is referenced to the positive edge of SCLK. SDOFS is in

three-state when SE is low." ,

 

После импульса SDOFS , длинной один такт SCLK, сразу следует первый бит посылки. Т.е. должен ли я исправить код на

 

always @(posedge SCLK)
begin
    a1 <= SDOFS;
    a2 <= a1;
    SDOFS_risingedge <= ((~a2)&a1);
end

 

чтобы не пропустить первый бит ? Или есть другие решения ?

 

Изменено пользователем egorman44

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По мере чтения возникают вопросы.

Во-первых правильно ли я понял, для синхронизации сигнала мне необходим синхронизатор :biggrin: (например два последовательных D- триггер). Он выглядит следующим образом:

чтобы не пропустить первый бит ? Или есть другие решения ?

А почему Вы решили, что синхронизировать нужно под SCLK?

Неужели я так непонятно написал про Пересечение клоковых доменов в "Кратком курсе"?

Еще я написал - поищите в сети "синхронное проектирование".. Ну и как, помогло? Или как обычно? Читать лень, лучше спросить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не вдаваясь в подробности мануала, вы можете пропустить через D триггера все сигналы, тогда сигналы между собой не разойдутся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По мере погружения , появляются еще некоторый вопросы , требующие разъяснения :biggrin:

 

Хотел спросить о генерации сигнала сброса . Порыскал на просторах и нашел в книге Полякова (это в главе посвященной верификации) следующее:

 

initial 
begin
    RESET_INV = 1'b0; 
    repeat(10) @(posedge SCLK);
    RESET_INV <= 1'b1;
end

 

Почему товарищ использует в одном initial блоке blocking и non-blocking assignment или для верификации так можно ? Я переправил ,

RESET_INV = 1'b1;

Вроде бы работает, но посмотрев RTL Viewer не увидел никакой синтезируемой схемы, привязанной к выходу RESET_INV, а лишь высокий уровень 1'h1 . Хотелось , бы услышать как ПРАВИЛЬНО исполнять сие?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

initial 
begin
    RESET_INV = 1'b0; 
    repeat(10) @(posedge SCLK);
    RESET_INV <= 1'b1;
end

 

но посмотрев RTL Viewer не увидел никакой синтезируемой схемы, привязанной к выходу RESET_INV

 

а как можно rtl viewer'ом посмотреть тестбенч?

 

это же в тестбенче у Вас?))

initial 
begin
    RESET_INV = 1'b0; 
    repeat(10) @(posedge SCLK);
    RESET_INV <= 1'b1;
end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...