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

Вылезает лишний бит

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 циклоне. 

Подскажите, пожалуйста, как эту лишнюю единицу убрать. Ну и может посоветуете что-нибудь правильное для моего говнокода. :) Заранее спасибо. 

Изменено пользователем mr.fpgaer

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


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

Добрый

 

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.

А про какой конкретно пин он так говорит?

Изменено пользователем Darky777
Дополнить ответ

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


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

Кто о чем, а я всё про симулятор. Такие вещи нужно отлаживать на симуляторе (Modelsim, ActiveHDL и так далее). И только если симулятор скажет что код верный, тогда уже лезем на железо.

 

И в чем смысл if ((!key0)&(!key1)&(!key2)&(!key3)), если ноль и так получится в else когда все входы будут нулями?

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


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, mr.fpgaer сказал:

Доброго времени суток.

Эта нелепая фраза когда-нибудь исчезнет из оборота?

1 час назад, mr.fpgaer сказал:

if ((!key0)&(!key1)&(!key2)&(!key3))

Все приходящие асинхронные сигналы перед использованием должны быть синхронизированы с клоком. Если это сигналы с кнопок, должен быть реализован антидребезг.

Проект, я надеюсь, обконстрейнен?

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


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

   ...

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

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


Ссылка на сообщение
Поделиться на другие сайты
6 minutes ago, Yuri124 said:

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

Немного не понимаю, что вы сказали.. если рассмотреть все варианты этих key'ев, то можно увидеть, что все выходы зависят от входа.

Соглашусь, что описано неккоректно.

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


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, mr.fpgaer сказал:

Подскажите, пожалуйста, как эту лишнюю единицу убрать. Ну и может посоветуете что-нибудь правильное для моего говнокода. :) Заранее спасибо. 

Тут есть вопросы:

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

2. А сам по себе светодиод живой? Если его завести через ПЛИС напрямую на кнопку, то он будет менять свое состояние? 

3. Если клок отстоит по времени достаточно долго от нажатия кнопок, то синхронизацию с клоком по CDC делать не обязательно...

4. И действительно, надо начинать с симулятора.  

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


Ссылка на сообщение
Поделиться на другие сайты
1 minute ago, Darky777 said:

Немного не понимаю

Это я не разобрался . Свой ошибочный пост удалил.

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


Ссылка на сообщение
Поделиться на другие сайты
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МГц. Откуда следует, что сигнал с кнопок должен быть синхронизирован с клоком? В классических учебных примерах по синхронной логике используют ресет, который быть синхронизированным ни с чем не может. Или, еще  пример - флаги, которые могут быть выставлены независимо от клока. Или я туплю опять?
Проект не обконстрейнен, потому что, как я написал выше, считал, что задача легкая и не требует серьезных усилий. И продолжаю так считать.

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


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, mr.fpgaer сказал:

И продолжаю так считать. 

Ну и продолжайте.

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


Ссылка на сообщение
Поделиться на другие сайты
2 hours ago, Darky777 said:

Немного не понимаю, что вы сказали.. если рассмотреть все варианты этих key'ев, то можно увидеть, что все выходы зависят от входа.

Соглашусь, что описано неккоректно.

Исходный комментарий я прочесть не успел, но, вероятно, про некорректность - это про мое описание?) Что мне пояснить?

2 hours ago, iosifk said:

Тут есть вопросы:

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

2. А сам по себе светодиод живой? Если его завести через ПЛИС напрямую на кнопку, то он будет менять свое состояние? 

3. Если клок отстоит по времени достаточно долго от нажатия кнопок, то синхронизацию с клоком по CDC делать не обязательно...

4. И действительно, надо начинать с симулятора.  

1. Генератор с платы 50МГц. Изначально хотел на асинхронной логике сделать, но проблема одна и та же.

2. Живой. Будет. 

3. К сожалению моих знаний недостаточно, чтобы рассуждать про CDC, но, кажется, что в п. 1 я коснулся этого вопроса. 

4. Уже понял... =( 

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


Ссылка на сообщение
Поделиться на другие сайты
4 hours ago, Darky777 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];

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


Ссылка на сообщение
Поделиться на другие сайты
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];

Попробовал. Не помогло. Спасибо.

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


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

Я бы ещё проверил, какой файл с кодом вашего модуля используется для компиляции. Бывает, что если у вас несколько версий модуля, то Квартус может подхватить старую версию исходника если  явно не указать путь к нужной версии.

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти