|
|
  |
Проблема: multiple driver |
|
|
|
Jul 27 2010, 11:05
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416

|
Возможно глупый вопрос: в Verilog-коде при создании нескольких блоков always нельзя присваивать значения регистру более чем в одном блоке. Например: Код reg a;
always @(posedge clk1) a = 1; always @(posedge clk2) a = 2; Можно ли выполнить эту задачу каким-либо другим образом?
|
|
|
|
|
Jul 27 2010, 11:16
|
Профессионал
    
Группа: Свой
Сообщений: 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; Можно ли выполнить эту задачу каким-либо другим образом? А как Вы себе представляете схемотехнически реализацию триггера, работающего по фронтам разных клоков? Словами лучше опишите чего требуется.
|
|
|
|
|
Jul 27 2010, 11:42
|
Участник

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

|
Мне в голову приходит только 2 решения проблемы:
Если у вас есть опорный клок, который по частоте сильно превосходит оба клока или он кратен clk1 и clk2, то можно решить эту проблему выделением фронтов клоков clk1, clk2 по опорному клоку. Будет приблизительно описанное вами поведение. Такое клок можно сгенерировать при помощи PLL, если clk1 и clk2 достаточно малы.
Если clk1 сгенерирован на основе clk2 (или наоборот) и кратен, то можно обойтись без опорного клока.
Пока больше идей нет.
Сообщение отредактировал Arranje - Jul 27 2010, 11:43
|
|
|
|
|
Jul 27 2010, 11:45
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416

|
Цитата Словами лучше опишите чего требуется. Необходимо сделать флаг и счетчик, управляемые из обоих блоков.
|
|
|
|
|
Jul 27 2010, 11:56
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Veg@ @ Jul 27 2010, 15:45)  Необходимо сделать флаг и счетчик, управляемые из обоих блоков. На самом деле, такого просто не бывает. Не работает логика от двух клоков. Всегда если есть две частоты, то они хотя бы на порядок отличаются друг от друга. Ну, если только это не частоты каких нибудь Tx и Rx... И эти частоты всегда ниже системной тактовой частоты, которая работает по всему проекту... Поэтому Вам нужно сделать CDC, подогнать все под системную частоту. И сразу все проблемы исчезнут... Удачи!
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Jul 30 2010, 11:30
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jul 30 2010, 13:08
|
Профессионал
    
Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082

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

|
Цитата Используйте fifo В смысле в одном блоке толкать данные в очередь, а в другом извлекать? Не могли бы Вы привести конкретный пример для пояснения?
|
|
|
|
|
Aug 2 2010, 10:48
|
Профессионал
    
Группа: Свой
Сообщений: 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. Естественно это просто пример, можно тут накрутить переполнение, опустошение, реализовать все на памяти и т.д. Факт в том, что данные записываются в регистр на одной частоте, а считываются на другой. Я просто пытаюсь понять, что Вам требуется - пересинхронизация или буфер какой?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|