AndreiF 0 5 октября, 2021 Опубликовано 5 октября, 2021 · Жалоба Здравствуйте. Я только учусь работать с ПЛИС и для своих задач использую проекты, найденные в интернете. Сейчас я интересуюсь работой с датчиком температуры DS18B20 по видео с Youtube и хотел бы чтобы при превышении 30 градусов на выходе ПЛИС была постоянная 1. В Quartus'е мой проект состоит из 4 блоков (3 из которых найдены в интернете и работают, как показывает симуляция, исправно: Делитель частоты, Reset и блок DS18B20 "OneWire_Master"). В 4-м блоке "Сomp", я бы хотел сравнить данные с датчика и при превышении 30град выставить 1 на выходе Q. Из документации на датчик ds18b20 (cтр 5) температурные данные запоминаются как 16-битовое число, из которых первые 5 бит - знак температуры, последние 4 бита - дробное значение температуры. Проблема в том что я не могу проверить свой датчик. Я задаю, чтобы на выходе Q была 1 для всех температур от 0 до 30 град, а для остальных значений 0 (код представлен ниже). В результате, при подаче питания на выходе Q появляется 1. Я меняю условие: для температур от 0 до 30 ставлю Q = 0, а для default : Q = 1. В результате, при подаче питания на выходе Q снова появляется 1. Не могли бы Вы сказать где я ошибаюсь? module comp2(output reg [15:0] Q, input [15:0] Temp ,input Clk,RST, output J, output reg OUT); always @ (posedge Clk) begin casex(Temp) 16'bxxxxx0000000xxxx : Q = 1; //0 16'bxxxxx0000001xxxx : Q = 1; //1 16'bxxxxx0000010xxxx : Q = 1; //2 16'bxxxxx0000011xxxx : Q = 1; //3 16'bxxxxx0000100xxxx : Q = 1; //4 16'bxxxxx0000101xxxx : Q = 1; //5 16'bxxxxx0000110xxxx : Q = 1; //6 16'bxxxxx0000111xxxx : Q = 1; //7 16'bxxxxx0001000xxxx : Q = 1; //8 16'bxxxxx0001001xxxx : Q = 1; //9 16'bxxxxx0001010xxxx : Q = 1; //10 16'bxxxxx0001011xxxx : Q = 1; //11 16'bxxxxx0001100xxxx : Q = 1; //12 16'bxxxxx0001101xxxx : Q = 1; //13 16'bxxxxx0001110xxxx : Q = 1; //14 16'bxxxxx0001111xxxx : Q = 1; //15 16'bxxxxx0010000xxxx : Q = 1; //16 16'bxxxxx0010001xxxx : Q = 1; //17 16'bxxxxx0010010xxxx : Q = 1; //18 16'bxxxxx0010011xxxx : Q = 1; //19 16'bxxxxx0010100xxxx : Q = 1; //20 16'bxxxxx0010101xxxx : Q = 1; //21 16'bxxxxx0010110xxxx : Q = 1; //22 16'bxxxxx0010111xxxx : Q = 1; //23 16'bxxxxx0011000xxxx : Q = 1; //24 16'bxxxxx0011001xxxx : Q = 1; //25 16'bxxxxx0011010xxxx : Q = 1; //26 16'bxxxxx0011011xxxx : Q = 1; //27 16'bxxxxx0011100xxxx : Q = 1; //28 16'bxxxxx0011101xxxx : Q = 1; //29 16'bxxxxx0011110xxxx : Q = 1; //30 default : Q = 0; endcase end assign J = Q[0]; always @ (posedge Clk) //JK-trigger begin case({J, RST}) 2'b00 : OUT <= OUT; 2'b01 : OUT <= 0; 2'b10 : OUT <= 1'd1; 2'b11 : OUT <= !OUT; endcase end endmodule На работе снял осциллограммы с выходов D и Reset. Quartus проект Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha 0 5 октября, 2021 Опубликовано 5 октября, 2021 · Жалоба Just now, AndreiF said: Здравствуйте. Я только учусь работать с ПЛИС и для своих задач использую проекты, найденные в интернете. Сейчас я интересуюсь работой с датчиком температуры DS18B20 по видео с Youtube и хотел бы чтобы при превышении 30 градусов на выходе ПЛИС была постоянная 1. module comp2( input i_clk, input i_rst, output reg q, input signed [15:0] i_temp , ); wire signed [15:0] t30; wire signed [15:0] t0; assign t30= {10'd30, 4'h0}; assign t0= 0; always @ (posedge i_clk or posedge i_rst) begin if(i_rst) q <= 1'b0; else q<= (i_temp > t0) && (i_temp < t30); end Так сойдет ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreiF 0 5 октября, 2021 Опубликовано 5 октября, 2021 · Жалоба Спасибо, gosha, но к сожалению на выходе Q всегда 0 (при проверке грел датчик паяльником, через сложенную в несколько раз бумагу). Более подробно рассмотрел сигнал D (2-я ножка микросхемы) и обнаружил что есть область где сигнал находится между 1 и 0 (осциллограмма). Не знаете ли Вы, это нормальный режим работы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 5 октября, 2021 Опубликовано 5 октября, 2021 · Жалоба промежуточный уровень допускается для данного вида OneWire протокола. просто прочитайте описание внимательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosha 0 6 октября, 2021 Опубликовано 6 октября, 2021 · Жалоба 18 hours ago, AndreiF said: Спасибо, gosha, но к сожалению на выходе Q всегда 0 (при проверке грел датчик паяльником, через сложенную в несколько раз бумагу). Более подробно рассмотрел сигнал D (2-я ножка микросхемы) и обнаружил что есть область где сигнал находится между 1 и 0 (осциллограмма). Не знаете ли Вы, это нормальный режим работы? Внутрисхемным отладчиком не научились пользоваться ?? Без него - никак. Лучше бы снимок экрана внутрисхемной отладки по jtag: - осциллограмму по 1wire с датчика, и какой параллельный код получается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreiF 0 6 октября, 2021 Опубликовано 6 октября, 2021 · Жалоба Проблема была в неправильном подключении датчика...В документации сказано, что нужен транзистор для обеспечения питания, но я подумал что его можно внутри ПЛИС как-то указать (как резистор "weak pull up resistor"). Сейчас подключил как на рисунке б) т.е. отдельное питание +3.3В на вывод Vdd и схема заработала, осциллограммы стали красивыми. Спасибо, gosha. Осциллограммы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться