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

Как определить уровень

Здравствуйте, пытаюсь проверить уровень (0 или 1) таким образом:

module test(
input clk,
inout reg in,
output reg out,//этот "провод" установил в 1
output reg led
);

always@(posedge clk)
begin
if (in == 0)
led	<= 0;
else
led	<= 1;
out	<= 1;
end
endmodule

на ножке out устанавливаю 1,  и проверяю in, соединяя 2 провода(out и in).

При включении светодиод горит постоянно, а при соединении in и out он гаснет.

Если код исправить таким образом:

if (in == 1)
led	<= 1;
else
led	<= 0;

out	<= 1;

то светодиод также постоянно горит(хотя провода разомкнуты) и при соединении их светодиод светится ещё ярче, а хотелось бы так:

с ножки постоянно подаю 1, а другой ножкой проверяю входящее значение(напряжение) при замыкании этих двух проводов.

Если имеется возможность, то пожалуйста покажите как правильно это сделать.

 

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


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

Светодиод зажигается нулём. Это стандартная практика.

4 часа назад, GregoryTMW сказал:

При включении светодиод горит постоянно

По умолчанию led установлен в 0. Если вход in висит в воздухе, то это тоже будет скорее всего ноль. Этот ноль на in передаётся на выход led -- светодиод горит.

(Чтобы выход не висел в воздухе, внутри FPGA задействуют pullup или pulldown)

4 часа назад, GregoryTMW сказал:

а при соединении in и out он гаснет.

out установлен в 1, эта 1 передаётся на led и гасит светодиод.

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


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

to:andrew_b

Здравствуйте, наверное я неправильно объяснил, светодиод у меня подключен катодом на минус к плате, а led к аноду.

Если in висит в воздухе (и он равен 0), то при соединении с out (на который я постоянно подаю 1) in должен "принять" 1 и условие:

if(in == 1)

должно выполниться?

Если так, то далее выполнится следующая инструкция, например led <= 1, а иначе (else) на ножку led <= 0.

Сейчас в таком варианте:

if(in == 1)
led	<= 1;
else
led	<= 0;

out	<= 1;

out (1) и in не соеденены, но светодиод всё равно горит (при соединении яркость увеличивается).

Приведите пожалуйста пример кода для моего случая (если не затруднит).

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


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

А inout reg in - зачем? Может просто input wire in?

 

И что будет если при инициализации led = 0; и больше его не менять?

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

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


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

1 hour ago, GregoryTMW said:

Если in висит в воздухе (и он равен 0),

Он не равен 0, на него скорее всего наводится 50 Hz из ближайшей розетки. Замкните на землю.

 

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


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

25 минут назад, _4afc_ сказал:

А inout reg in - зачем? Может просто input wire in?

 

И что будет если при инициализации led = 0; и больше его не менять?

 

Если Вы имеете ввиду:

if(in == 1)
led	<= 0;//вот так?
else
led	<= 0;

out	<= 1;

светодиод гореть не будет

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

Замкните на землю.

in на землю?

14 минут назад, xvr сказал:

Замкните на землю. 

in на землю?

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


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

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

Да

 

А как я им тогда буду проверять "входящий" сигнал с out?

У меня же in это "вход" для проверки "входящего" значения, а out подключаю к in

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


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

17 часов назад, GregoryTMW сказал:

always@(posedge clk)
begin
if (in == 0)
led	<= 0;
else
led	<= 1;
out	<= 1;
end

Внимательно читаем.

Вот конструкция:

Которая проверяет in == 0

if (in == 0)
led	<= 0;
else
led	<= 1;

А вот out <= 1; выполняется вне зависимости от in == 0, т.е под каждый posedge clk

Если хотите, чтобы и out <= 1 выполнялось вместе с led <= 1; то тогда нужны еще пара -  begin-end, вставленных после else

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


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

9 минут назад, iosifk сказал:

А вот out <= 1; выполняется вне зависимости от in == 0, т.е под каждый posedge clk

изначально так и хотел (постоянная подача 1 с out)

 

10 минут назад, iosifk сказал:

то тогда нужны еще пара -  begin-end

да, это стандартный блок (практически в любом ЯП), но как я писал выше мне необходимо постоянно "подавать" с out - 1, а при помощи in проверять что "пришло" и в зависимости от значения которое я получил выполнить действие/инструкцию.

 

Согласно "схеме" которую я опубликовал, какой код необходим?

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


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

21 hours ago, GregoryTMW said:

У меня же in это "вход" для проверки "входящего" значения, а out подключаю к in 

Сейчас у вас in это вход для сбора помех (пока кнопка не нажата). Нельзя голые КМОП входы оставлять висящими в воздухе. Что бы убедится, что у вас вход работает, отсоедините его от клавиатуры и подсоедините к земле (временно!)

Когда убедитесь, включите pull-up (или pull-down) на ноге in, и будет вам счастье :)

 

То, что схема описанна на Verilog и [наверное] работает в симуляторе, ещё не отменяет законов физики - у FPGA входы сделаны не в виде Verilog абстракций, а в виде вполне конкретных полевых транзисторов. И им необходимо обеспечить такой режим работы, что бы функционирование FPGA определялось загруженным RTL, а не аварийными режимами по входам и выходам.

 

 

Кстати, если у вас LED подсоединён так, как нарисован (без резистора), то это ещё один путь спалить FPGA

 

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


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

15 минут назад, xvr сказал:

Что бы убедится, что у вас вход работает, отсоедините его от клавиатуры и подсоедините к земле (временно!)

Сделал так, но ничего не включается(светодиод не горит), подключил его через 270 Ом, вот код:

module test(
input clk,
output reg in,
output reg out,
output reg led
);


always@(posedge clk)
begin
if(in == 1)
led	<= 1;
else
led	<= 0;
//
out	<= 1;
end
endmodule

 

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


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

Приветствую!

У вас  чип какой? Altera MAX II?  Тогда для начала включите в опциях для всех входных пинов  in режим PULL UP и Schmitt Trigger.

А для  выходных пинов out используете  режим Open-Drain

input [M-1:0] pin_in,
inout [N-1:0] pin_ou,
...
reg [N-1:0] pin_ou_en;
assign pin_ou[0] = (r_ou_en[0]==1'b1) ? 1'b0 : 1'bz;
...

Тогда подавая поочереди на выходные pin_ou[*] уровень 0  вы сможете найти входные пины на которые через кнопку попадет этот 0.  И при этом не будет риска коротнуть с другими выходными пинами  через несколько одновременно нажатых кнопок. 

Удачи! Rob. 

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


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

3 минуты назад, RobFPGA сказал:

У вас  чип какой? Altera MAX II?

Да, плата как на фото, а какие значения у констант M и N (это количество кнопок?).

Спасибо, за помощь.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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