Tealdris 0 13 июля, 2020 Опубликовано 13 июля, 2020 · Жалоба Я получаю на выходе первого модуля "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; Но компилятор ругается и выдает ошибку. Буду признателен за любую оказанную помощь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
masics 0 13 июля, 2020 Опубликовано 13 июля, 2020 · Жалоба В первом модуле в always надо заменить все присвоения с "=" на "<=" (для всех сигналов). Иначе всё портится - сигналы присваиваются и сразу же проверяются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 13 июля, 2020 Опубликовано 13 июля, 2020 · Жалоба 3 hours ago, Tealdris said: always @(*) TX_final = LPT_ASK_to_assignerer Потому что нужно бы литературу почитать и узнать, что все always'ы идут с неблокирующим присваиванием. Ну и заодно понять что такое блокирующее и неблокирующее присваивания. А ещё неплохо бы посмотреть на что именно ругается и как. Обычно по коду ошибки легко гуглится причина и ответ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 13 июля, 2020 Опубликовано 13 июля, 2020 · Жалоба Только что, Nick_K сказал: Потому что нужно бы литературу почитать и узнать, что все always'ы идут с неблокирующим присваиванием. Да ладно. С каких это пор в always нельзя использовать неблокирующее присваивание? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 13 июля, 2020 Опубликовано 13 июля, 2020 · Жалоба 2 minutes ago, andrew_b said: Да ладно. С каких это пор в always нельзя использовать неблокирующее присваивание? Во-первых я не сказал, что нельзя) А как раз наоборот, что нужно использовать неблокирующее А во-вторых да, тупанул. Перепутал возможность использования wire'ов и неблокирующее присваивание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tealdris 0 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tealdris 0 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба Я набросал картинку с моей идеей - использовать выходные данные как входные в другом модуле. Пока что получается костыль с использованием допольнительного модуля, но ничего лучше в голову не приходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 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 обходится безо всего этого маразма и прекрасно себя чувствует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tealdris 0 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 4 минуты назад, andrew_b сказал: Всё, что формируется в блоке always, долно иметь тип reg. Независимо от типа присваивания. Всё, что формируется через assign, долно иметь тип wire, и используется только блокируещее присваивание. Звучит как парадокс, неужели это нельзя как то обойти, использую память, ROM например. Правда это еще одно не паханное поле, но хотя бы есть куда двигаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба Только что, Tealdris сказал: Звучит как парадокс, Таква се ля ви. Только что, Tealdris сказал: неужели это нельзя как то обойти, использую память, ROM например Причём тут ROM? Это язык такой. Сам мучаюсь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tealdris 0 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 2 минуты назад, andrew_b сказал: Причём тут ROM? Быть может ошибся в названии ячейки, но то что я пока что нашел звучит очень геморойно со всем этим объявлением адресов, записью, чтением по каждой ячейке 5 минут назад, andrew_b сказал: Сам мучаюсь Есть какой-либо прогресс в мучениях? Быть может можно запариться и собрать все в один модуль, но это не похоже на логичный вариант ответа Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 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'а. Только вчитываться нужно в каждую строчку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tealdris 0 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 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 Однако результат тот же. Может проблема не в том как я присваиваю значения, а в том как я обьявил модуль. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 1 hour ago, Tealdris said: Может проблема не в том как я присваиваю значения, а в том как я обьявил модуль Может. Обычно никто не пишет тип сигнала при объявлении портов (то есть input clk, output TX, без reg или wire) а синтезатор уже сам доделает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 14 июля, 2020 Опубликовано 14 июля, 2020 · Жалоба 12 минут назад, Nick_K сказал: Обычно никто не пишет тип сигнала при объявлении портов (то есть input clk, output TX, без reg или wire) По дефолу wire. Если выход reg, то писать надо обязательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться