woofer46 0 23 ноября, 2015 Опубликовано 23 ноября, 2015 · Жалоба Здравствуйте! Вопрос, можноли выводить данные следующим образом: input ZPR1; input ZPR2; input CLK; output reg [9:0]OUT; always@(posedge CLK) begin if((ZPR1==1)&&(ZPR2==0)) begin OUT[9:0]=10'd100; end if((ZPR1==0)&&(ZPR2==1)) begin OUT[9:0]=10'd200; end if((ZPR1==0)&&(ZPR2==0)) begin OUT[9:0]=10'd0; end end Если вывожу следующим образом данные, то модуль не работает, стоит закоментировать OUT[9:0]=10'd200; и все работает. Запросы приходят следующим образом Если дергаю ножкой в одном из условий, часто идут провалы, пускал счетчик место констат - счет происходил неверно. Можно ли выводить данные на одну линию поочереди по таким условиям, или проблема может быть в чем-то другом? Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x736C 0 23 ноября, 2015 Опубликовано 23 ноября, 2015 · Жалоба Здравствуйте! Рекомендую ознакомиться с темой присваиваний в Verilog http://svo.2.staticpublic.s3-website-us-ea...og/assignments/ Я бы использовал оператор Case или комбинационную запись: assign out _nxt = ( ) ? : ; Если Вы используете If, то должны быть операторы else. Должно быть определено значение по умолчанию. Третье условие можно использовать, как дефолтное. Погуглите "if verilog". Информации, как правильно использовать, предостаточно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 23 ноября, 2015 Опубликовано 23 ноября, 2015 · Жалоба или проблема может быть в чем-то другом? Клок пропускаете через логику? Если да, то проблема в асинхронщине. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 23 ноября, 2015 Опубликовано 23 ноября, 2015 · Жалоба Проблема в синхронизации - надо оба входных сигнала синхронизировать к CLK. Да, и стоит использовать "<=" вместо "=". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x736C 0 23 ноября, 2015 Опубликовано 23 ноября, 2015 · Жалоба Проблема в синхронизации - надо оба входных сигнала синхронизировать к CLK. Почему Вы решили, что они не синхронизированы? Вроде явно это ниоткуда не следует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 23 ноября, 2015 Опубликовано 23 ноября, 2015 · Жалоба Почему Вы решили, что они не синхронизированы? Вроде явно это ниоткуда не следует. Это правда, но из фразы "дергаю ножкой в одном из условий, часто идут провалы" можно предположить, что что-то не то с синхронизацией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 24 ноября, 2015 Опубликовано 24 ноября, 2015 · Жалоба По поводу синхронизации, пробовал следующим образом, результат был такой же input ZPR1; input ZPR2; input CLK; output reg [9:0]OUT; always@(ZPR1 or ZPR2) ////////////////////////////////////// begin if((ZPR1==1)&&(ZPR2==0)) begin OUT[9:0]=10'd100; end if((ZPR1==0)&&(ZPR2==1)) begin OUT[9:0]=10'd200; end if((ZPR1==0)&&(ZPR2==0)) begin OUT[9:0]=10'd0; end end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 24 ноября, 2015 Опубликовано 24 ноября, 2015 · Жалоба По поводу синхронизации, пробовал следующим образом, результат был такой же input ZPR1; input ZPR2; input CLK; output reg [9:0]OUT; always@(ZPR1 or ZPR2) ////////////////////////////////////// begin if((ZPR1==1)&&(ZPR2==0)) begin OUT[9:0]=10'd100; end if((ZPR1==0)&&(ZPR2==1)) begin OUT[9:0]=10'd200; end if((ZPR1==0)&&(ZPR2==0)) begin OUT[9:0]=10'd0; end end Это не синхронизация. Такая конструкция не может быть исполнена в железе. Как сказали ранее, нужно более детальное описание. Не понятно что, откуда и куда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 24 ноября, 2015 Опубликовано 24 ноября, 2015 · Жалоба CLK - 80МHz Длительность запросов 10мкс Между первым и вторым запросом 64мкс Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 24 ноября, 2015 Опубликовано 24 ноября, 2015 (изменено) · Жалоба Здравствуйте! Рекомендую ознакомиться с темой присваиваний в Verilog http://svo.2.staticpublic.s3-website-us-ea...og/assignments/ Я бы использовал оператор Case или комбинационную запись: assign out _nxt = ( ) ? : ; Если Вы используете If, то должны быть операторы else. Должно быть определено значение по умолчанию. Третье условие можно использовать, как дефолтное. Погуглите "if verilog". Информации, как правильно использовать, предостаточно. input ZPR1; input ZPR2; input CLK; output reg [9:0]OUT; output reg TEST1; always@(posedge CLK) begin if(ZPR1==1) begin OUT<=10'd101; TEST1<=~TEST1; end else if(ZPR2==1) begin OUT<=10'd100; end else begin OUT<=10'b0; end end не очень представляю как описать это через assign Результат выполнения такой: Изменено 24 ноября, 2015 пользователем woofer46 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x736C 0 24 ноября, 2015 Опубликовано 24 ноября, 2015 · Жалоба Входы ZPR1 и ZPR2 необходимо синхронизировать, как посоветовали. И выделить из них фронты, которые уже заводить в блок always. А может не нужно. Ибо какой конкретно необходим результат исполнения, не указали. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 24 ноября, 2015 Опубликовано 24 ноября, 2015 · Жалоба не очень представляю как описать это через assign Это курсовик или хотите научиться? Могу предложить персональные занятия... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 24 ноября, 2015 Опубликовано 24 ноября, 2015 (изменено) · Жалоба Я вывожу на одну шину вначале один кусок данных, потом второй, по 2м запросам (10бит+10бит). Проверяю на счетчике, в данном случае у меня счетчик инкрементируется не на 1, а бывает на 2. По ножке TEST1, вижу что бывают сбои и блок выполняется чаще, как на скриншотах выше. Сейчас попробовал так: Проблема не пропала input ZPR1; input ZPR2; output reg TEST1; output wire [9:0] OUT; assign OUT[9:0] = ZPR1?(DATA_CH1[0:9]):(ZPR2?(DATA_CH2[0:9]):0); always@(negedge ZPR11) begin TEST1=~TEST1; DATA_CH1=DATA_CH1+1; if(DATA_CH1==0) begin DATA_CH2=DATA_CH2+1; end end Пробовал синхронизировать ZPR1 и ZPR2 assign zpr = ZPR11|ZPR21; always@(zpr) begin if(ZPR11==1) begin TEST1=1; OUT=DATA_CH1[0:9]; DATA_CH1=DATA_CH1+1; if(DATA_CH1==0) begin DATA_CH2=DATA_CH2+1; end end else if(ZPR2==1) begin TEST1=1; OUT=DATA_CH2[0:9]; end else begin TEST1=0; OUT=10'b0; end end Проблема остается Изменено 24 ноября, 2015 пользователем woofer46 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 24 ноября, 2015 Опубликовано 24 ноября, 2015 · Жалоба Я вывожу на одну шину ... Пока все довольно плохо... Почитайте хотя бы "Краткий Курс" у меня на сайте... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 24 ноября, 2015 Опубликовано 24 ноября, 2015 · Жалоба простейший синхронизатор для сигналов ZPR1 и ZPR2 module in_out_flag ( input in_flag, input out_clk, output ena_out_flag ); reg dff_a = 1'b0; reg [1:0] shift_rg = 2'b00; always @(posedge out_clk or posedge in_flag) begin if(in_flag) dff_a <= 1'b1; else dff_a <= 1'b0; end always @(posedge out_clk) begin shift_rg <= {shift_rg[0], dff_a}; end assign ena_out_flag = ~shift_rg[1] && shift_rg[0]; endmodule читаем "синхронизаторы сигналов, пересекающих клоковый домен (CDC, Clock Domain Cross)" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться