ecs 0 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба так на эти цепи ничего не приходит. Делайте не так, как "удобно", а как "положено" :) Как это не приходит, там подключен модуль D1, в нем data_in_1 и data_in_2 это выходные сигналы, они и выведены на выход Что за модуль D1? Триггер? Что за выходы data_in_1,data_in_2 и если 8 триггеров, то почему одноразрядные? Для чего здесь используете именно блокирующее присваивание, может в нем дело: always@ (posedge clk) begin line_1_in = data_in_1; line_2_in = data_in_2; if (((line_1_in == 1) && (line_2_in == 1)) && ((data_in_1 == 0) && (data_in_2 == 0))) data_out = 'b0; else data_out = 'b1; end Я б для данного случая переписал так: always @(posedge clk) begin line_1_in <= data_in_1; line_2_in <= data_in_2; if (line_1_in&line_2_in&~data_in_1&~data_in_2) data_out <= 1'b0; else data_out <= 1'b1; end Да изменил присваивание все заработало, спасибо, только чем оно отличается от другого я так и не понял:( и вот это &~ это же редукционное И-НЕ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба Да изменил присваивание все заработало, спасибо, только чем оно отличается от другого я так и не понял:( и вот это &~ это же редукционное И-НЕ? Если заработало - хорошо. Ну так какая разница - редукционное или нет, у Вас сигналы одноразрядные. Про блокирующие/неблокирующие присваивания и правильность их использования написано много, разводить "Холид Вар" не буду, можете поиском здесь воспользоваться или в любой книге почитать по проектированию на ПЛИС. В последовательных схемах всегда использую неблокирующее только по одной причине - моделирую на modelsim и VCS, во втором случае компилятор написан криво и неправильно воспринимает блокирующее присваивание - вместо триггера сделает обычную комбинаторику. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба так покажите ужо и verilog_test #(size) D1(clk,ena,data_in,data_in_1,data_in_2); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ecs 0 2 февраля, 2011 Опубликовано 2 февраля, 2011 (изменено) · Жалоба / / имя модуля, переменная ширина данных, список портов------------------------; module verilog_test (clk,ena,data_in,data_out_1,data_out_2); // описание используемых сигналов; parameter size = 8; input [size-1:0] data_in; input clk, ena; output data_out_1; output data_out_2; //----------------------------------------------------------------------------; wire [size-1:0] data_cnt; wire data_out_serial; reg data_out_1; reg data_out_2; reg test_1; reg test_2; //----------------------------------------------------------------------------; // начальные установки--------------------------------------------------------; initial begin data_out_1 = 1; data_out_2 = 1; test_1 = 1; end //----------------------------------------------------------------------------; // сериалайзер парал. шину преобразует в последовательную---------------------; shifter #(size) D1(clk,data_in,ena,data_out_serial); counter #(size) D2(clk,ena,data_cnt); // старт стоп данных data_out_1 и data_out_2 провалы в 0; always@(posedge clk) // событие begin test_2 = data_cnt < size; // контрольный сигнал, конец посылки test_1 = data_out_serial; // контрольный сигнал, полезные данные if (ena == 1) // старт begin data_out_1 = 'b0; data_out_2 = 'b0; end else if (data_cnt == size) // стоп begin data_out_1 = 'b0; data_out_2 = 'b0; end else begin if (test_2 == 1) // данные на линии begin if (test_1 == 1) begin if (data_out_1 == 'b0) begin data_out_1 = 'b1; end else begin data_out_1 = 'b0; end end else begin if (data_out_2 == 'b0) begin data_out_2 = 'b1; end else begin data_out_2 = 'b0; end end end else // состояние ожидания begin data_out_1 = 'b1; data_out_2 = 'b1; end end end //---------------------------------------------------------------------------; endmodule На входе имеется паралельная шина данных -> далее данные с помощью сдвигового регистра преобразуются в последовательную и далее данные выводятся на две линии где, каждый бит передаётся перепадом сигнала. Если бит равен 1, то перепад происходит на одной линии, а если 0, то на другой. Изменено 2 февраля, 2011 пользователем ecs Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба always@ (posedge clk) begin line_1_in = data_in_1; line_2_in = data_in_2; if (((line_1_in == 1) && (line_2_in == 1)) && ((data_in_1 == 0) && (data_in_2 == 0))) ... При блокирующих присваиваниях сначала вы приравниваете line data, а в if они уже равны, и условие никогда не выполняется. А при неблокирующих присваиваниях значения line и остальных выходных сигналов изменятся одновременно, по фронту тактов. Т.е., достаточно в первых двух строках заменить = на <= Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bogaev_roman 0 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба Т.е., достаточно в первых двух строках заменить = на <= А то что ниже оставить блокирующими В итоге в одном always блоке оставить два типа (в данном примере то оно прокатит), а потом случаяно при отладке блокирующее поместить между ними. Вот с таким вот постоянно и приходится встречаться, а потом выковыривать ошибки в чужих проектах. Мой совет ecs, не используйте для одной переменной разные типы присваиваний, не используйте в одном always блоке разные типы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 февраля, 2011 Опубликовано 2 февраля, 2011 · Жалоба Мой совет ecs, не используйте для одной переменной разные типы присваиваний, не используйте в одном always блоке разные типы. Не возражаю. Просто для понимания этих вещей можно и "поизвращаться". Я показал достаточное решение, минимально необходимое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться