mr.fpgaer 0 11 октября, 2018 Опубликовано 11 октября, 2018 (изменено) · Жалоба module myadder01( input wire key0, input wire key1, input wire key2, input wire key3, output reg led0, output reg led1, output reg led2, input wire clk ); reg [2:0] sum =3'b000 ; always @(posedge clk) begin if ((!key0)&(!key1)&(!key2)&(!key3)) begin sum[2:0] <= 3'b000; end else begin sum[2:0] <= {1'b0, key1, key0} + {1'b0, key3, key2}; end led2 <= sum[0]; led1 <= sum[1]; led0 <= sum[2]; end endmodule Доброго времени суток. Задача следующая: сделать двоичный сумматор для двух слагаемых. Каждый бит (2 шт.) слагаемых задается кнопкой с платы. Каждый бит (3 шт.) суммы выводится на отдельный диод. Логика работает, однако при прошивке платы младший бит суммы (читай - светодиод) подсвечивается единицей. Самое веселое, что логика работает, будто так и должно быть: все числа, введенные с кнопок складываются с этой лишней единицей. В результате, если рассмотреть крайний случай, максимально можно ввести 11+11=110, а получается 11+11+1=111. В варнингах вылезло сообщение: Warning (13024): Output pins are stuck at VCC or GND. Есть подозрение, что проблема в этом, как пофиксить - не понимаю. Плата китайская на 4 циклоне. Подскажите, пожалуйста, как эту лишнюю единицу убрать. Ну и может посоветуете что-нибудь правильное для моего говнокода. :) Заранее спасибо. Изменено 11 октября, 2018 пользователем mr.fpgaer Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darky777 0 11 октября, 2018 Опубликовано 11 октября, 2018 (изменено) · Жалоба Добрый 26 minutes ago, mr.fpgaer said: sum[2:0] <= {1'b0, key1, key0} + {1'b0, key3, key2} Какое-то извращение, по-моему) может лучше создать отдельно wire [1:0] var_0,var_1 ; assign var_0 = { key1,key0 } ; assign var_1 = { key3,key2 } ; А потом вместо того, сделать sum <= var_0 + var_1 ; 28 minutes ago, mr.fpgaer said: Warning (13024): Output pins are stuck at VCC or GND. А про какой конкретно пин он так говорит? Изменено 11 октября, 2018 пользователем Darky777 Дополнить ответ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 11 октября, 2018 Опубликовано 11 октября, 2018 · Жалоба Кто о чем, а я всё про симулятор. Такие вещи нужно отлаживать на симуляторе (Modelsim, ActiveHDL и так далее). И только если симулятор скажет что код верный, тогда уже лезем на железо. И в чем смысл if ((!key0)&(!key1)&(!key2)&(!key3)), если ноль и так получится в else когда все входы будут нулями? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 11 октября, 2018 Опубликовано 11 октября, 2018 · Жалоба 1 час назад, mr.fpgaer сказал: Доброго времени суток. Эта нелепая фраза когда-нибудь исчезнет из оборота? 1 час назад, mr.fpgaer сказал: if ((!key0)&(!key1)&(!key2)&(!key3)) Все приходящие асинхронные сигналы перед использованием должны быть синхронизированы с клоком. Если это сигналы с кнопок, должен быть реализован антидребезг. Проект, я надеюсь, обконстрейнен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 11 октября, 2018 Опубликовано 11 октября, 2018 (изменено) · Жалоба ... Изменено 11 октября, 2018 пользователем Yuri124 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darky777 0 11 октября, 2018 Опубликовано 11 октября, 2018 · Жалоба 6 minutes ago, Yuri124 said: на выходах всегда, независимо от входов, будут нули, вот выходы к нулям и прицепили. Немного не понимаю, что вы сказали.. если рассмотреть все варианты этих key'ев, то можно увидеть, что все выходы зависят от входа. Соглашусь, что описано неккоректно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 11 октября, 2018 Опубликовано 11 октября, 2018 · Жалоба 1 час назад, mr.fpgaer сказал: Подскажите, пожалуйста, как эту лишнюю единицу убрать. Ну и может посоветуете что-нибудь правильное для моего говнокода. :) Заранее спасибо. Тут есть вопросы: 1. Откуда берется клок и что он из себя представляет? Если с кнопки, то там может быть любой дребезг... 2. А сам по себе светодиод живой? Если его завести через ПЛИС напрямую на кнопку, то он будет менять свое состояние? 3. Если клок отстоит по времени достаточно долго от нажатия кнопок, то синхронизацию с клоком по CDC делать не обязательно... 4. И действительно, надо начинать с симулятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Yuri124 1 11 октября, 2018 Опубликовано 11 октября, 2018 · Жалоба 1 minute ago, Darky777 said: Немного не понимаю Это я не разобрался . Свой ошибочный пост удалил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mr.fpgaer 0 11 октября, 2018 Опубликовано 11 октября, 2018 · Жалоба 3 hours ago, Darky777 said: Какое-то извращение, по-моему) может лучше создать отдельно Пробовал. Начиналось все вообще с асинхронной логики. Результат не меняется. Младший бит постоянно висит на VCC, если идти на поводу у варнинга. 2 hours ago, AVR said: Кто о чем, а я всё про симулятор. Такие вещи нужно отлаживать на симуляторе (Modelsim, ActiveHDL и так далее). И только если симулятор скажет что код верный, тогда уже лезем на железо. И в чем смысл if ((!key0)&(!key1)&(!key2)&(!key3)), если ноль и так получится в else когда все входы будут нулями? Тут я признаю свой косяк: сначала полез спрашивать, теперь понимаю, что надо все-таки начинать с симуляции. Задачка простая, решил что с наскока решу. Был уже опыт печальный, когда не решался идти к людям спрашивать, потратил уйму времени, а выяснилось, что надо было всего-то галочку в настройках проекта поставить в другом месте... Вот где эта грань?)) Смысл этого говнокода в том, чтобы принудительно засандалить регистр sum в ноль, потому что было предположение, что это устранит этот несчастный бит, который висит даже при не нажатых кнопках. 2 hours ago, andrew_b said: Эта нелепая фраза когда-нибудь исчезнет из оборота? Все приходящие асинхронные сигналы перед использованием должны быть синхронизированы с клоком. Если это сигналы с кнопок, должен быть реализован антидребезг. Проект, я надеюсь, обконстрейнен? Доброго времени суток, Андрей. Обычно невоспитанные люди стараются не показывать этого качества, а вы во всеуслышание об этом кричите. Поучитесь вежливости, да вот хотя бы у коллег из СПб. По существу: не понял насчет синхронизма. Клок - это генератор с платы 50МГц. Откуда следует, что сигнал с кнопок должен быть синхронизирован с клоком? В классических учебных примерах по синхронной логике используют ресет, который быть синхронизированным ни с чем не может. Или, еще пример - флаги, которые могут быть выставлены независимо от клока. Или я туплю опять? Проект не обконстрейнен, потому что, как я написал выше, считал, что задача легкая и не требует серьезных усилий. И продолжаю так считать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 11 октября, 2018 Опубликовано 11 октября, 2018 · Жалоба 2 минуты назад, mr.fpgaer сказал: И продолжаю так считать. Ну и продолжайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mr.fpgaer 0 11 октября, 2018 Опубликовано 11 октября, 2018 · Жалоба 2 hours ago, Darky777 said: Немного не понимаю, что вы сказали.. если рассмотреть все варианты этих key'ев, то можно увидеть, что все выходы зависят от входа. Соглашусь, что описано неккоректно. Исходный комментарий я прочесть не успел, но, вероятно, про некорректность - это про мое описание?) Что мне пояснить? 2 hours ago, iosifk said: Тут есть вопросы: 1. Откуда берется клок и что он из себя представляет? Если с кнопки, то там может быть любой дребезг... 2. А сам по себе светодиод живой? Если его завести через ПЛИС напрямую на кнопку, то он будет менять свое состояние? 3. Если клок отстоит по времени достаточно долго от нажатия кнопок, то синхронизацию с клоком по CDC делать не обязательно... 4. И действительно, надо начинать с симулятора. 1. Генератор с платы 50МГц. Изначально хотел на асинхронной логике сделать, но проблема одна и та же. 2. Живой. Будет. 3. К сожалению моих знаний недостаточно, чтобы рассуждать про CDC, но, кажется, что в п. 1 я коснулся этого вопроса. 4. Уже понял... =( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mr.fpgaer 0 11 октября, 2018 Опубликовано 11 октября, 2018 · Жалоба 4 hours ago, Darky777 said: А про какой конкретно пин он так говорит? Ну из консоли я скопировал сообщение полностью. В квартусе где-то можно посмотреть подробнее про это сообщение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 11 октября, 2018 Опубликовано 11 октября, 2018 · Жалоба Я бы убрал led2 <= sum[0]; led1 <= sum[1]; led0 <= sum[2]; из блока always @( ) и написал бы: output led0, output led1, output led2, assign led2 = sum[0], led1 = sum[1], led0 = sum[2]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mr.fpgaer 0 11 октября, 2018 Опубликовано 11 октября, 2018 · Жалоба 28 minutes ago, Zwerg_nase said: Я бы убрал led2 <= sum[0]; led1 <= sum[1]; led0 <= sum[2]; из блока always @( ) и написал бы: output led0, output led1, output led2, assign led2 = sum[0], led1 = sum[1], led0 = sum[2]; Попробовал. Не помогло. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZwergNase 0 11 октября, 2018 Опубликовано 11 октября, 2018 · Жалоба Я бы ещё проверил, какой файл с кодом вашего модуля используется для компиляции. Бывает, что если у вас несколько версий модуля, то Квартус может подхватить старую версию исходника если явно не указать путь к нужной версии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться