名稱:DS18B20溫度傳感器DE2-115開發(fā)板數(shù)碼管顯示VHDL(代碼在文末下載)
軟件:Quartus II
語言:VHDL
代碼功能:
1、正常溫度范圍顯示。
2、按一下按鍵實現(xiàn)測溫,數(shù)碼管顯示溫度。
3、溫度正常時綠色led燈亮,異常時紅色led燈亮。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
本代碼已在DE2-115開發(fā)板驗證,開發(fā)板如下,其他開發(fā)板可以修改管腳適配:
部分代碼展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ???USE?ieee.std_logic_unsigned.all; ???USE?ieee.std_logic_arith.all; --BS18B20驅(qū)動模塊 ENTITY?ds18b20_drive?IS ???PORT?( ??????clk??????????:?IN?STD_LOGIC;?--?50MHz時鐘 ??????rst_n????????:?IN?STD_LOGIC;--?異步復位 ??????one_wire?????:?INOUT?STD_LOGIC;--?One-Wire總線 ??????temperature??:?OUT?STD_LOGIC_VECTOR(15?DOWNTO?0)?--?輸出溫度值 ???); END?ds18b20_drive; ARCHITECTURE?behavioral?OF?ds18b20_drive?IS ????constant??S00??????????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="00000"; ????constant??S0???????????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="00001"; ????constant??S1???????????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="00010"; ????constant??S2???????????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="00011"; ????constant??S3???????????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="00100"; ????constant??S4???????????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="00101"; ????constant??S5???????????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="00110"; ????constant??S6???????????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="00111"; ????constant??S7???????????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="01000"; ????constant??WRITE0???????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="01001"; ????constant??WRITE1???????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="01010"; ????constant??WRITE00??????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="01011"; ????constant??WRITE01??????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="01100"; ????constant??READ0????????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="01101"; ????constant??READ1????????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="01110"; ????constant??READ2????????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="01111"; ????constant??READ3????????:?STD_LOGIC_VECTOR(4?DOWNTO?0):="10000"; ???SIGNAL?cnt?????????????:?STD_LOGIC_VECTOR(5?DOWNTO?0); ???SIGNAL?clk_1us?????????:?STD_LOGIC; ???SIGNAL?cnt_1us?????????:?STD_LOGIC_VECTOR(19?DOWNTO?0); ???SIGNAL?cnt_1us_clear???:?STD_LOGIC; ??? ???SIGNAL?state???????????:?STD_LOGIC_VECTOR(4?DOWNTO?0); ??? ???SIGNAL?one_wire_buf????:?STD_LOGIC;--?One-Wire總線?緩存寄存器 ??? ???SIGNAL?temperature_buf?:?STD_LOGIC_VECTOR(15?DOWNTO?0);--?采集到的溫度值緩存器 ???SIGNAL?step????????????:?STD_LOGIC_VECTOR(5?DOWNTO?0);?--?子狀態(tài)寄存器?0~50 ???SIGNAL?bit_valid???????:?STD_LOGIC_VECTOR(3?DOWNTO?0);?--?有效位?? ??? ???SIGNAL?t_buf???????????:?STD_LOGIC_VECTOR(15?DOWNTO?0); BEGIN --++++++++++++++++++++++++++++++++++++++ --?分頻器50MHz->1MHz?開始 --++++++++++++++++++++++++++++++++++++++ ???PROCESS?(clk,?rst_n) ???BEGIN ??????IF?((NOT(rst_n))?=?'1')?THEN ?????????cnt?<=?"000000"; ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(cnt?=?"110001")?THEN ????????????cnt?<=?"000000"; ?????????ELSE ????????????cnt?<=?cnt?+?"000001";--?計數(shù)子 ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???PROCESS?(clk,?rst_n) ???BEGIN ??????IF?((NOT(rst_n))?=?'1')?THEN ?????????clk_1us?<=?'0';?--?1MHz?時鐘 ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(cnt?<=?"011000")?THEN?--?24?=?50/2?-?1 ????????????clk_1us?<=?'0'; ?????????ELSE ????????????clk_1us?<=?'1'; ?????????END?IF; ??????END?IF; ???END?PROCESS; ---------------------------------------- --?分頻器50MHz->1MHz?結(jié)束 ---------------------------------------- --++++++++++++++++++++++++++++++++++++++ --?延時模塊?開始 --++++++++++++++++++++++++++++++++++++++ ???PROCESS?(clk_1us) ???BEGIN ??????IF?(clk_1us'EVENT?AND?clk_1us?=?'1')?THEN ?????????IF?(cnt_1us_clear?=?'1')?THEN?--?請1us延時計數(shù)子 ????????????cnt_1us?<=?"00000000000000000000"; ?????????ELSE ????????????cnt_1us?<=?cnt_1us?+?"00000000000000000001";--?1us延時計數(shù)子 ?????????END?IF; ??????END?IF; ???END?PROCESS; ---------------------------------------- --?延時模塊?結(jié)束 ---------------------------------------- --++++++++++++++++++++++++++++++++++++++ --?DS18B20狀態(tài)機?開始 --++++++++++++++++++++++++++++++++++++++ --++++++++++++++++++++++++++++++++++++++?? ???PROCESS?(clk_1us,?rst_n) ???BEGIN ??????IF?((NOT(rst_n))?=?'1')?THEN ?????????one_wire_buf?<=?'Z'; ?????????step?<=?"000000"; ?????????state?<=?S00;?--?狀態(tài)寄存器 ??????ELSIF?(clk_1us'EVENT?AND?clk_1us?=?'1')?THEN ?????????CASE?state?IS ????????????WHEN?S00?=> ???????????????temperature_buf?<=?"0000000000011111"; ???????????????state?<=?S0; ????????????WHEN?S0?=>--?初始化 ???????????????cnt_1us_clear?<=?'1'; ???????????????one_wire_buf?<=?'0'; ???????????????state?<=?S1; ????????????WHEN?S1?=>?--?延時500us ???????????????cnt_1us_clear?<=?'0'; ???????????????IF?(cnt_1us?=?"00000000000111110100")?THEN ??????????????????cnt_1us_clear?<=?'1'; ??????????????????one_wire_buf?<=?'Z';--?釋放總線 ??????????????????state?<=?S2; ???????????????END?IF; ????????????WHEN?S2?=> ???????????????cnt_1us_clear?<=?'0'; ???????????????IF?(cnt_1us?=?"00000000000001100100")?THEN?--?等待100us ??????????????????cnt_1us_clear?<=?'1'; ??????????????????state?<=?S3; ???????????????END?IF; ????????????WHEN?S3?=> ???????????????IF?((NOT(one_wire))?=?'1')?THEN?--?若18b20拉低總線,初始化成功 ??????????????????state?<=?S4; ???????????????ELSIF?(one_wire?=?'1')?THEN???--?否則,初始化不成功,返回S0 ??????????????????state?<=?S0; ???????????????END?IF; ????????????WHEN?S4?=> ???????????????cnt_1us_clear?<=?'0'; ???????????????IF?(cnt_1us?=?"00000000000110010000")?THEN--?再延時400us ??????????????????cnt_1us_clear?<=?'1'; ??????????????????state?<=?S5; ???????????????END?IF; ????????????WHEN?S5?=>???--?寫數(shù)據(jù) ???????????????IF?(step?=?"000000")?THEN?--?0xCC ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"000001")?THEN ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"000010")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"000011")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"000100")?THEN ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"000101")?THEN ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"000110")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"000111")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"001000")?THEN--?0x44 ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"001001")?THEN ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"001010")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"001011")?THEN ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"001100")?THEN ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"001101")?THEN ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"001110")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"001111")?THEN ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"010000")?THEN?--?第一次寫完,750ms后,跳回S0 ??????????????????one_wire_buf?<=?'Z'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?S6; ???????????????ELSIF?(step?=?"010001")?THEN?--?再次置數(shù)0xCC和0xBE ??????????????????step?<=?step?+?"000001";--?0xCC ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"010010")?THEN ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"010011")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"010100")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"010101")?THEN ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"010110")?THEN ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"010111")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"011000")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"011001")?THEN ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"011010")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"011011")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"011100")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"011101")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"011110")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"011111")?THEN ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE0; ???????????????ELSIF?(step?=?"100000")?THEN ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?WRITE01; ???????????????ELSIF?(step?=?"100001")?THEN--?第二次寫完,跳到S7,直接開始讀數(shù)據(jù) ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?S7; ???????????????END?IF; ????????????WHEN?S6?=> ???????????????cnt_1us_clear?<=?'0'; ???????????????IF?(cnt_1us?=?"10110111000110110000"?OR?one_wire?=?'1')?THEN?--?延時750ms!!!! ??????????????????cnt_1us_clear?<=?'1'; ??????????????????state?<=?S0;?--?跳回S0,再次初始化 ???????????????END?IF; ????????????WHEN?S7?=>?--?讀數(shù)據(jù) ???????????????IF?(step?=?"100010")?THEN ??????????????????bit_valid?<=?"0000"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"100011")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"100100")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"100101")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"100110")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"100111")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"101000")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"101001")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"101010")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"101011")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"101100")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"101101")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"101110")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"101111")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"110000")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"110001")?THEN ??????????????????bit_valid?<=?bit_valid?+?"0001"; ??????????????????one_wire_buf?<=?'0'; ??????????????????step?<=?step?+?"000001"; ??????????????????state?<=?READ0; ???????????????ELSIF?(step?=?"110010")?THEN ??????????????????step?<=?"000000"; ??????????????????state?<=?S0; ???????????????END?IF; ??? --++++++++++++++++++++++++++++++++ ??????--?寫狀態(tài)機 ??????--++++++++++++++++++++++++++++++++ ????????????WHEN?WRITE0?=>--?輸出0? ???????????????cnt_1us_clear?<=?'0'; ???????????????one_wire_buf?<=?'0'; ???????????????IF?(cnt_1us?=?"00000000000001010000")?THEN?--?延時80us ??????????????????cnt_1us_clear?<=?'1'; ??????????????????one_wire_buf?<=?'Z';--?釋放總線,自動拉高??? ??????????????????state?<=?WRITE00; ???????????????END?IF; ????????????WHEN?WRITE00?=>?--?空狀態(tài) ???????????????state?<=?S5; ????????????WHEN?WRITE01?=>--?空狀態(tài) ???????????????state?<=?WRITE1; ????????????WHEN?WRITE1?=> ???????????????cnt_1us_clear?<=?'0'; ???????????????one_wire_buf?<=?'Z';--?輸出1???釋放總線,自動拉高 ???????????????IF?(cnt_1us?=?"00000000000001010000")?THEN ??????????????????cnt_1us_clear?<=?'1';--?延時80us ??????????????????state?<=?S5; ???????????????END?IF; ??? ??????---------------------------------- ??????--?寫狀態(tài)機 ??????----------------------------------
設(shè)計文檔:
工程文件
程序文件
程序編譯
RTL圖
管腳分配
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=261
閱讀全文