реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблема: multiple driver
Veg@
сообщение Jul 27 2010, 11:05
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416



Возможно глупый вопрос: в Verilog-коде при создании нескольких блоков always нельзя присваивать значения регистру более чем в одном блоке. Например:
Код
reg a;

always @(posedge clk1)
  a = 1;
always @(posedge clk2)
  a = 2;

Можно ли выполнить эту задачу каким-либо другим образом?
Go to the top of the page
 
+Quote Post
des00
сообщение Jul 27 2010, 11:13
Сообщение #2


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Veg@ @ Jul 27 2010, 06:05) *
Возможно глупый вопрос: в Verilog-коде при создании нескольких блоков always нельзя присваивать значения регистру более чем в одном блоке. Например:

в верилоге можно, в большинстве плис и цплд нельзя. но всё решаемо, зависит от задачи. телепаты в отпуске %)


--------------------
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Jul 27 2010, 11:16
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата(Veg@ @ Jul 27 2010, 15:05) *
Возможно глупый вопрос: в Verilog-коде при создании нескольких блоков always нельзя присваивать значения регистру более чем в одном блоке. Например:
Код
reg a;

always @(posedge clk1)
  a = 1;
always @(posedge clk2)
  a = 2;

Можно ли выполнить эту задачу каким-либо другим образом?

А как Вы себе представляете схемотехнически реализацию триггера, работающего по фронтам разных клоков? Словами лучше опишите чего требуется.
Go to the top of the page
 
+Quote Post
Arranje
сообщение Jul 27 2010, 11:42
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 5-02-09
Пользователь №: 44 455



Мне в голову приходит только 2 решения проблемы:

Если у вас есть опорный клок, который по частоте сильно превосходит оба клока или он кратен clk1 и clk2, то можно решить эту проблему выделением фронтов клоков clk1, clk2 по опорному клоку. Будет приблизительно описанное вами поведение.
Такое клок можно сгенерировать при помощи PLL, если clk1 и clk2 достаточно малы.

Если clk1 сгенерирован на основе clk2 (или наоборот) и кратен, то можно обойтись без опорного клока.

Пока больше идей нет.

Сообщение отредактировал Arranje - Jul 27 2010, 11:43
Go to the top of the page
 
+Quote Post
Veg@
сообщение Jul 27 2010, 11:45
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416



Цитата
Словами лучше опишите чего требуется.

Необходимо сделать флаг и счетчик, управляемые из обоих блоков.
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Jul 27 2010, 11:54
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата(Veg@ @ Jul 27 2010, 15:45) *
Необходимо сделать флаг и счетчик, управляемые из обоих блоков.

Ну этих данных недостаточно laughing.gif
Могу посоветовать использовать один клок для тактирования триггера, а с помощью второго получать некий разрешающий сигнал для управления работой этого же триггера.

Сообщение отредактировал bogaev_roman - Jul 27 2010, 11:57
Go to the top of the page
 
+Quote Post
iosifk
сообщение Jul 27 2010, 11:56
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Veg@ @ Jul 27 2010, 15:45) *
Необходимо сделать флаг и счетчик, управляемые из обоих блоков.

На самом деле, такого просто не бывает. Не работает логика от двух клоков. Всегда если есть две частоты, то они хотя бы на порядок отличаются друг от друга. Ну, если только это не частоты каких нибудь Tx и Rx... И эти частоты всегда ниже системной тактовой частоты, которая работает по всему проекту...
Поэтому Вам нужно сделать CDC, подогнать все под системную частоту. И сразу все проблемы исчезнут...
Удачи!


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
vadon
сообщение Jul 27 2010, 14:58
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 97
Регистрация: 27-07-10
Из: харьков
Пользователь №: 58 632



необходимо взять третий clock минимум в 2 раза выше clk1, clk2 , стробировать им перепады на clk1,clk2 и вместе с ними новые значения а.
Go to the top of the page
 
+Quote Post
Veg@
сообщение Jul 30 2010, 11:30
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416



1. Имеет ли место применение для синхронизации блоков более упрощенного способа: с помощью оператора wait, подобно приведенному примеру для симуляции в одной из книг?:
Прикрепленное изображение
(Поляков А.К. Языки VHDL и Verilog)
2. При одинаковых clock'ах также возникает проблема. Пример:
Код
module test (clk,rst,out1);
  input            clk;
  input            rst;
  output reg    out1;  
  reg                    a,out2;
    
    always @(posedge clk or posedge rst)      
        if (rst) a = 0;
        else if (a) out1 = 1;

  always @(posedge clk or posedge rst)
        if (rst) a = 0;
endmodule

В случае присваивания в строке 9 переменной out1 возникают ошибки компиляции:
Код
Error (10028): Can't resolve multiple constant drivers for net "a" at test.v(12)
Error (10029): Constant driver at test.v(9)
Если же присваивать значение, например, out2, то компиляция проходит успешно. С чем это связано?

Сообщение отредактировал Veg@ - Jul 30 2010, 11:31
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Jul 30 2010, 13:08
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата(Veg@ @ Jul 30 2010, 15:30) *
1. Имеет ли место применение для синхронизации блоков более упрощенного способа: с помощью оператора wait, подобно приведенному примеру для симуляции в одной из книг?:
(Поляков А.К. Языки VHDL и Verilog)
Неудачный пример привели, он вообще не синтезируем. Какая именно Вам синхронизация нужна? Используйте fifo, 2 последовательных регистра на разных частотах - куча вариантов есть.
Цитата
2. При одинаковых clock'ах также возникает проблема.
Если же присваивать значение, например, out2, то компиляция проходит успешно. С чем это связано?

Про присваивание регистру неких значений в разных always Вам уже писали.
Результат работы приведенного кода даже при удачной компиляции всегда будет в состоянии Х. А то, что там как-то случаяно откомпилировалось, так это просто шаманство, приведите нормальный код.
Go to the top of the page
 
+Quote Post
Veg@
сообщение Jul 30 2010, 15:51
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416



Цитата
Используйте fifo

В смысле в одном блоке толкать данные в очередь, а в другом извлекать? Не могли бы Вы привести конкретный пример для пояснения?
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Aug 2 2010, 10:48
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата(Veg@ @ Jul 30 2010, 19:51) *
В смысле в одном блоке толкать данные в очередь, а в другом извлекать? Не могли бы Вы привести конкретный пример для пояснения?

Код
reg [1:0] wraddr,rdaddr;
reg [3:0] data_fifo [0:1];

always @(posedge clk_0)
if (rst) wraddr<=2'd0;
else wraddr<=wraddr+1;

always @(posedge clk_1)
if (rst) rdaddr<=2'd2;
else rdaddr<=rdaddr+1;

always @(posedge clk_0)
case (wraddr)
2'd0:begin
data_fifo[0]<=input_data;
data_fifo[1]<=data_fifo[0];
data_fifo[2]<=data_fifo[1];
data_fifo[3]<=data_fifo[2];
end
2'd1:......................
default: begin .....................
dada_fifo[3]<=input_data;
end
endcase

wire [3:0] output_data=dada_fifo[rdaddr];

Как-то так...
есть 4 элемента по 4 разряда, адрес записи также как и данные меняются на частоте clk_0, адрес чтения на частоте clk_1 и выходные данные на частоте clk_1. Естественно это просто пример, можно тут накрутить переполнение, опустошение, реализовать все на памяти и т.д. Факт в том, что данные записываются в регистр на одной частоте, а считываются на другой.
Я просто пытаюсь понять, что Вам требуется - пересинхронизация или буфер какой?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th July 2025 - 05:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01488 секунд с 7
ELECTRONIX ©2004-2016