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

Использование регистра как входные данные в другом модуле

Я получаю на выходе первого модуля "LPT_ASK" 2 регистра и хочу использовать их в другом модуле "assignerer".

module LPT_ASK(input wire clk,

                    input wire [7:0]Data,

                    input wire strobe,

                    output reg TX,

                    output reg [3:0]TX_data_bit);

reg [7:0]TX_data = 8'b00000000;

reg TX_in_progress = 0;

reg TX_ended = 1;

reg [1:0]strobe_reg;

reg flag;

 

always @(posedge strobe) begin

    TX_data = Data;

end

always @(posedge clk) begin

    strobe_reg[0] <= strobe_reg[1];

    strobe_reg[1] <= strobe;

    if ((strobe_reg[1] == 1)&&(strobe_reg[0] == 0)) begin

        flag =  1;

    end

    if ((flag == 1)&&(TX_in_progress == 0)) begin

        TX_in_progress = 1;

        TX_data_bit = 4'b0000;

        TX = 0;

    end

    if ((TX_in_progress == 1)&&(TX_data_bit < 4'b1000)) begin

        TX = TX_data[TX_data_bit];

        TX_data_bit = TX_data_bit + 4'b0001;

    end else begin

        TX_in_progress = 0;

        TX = 1;

        flag = 0;

    end

end

endmodule

module assignerer

(

                    input wire clk,

                    input wire [7:0]Data,

                    input wire strobe,

                    output wire TX_final,

                    output wire [3:0] TX_final_data_bit

);

wire LPT_ASK_to_assignerer;

wire LPT_ASK_to_assignerer2;

 

LPT_ASK LPT_ASK1

    (

        .clk (clk),

        .Data (Data),

        .strobe (strobe),

        .TX (LPT_ASK_to_assignerer),

        .TX_data_bit (LPT_ASK_to_assignerer2)

    );

    assign TX_final = LPT_ASK_to_assignerer;

    assign TX_final_data_bit = LPT_ASK_to_assignerer2;

endmodule

Quartus не выдает ошибок при компиляции, но не похоже, что моя задумка работает. (на диаграмме (wave form diagram ) не видно присвоения)

Пытался использовать другую конструкцию.

always @(*) TX_final = LPT_ASK_to_assignerer;

Но компилятор ругается и выдает ошибку.

Буду признателен за любую оказанную помощь

 

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


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

В первом модуле в always надо заменить все присвоения с "=" на "<=" (для всех сигналов). Иначе всё портится - сигналы присваиваются и сразу же проверяются.

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


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

3 hours ago, Tealdris said:

always @(*) TX_final = LPT_ASK_to_assignerer

Потому что нужно бы литературу почитать и узнать, что все always'ы идут с неблокирующим присваиванием. Ну и заодно понять что такое блокирующее и неблокирующее присваивания.

А ещё неплохо бы посмотреть на что именно ругается и как. Обычно по коду ошибки легко гуглится причина и ответ

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


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

Только что, Nick_K сказал:

Потому что нужно бы литературу почитать и узнать, что все always'ы идут с неблокирующим присваиванием.

Да ладно. С каких это пор в always нельзя использовать неблокирующее присваивание?

 

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


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

2 minutes ago, andrew_b said:

Да ладно. С каких это пор в always нельзя использовать неблокирующее присваивание?

 

Во-первых я не сказал, что нельзя) А как раз наоборот, что нужно использовать неблокирующее :wink:

А во-вторых да, тупанул. Перепутал возможность использования wire'ов и неблокирующее присваивание.

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


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

23 часа назад, masics сказал:

В первом модуле в always надо заменить все присвоения с "=" на "<=" (для всех сигналов). Иначе всё портится - сигналы присваиваются и сразу же проверяются.

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

Я поигрался с разными вариантами комбинаций, но без изменений.

20 часов назад, Nick_K сказал:

Потому что нужно бы литературу почитать и узнать, что все always'ы идут с неблокирующим присваиванием.

Возникает ошибка ниже если использовать оба типа присваиваний.

always @(*) TX_final = LPT_ASK_to_assignerer

или

always @(*) TX_final <= LPT_ASK_to_assignerer

Error (10137): Verilog HDL Procedural Assignment error at assignerer.v(26): object "TX_final" on left-hand side of assignment must have a variable data type

Да, решение гуглится, например, заменить тип с wire на reg для этой переменной, однако мне нужно использовать переменную TX_final как входные данные для другого модуля, поэтому пытаюсь в wire.

Изначально я грешил на 2 модуль, может там что не так сделал.

Container.docx

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


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

Я набросал картинку с моей идеей - использовать выходные данные как входные в другом модуле. Пока что получается костыль с использованием допольнительного модуля, но ничего лучше в голову не приходит.

 

image.png

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


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

1 час назад, Tealdris сказал:

Error (10137): Verilog HDL Procedural Assignment error at assignerer.v(26): object "TX_final" on left-hand side of assignment must have a variable data type

Это Верилог, коллега. Привыкайте.. Тут многое через одно место сделано.

Всё, что формируется в блоке always, долно иметь тип reg. Независимо от типа присваивания.

Всё, что формируется через assign, долно иметь тип wire, и используется только блокируещее присваивание.

В каком состоянии сознания были те, кто так решил,  теряется во тьме истории.

VHDL обходится безо всего этого маразма и прекрасно себя чувствует.

 

 

 

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


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

4 минуты назад, andrew_b сказал:

Всё, что формируется в блоке always, долно иметь тип reg. Независимо от типа присваивания.

Всё, что формируется через assign, долно иметь тип wire, и используется только блокируещее присваивание.

Звучит как парадокс, неужели это нельзя как то обойти, использую память, ROM например. Правда это еще одно не паханное поле, но хотя бы есть куда двигаться.

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


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

Только что, Tealdris сказал:

Звучит как парадокс,

Таква се ля ви.

Только что, Tealdris сказал:

неужели это нельзя как то обойти, использую память, ROM например

Причём тут ROM? Это язык такой. Сам мучаюсь.

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


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

2 минуты назад, andrew_b сказал:

Причём тут ROM?

Быть может ошибся в названии ячейки, но то что я пока что нашел звучит очень геморойно со всем этим объявлением адресов, записью, чтением по каждой ячейке

 

5 минут назад, andrew_b сказал:

Сам мучаюсь

Есть какой-либо прогресс в мучениях? Быть может можно запариться и собрать все в один модуль, но это не похоже на логичный вариант ответа

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


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

4 hours ago, Tealdris said:

Error (10137): Verilog HDL Procedural Assignment error at assignerer.v(26): object "TX_final" on left-hand side of assignment must have a variable data type

Да, решение гуглится, например, заменить тип с wire на reg для этой переменной, однако мне нужно использовать переменную TX_final как входные данные для другого модуля, поэтому пытаюсь в wire.

Именно про это я и писал. Правда ошибочно назвал неблокирующшим присваиванием.

Если нужно использовать сигнал в always блоке, тогда можно только тип reg. Потом этот тип можно переприсвоить в wire через assign. (assign TX_final = TX_final_reg) и нет проблем. Либо же сразу через assign  задать обьявление.

Кстати сделать выход можно типа reg и сделать прямое присваивание, так тоже должно работать. Короче нужно сначала литературу соответствующую прочитать.

2 hours ago, andrew_b said:

В каком состоянии сознания были те, кто так решил,  теряется во тьме истории.

В Верилоге достаточно просто соблюдать элементарные правила и никаких проблем. А вообще Верилог создавался как язык для тестирования того, что наваяно на VHDL и все эти блок/неблок присваивания, типы wire/reg имеют очень сакраментальное значение и обширное использование в умелых руках. Для этого опять таки нужно правильные книги прочитать и тогда всё станет в разы понятнее и инструмент будет приносить больше удовлдетворения нежели вреда.

Из почитать я бы советовал начать с "101 Gotchas" Там есть многие обьяснения как для SV, так и для чистого Verilog'а. Только вчитываться нужно в каждую строчку.

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


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

12 минут назад, Nick_K сказал:

Если нужно использовать сигнал в always блоке, тогда можно только тип reg. Потом этот тип можно переприсвоить в wire через assign. (assign TX_final = TX_final_reg) и нет проблем.

Если я правильно понял, то

always @(*) 
        begin
    TX_final <= LPT_ASK_to_assignerer; //оба reg
        end    
    assign TX_and = TX_final; //из reg в wire

Однако результат тот же.

Может проблема не в том как я присваиваю значения, а в том как я обьявил модуль.

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


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

1 hour ago, Tealdris said:

Может проблема не в том как я присваиваю значения, а в том как я обьявил модуль

Может. Обычно никто не пишет тип сигнала при объявлении портов (то есть input clk, output TX, без reg или wire) а синтезатор уже сам доделает.

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


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

12 минут назад, Nick_K сказал:

Обычно никто не пишет тип сигнала при объявлении портов (то есть input clk, output TX, без reg или wire)

По дефолу wire. Если выход reg, то писать надо обязательно.

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


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

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

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

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

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

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

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

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

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

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