Перейти к содержанию
    

так на эти цепи ничего не приходит.

Делайте не так, как "удобно", а как "положено" :)

 

Как это не приходит, там подключен модуль 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

 

Да изменил присваивание все заработало, спасибо, только чем оно отличается от другого я так и не понял:( и вот это &~ это же редукционное И-НЕ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да изменил присваивание все заработало, спасибо, только чем оно отличается от другого я так и не понял:( и вот это &~ это же редукционное И-НЕ?

Если заработало - хорошо. Ну так какая разница - редукционное или нет, у Вас сигналы одноразрядные.

Про блокирующие/неблокирующие присваивания и правильность их использования написано много, разводить "Холид Вар" не буду, можете поиском здесь воспользоваться или в любой книге почитать по проектированию на ПЛИС.

В последовательных схемах всегда использую неблокирующее только по одной причине - моделирую на modelsim и VCS, во втором случае компилятор написан криво и неправильно воспринимает блокирующее присваивание - вместо триггера сделает обычную комбинаторику.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так покажите ужо и

verilog_test #(size) D1(clk,ena,data_in,data_in_1,data_in_2);

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

/

/ имя модуля, переменная ширина данных, список портов------------------------;
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, то на другой.

Изменено пользователем ecs

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 и остальных выходных сигналов изменятся одновременно, по фронту тактов.

Т.е., достаточно в первых двух строках заменить = на <=

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е., достаточно в первых двух строках заменить = на <=

А то что ниже оставить блокирующими :biggrin:

В итоге в одном always блоке оставить два типа (в данном примере то оно прокатит), а потом случаяно при отладке блокирующее поместить между ними. Вот с таким вот постоянно и приходится встречаться, а потом выковыривать ошибки в чужих проектах. Мой совет ecs, не используйте для одной переменной разные типы присваиваний, не используйте в одном always блоке разные типы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мой совет ecs, не используйте для одной переменной разные типы присваиваний, не используйте в одном always блоке разные типы.

Не возражаю. Просто для понимания этих вещей можно и "поизвращаться". Я показал достаточное решение, минимально необходимое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...