ВНИМАНИЕ! На форуме началось голосование в конкурсе - астрофотография месяца - ИЮЛЬ!
0 Пользователей и 1 Гость просматривают эту тему.
wire wire_in;wire wire_out;wire presense;wire busy_DS18B20;// reg [7:0] out_byte_DS18B20;// = 8'h55;testwire reset = !busy_DS18B20 ? reg13[0] : 1'b0;wire read = !busy_DS18B20 ? reg13[1] : 1'b0;wire write = !busy_DS18B20 ? reg13[2] : 1'b0;//двунаправленный буфер с переходом в высокоимпендансное состояниеIOBUF ZZ_TOP( .T(read),// .O(wire_in), //------------------------------------------>----| .I(wire_out),//------------------------------------------<--| | .IO(T_SENSOR)//LOC = P161 DALLAS DS18B20 THERMOSENSOR--<> | |);// | |one_wire DALLAS_DS18B20 ( // | | .wire_out(wire_out), //----------------------------------->-| | .reset(reset), //<==сброс термосенсора byte=0x10; | .read_byte(read), //<== команда чтения byte=0x20; | .write_byte(write), //<== команда записи byte=0x40; | .wire_in(wire_in), //-----------------------------------<---| .presense(presense), //--> вывел на ЛЕД - ничего нет .busy(busy_DS18B20), //--) а тут чё-то есть .in_byte(reg12[7:0]), //<==байт команды для термосенсора .out_byte(out_byte_DS18B20[7:0]), //==>данные температуры ----->| .clk(cc[4])//<== 1.5MHz | ); // | //***************************************************************** |// ПРИНИМАЕМ ДАННЫЕ С ТЕРМОДАТЧИКА И ОТПРАВЛЯЕМ ИХ В ФОРМУ 0...4096 |//***************************************************************** |wire [7:0] data_msb;// | wire [7:0] data_lsb;// |MSB_LSB DS18B20_to( // | .clock(c48), //Clock | .data_in(out_byte_DS18B20[7:0]),//<----данные с термосенсора-<| .strob_in(cc[4]), //<----строб с термосенсора .LSB(data_lsb), //----->гоним в кадр .MSB(data_msb) //----->гоним в кадр );
------------------------------------------------------------------------------------ Company: -- Engineer: -- -- Design Name: -- Module Name: one_wire - Behavioral -- http://we.easyelectronics.ru/plis/1-wire-na-vhdl.html----------------------------------------------------------------------------------library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all; entity one_wire is port ( reset : in std_logic; read_byte : in std_logic; write_byte : in std_logic; wire_out : out std_logic; wire_in : in std_logic; presense : out std_logic; busy : out std_logic; in_byte : in std_logic_vector (7 downto 0); out_byte : out std_logic_vector (7 downto 0); clk : in std_logic );end one_wire;architecture a of one_wire issignal count : std_logic;signal counter : integer range 0 to 1024;--127;beginprocess (clk)type finit_state is (start, delay_reset, wire_read_presense, wire_0, wire_write, wire_read, delay );variable state : finit_state := start; variable n_bit : integer range 0 to 7;variable f : std_logic;beginif (clk'event and clk = '1') thencase (state) is when start => wire_out <= '1'; -- здесь программа посто висит и ждет команд busy <= '0'; count <= '0'; if (reset = '1') then -- пришла команда сбросить шину busy <= '1'; presense <= '0'; state := delay_reset; -- переходим туда, где эта шина сбрасывается elsif (write_byte = '1') then f := '0'; busy <= '1'; state := wire_0; elsif (read_byte = '1') then f := '1'; busy <= '1'; state := wire_0; end if; when delay_reset => wire_out <= '0'; -- сбрасываем шину, т. е. выставляем 0 и ждем 480 мкс count <= '1'; if (counter = 719) then --было78 state := wire_read_presense; count <= '0'; end if; when wire_read_presense => wire_out <= '1';--1 count <= '1'; if (counter = 11) then -- проверяем ответ от устройства presense <= not wire_in; end if; if (counter = 44) then -- было78 state := start; count <= '0'; end if; when wire_0 => wire_out <= '0'; -- инициируем передачу или прием бита if (f = '0') then state := wire_write; else state := wire_read; end if; when wire_write => if (in_byte(n_bit) = '1') then -- по-очереди передаем байт wire_out <= '1'; end if; state := delay; when wire_read => wire_out <= '1'; count <= '1'; if (counter = 1) then out_byte(n_bit) <= wire_in; -- считываем бит count <= '0'; state := delay; end if; when delay => count <= '1'; if (counter = 89) then --было 8. задержка перед приемом или передачей следующего бита count <= '0'; wire_out <= '1'; if (n_bit = 7) then -- если все биты приняты/переданы возвращаемся на начало n_bit := 0; state := start; else n_bit := n_bit + 1; state := wire_0; end if; end if; end case;end if;end process;-- счетчик, тикает с периодом 6 мкс, нужен для выдерживания временных интерваловprocess (clk)beginif (count = '0') then counter <= 0;elsif (clk'event and clk = '1') then counter <= counter + 1;end if;end process;end architecture;
...значение переменной counter также можно двигать взад-вперёд и тем самым уменьшать или увеличивать конфликтную зону, то есть ту, где амплитуда падает наполовину. при значении == 40, эта зона исчезает вообще, то есть как бы и конфликт исчезает вместе с ней...
Цитата: Andreichk от 29 Дек 2015 [17:45:07]...значение переменной counter также можно двигать взад-вперёд и тем самым уменьшать или увеличивать конфликтную зону, то есть ту, где амплитуда падает наполовину. при значении == 40, эта зона исчезает вообще, то есть как бы и конфликт исчезает вместе с ней...Вы что-то неправильно делаете при описании моей схемы в верилоге. Эта схема не допускает конфликта в принципе.Доберусь до дома, посмотрю, нельзя ли средствами Квартуса транслировать графическую схему в верилог или VHDL. Вроде когда то попадалась мне на глаза такая функция.
when wire_read_presense => wire_out <= '1'; count <= '1'; if (counter = 22) then -- проверяем ответ от устройства presense <= not wire_in; end if; if (counter = 722) then -- было78 state := start; count <= '0'; end if;
//двунаправленный буфер с переходом в высокоимпендансное состояниеIOBUF ZZ_TOP( .T(read), //во время чтения шину в Z-состояние .IO(T_SENSOR),//LOC = P161 DALLAS DS18B20 THERMOSENSOR--<IOI> .O(wire_in), // .I(wire_out) //);//
выражение assign y =e ? a : 1'bZ; означает: если е==1, то на выходе y будет а, иначе Z
//двунаправленный буфер с переходом в высокоимпендансное состояниеIOBUF ZZ_TOP( .IO(T_SENSOR),//LOC = P161 DALLAS DS18B20 THERMOSENSOR--<IOI> .O(wire_in), //-------------------------------------------->---| .T(!wire_out),//во время чтения шину в Z-состояние---------<--| | .I(0) // | |);// | |one_wire DALLAS_DS18B20 ( // | | .wire_out(wire_out), //---------------------------------->--| | .reset(reset), //<==сброс термосенсора byte=0x10; | .read_byte(read), //<== команда чтения byte=0x20; | .write_byte(write), //<== команда записи byte=0x40; | .wire_in(wire_in), //-----------------------------------<---| .presense(presense), //--> вывел на ЛЕД - всё есть .busy(busy_DS18B20), //--) и тут чё-то есть .in_byte(reg12[7:0]), //<==байт команды для термосенсора .out_byte(out_byte_DS18B20[7:0]), //==>данные температуры ----->| .clk(cc[4])//<== 1.5MHz | ); //
ds18b20_drive onewire ( .clk(c48), .rst_n(cc[17]), .one_wire(T_SENSOR), .temperature(out_byte_DS18B20[15:0]) );
signed char Tbuff[2];//температурный буфер//*********************************************************************************************//function чтение температуры датчика ////четыре младших разряда нулевого байта содержат дробную часть результата;//четыре старших разряда нулевого байта содержат четыре младших разряда целой части результата;//три младших разряда первого байта содержат оставшиеся три разряда целой части;//остальные разряды первого байта указывают на знак температуры (+ или -);//*********************************************************************************************float ds_read_temperature(void){ unsigned char MS,LS; float T = 0.0; LS = Tbuff[0];//мл.байт MS = Tbuff[1];//ст.байт if ((MS & 0x80)==0){ T=((float)(MS & 0x07) * 256 + (float)LS); T=T/16.0; }else{ T = ((float)(((MS ^ 0xff) & 0x07)) * 256 + 1 + (float)(LS ^ 0xff)); T = -T/16.0; } return T;}
reg [15:0]wert = 16'h3fff;//значение длит. импульса для сброса термодатчикаwire takt_out; imp_wert for_onewire ( .clk(cc[8]), .wert(wert[15:0]), // .wert_out(takt_out)//импульс сброса термодатчика ); /*================= Термосенсор DALLAS DS18B20 ================================================0x44 - провести измерение температуры и записать данные в оперативную память0x4E - записать 3 байта в 3й, 4й и 5й байты оперативной памяти0xBE - считать последовательно 9 байт оперативной памяти0x48 - скопировать 3й и 4й байты оперативной памяти в EEPROM0xB8 - скопировать данные из EEPROM В 3й и 4й байты оперативной памяти0xB4 - вернет тип питания (0 - паразитное, 1 - внешнее)Информация об измеренной температуре хранится в оперативной памяти датчика,состоящей из 9 байт.1 и 2 байты хранят информацию о температуре.3 и 4 байты хранят соответственно верхний и нижний пределы температуры.5 и 6 байты зарезервированы.7 и 8 байты используются для сверхточного измерения температуры.9 байт хранит помехоустойчивый CRC код предыдущих 8 байт.*/ wire [15:0] Temp_DS18B20;// = 8'h55;testds18b20_drive onewire( .clk(c48), .rst_n(takt_out),// сброс перед началом каждого кадра .one_wire(T_SENSOR),// двунаправленный порт термодатчика DALLAS DS18B20 .temperature(Temp_DS18B20[15:0])//данные на регулировку тока Пельтье);//============================================================================================// ВЫЧИСЛЕНИЕ ТЕМПЕРАТУРЫ ДАТЧИКА И ПРЕОБРАЗОВАНИЕ В ДЕСЯТИЧНУЮ ФОРМУ СО ЗНАКОМ//============================================================================================reg [15:0]T_int;always @ (posedge c48)begin if ((Temp_DS18B20[15:8] & 8'h80)==0) begin T_int = ((Temp_DS18B20[15:8] & 8'h07) * 256 + Temp_DS18B20[7:0])/16; end else begin T_int = (((Temp_DS18B20[15:8] ^ 8'hff) & 8'h07) * 256 + 1 + (Temp_DS18B20[7:0] ^ 8'hff))/16; T_int = !T_int; endend//============================================================================================// ЗАЩИТА ОТ ПЕРЕГРЕВА МАТРИЦЫ. ОТКЛЮЧЕНИЕ ШИМ ПРИ ТЕМПЕРАТУРЕ ВЫШЕ 24 ГРАД.//============================================================================================wire [15:0]Peltier_wert = (T_int[15:0] > 24) ? 16'hFFFF : (reg2[7:0] << 8 | reg3[7:0]);PWM to_Peltier ( .clk(cc[8]), //тут можно подгонять частоту ШИМ для ПЕЛЬТЬЕ .Temp_Sensor(Temp_DS18B20[15:0]), .PWM_in(Peltier_wert[15:0]),//<==ст.мл.бaйт .PWM_out(PELTIER) //==> P181;//ПЕЛЬТЬЕ );
достигнут невероятно низкий предел охлаждения - почти -13 град. . И это на открытом пространстве при комнатной температуре прим. 22 град.Думаю , в закрытой камере заморозить до -20 будет не проблема.