Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема: multiple driver
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Veg@
Возможно глупый вопрос: в Verilog-коде при создании нескольких блоков always нельзя присваивать значения регистру более чем в одном блоке. Например:
Код
reg a;

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

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

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

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

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

А как Вы себе представляете схемотехнически реализацию триггера, работающего по фронтам разных клоков? Словами лучше опишите чего требуется.
Arranje
Мне в голову приходит только 2 решения проблемы:

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

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

Пока больше идей нет.
Veg@
Цитата
Словами лучше опишите чего требуется.

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

Ну этих данных недостаточно laughing.gif
Могу посоветовать использовать один клок для тактирования триггера, а с помощью второго получать некий разрешающий сигнал для управления работой этого же триггера.
iosifk
Цитата(Veg@ @ Jul 27 2010, 15:45) *
Необходимо сделать флаг и счетчик, управляемые из обоих блоков.

На самом деле, такого просто не бывает. Не работает логика от двух клоков. Всегда если есть две частоты, то они хотя бы на порядок отличаются друг от друга. Ну, если только это не частоты каких нибудь Tx и Rx... И эти частоты всегда ниже системной тактовой частоты, которая работает по всему проекту...
Поэтому Вам нужно сделать CDC, подогнать все под системную частоту. И сразу все проблемы исчезнут...
Удачи!
vadon
необходимо взять третий clock минимум в 2 раза выше clk1, clk2 , стробировать им перепады на clk1,clk2 и вместе с ними новые значения а.
Veg@
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, то компиляция проходит успешно. С чем это связано?
bogaev_roman
Цитата(Veg@ @ Jul 30 2010, 15:30) *
1. Имеет ли место применение для синхронизации блоков более упрощенного способа: с помощью оператора wait, подобно приведенному примеру для симуляции в одной из книг?:
(Поляков А.К. Языки VHDL и Verilog)
Неудачный пример привели, он вообще не синтезируем. Какая именно Вам синхронизация нужна? Используйте fifo, 2 последовательных регистра на разных частотах - куча вариантов есть.
Цитата
2. При одинаковых clock'ах также возникает проблема.
Если же присваивать значение, например, out2, то компиляция проходит успешно. С чем это связано?

Про присваивание регистру неких значений в разных always Вам уже писали.
Результат работы приведенного кода даже при удачной компиляции всегда будет в состоянии Х. А то, что там как-то случаяно откомпилировалось, так это просто шаманство, приведите нормальный код.
Veg@
Цитата
Используйте fifo

В смысле в одном блоке толкать данные в очередь, а в другом извлекать? Не могли бы Вы привести конкретный пример для пояснения?
bogaev_roman
Цитата(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. Естественно это просто пример, можно тут накрутить переполнение, опустошение, реализовать все на памяти и т.д. Факт в том, что данные записываются в регистр на одной частоте, а считываются на другой.
Я просто пытаюсь понять, что Вам требуется - пересинхронизация или буфер какой?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.