Jump to content

    

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

Здравствуйте, пытаюсь проверить уровень (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, а другой ножкой проверяю входящее значение(напряжение) при замыкании этих двух проводов.

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

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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 не соеденены, но светодиод всё равно горит (при соединении яркость увеличивается).

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

Share this post


Link to post
Share on other sites

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

 

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

Edited by _4afc_
input

Share this post


Link to post
Share on other sites
1 hour ago, GregoryTMW said:

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

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

 

Share this post


Link to post
Share on other sites
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 на землю?

Share this post


Link to post
Share on other sites
56 minutes ago, GregoryTMW said:

in на землю?

Да

 

Share this post


Link to post
Share on other sites
2 минуты назад, xvr сказал:

Да

 

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

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
9 минут назад, iosifk сказал:

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

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

 

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

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

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

 

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

Share this post


Link to post
Share on other sites
21 hours ago, GregoryTMW said:

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

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

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

 

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

 

 

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

 

Share this post


Link to post
Share on other sites
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

 

Share this post


Link to post
Share on other sites

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

У вас  чип какой? 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. 

Share this post


Link to post
Share on other sites
3 минуты назад, RobFPGA сказал:

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now