• 方案介紹
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

DS18B20溫度傳感器VHDL數(shù)碼管顯示DE2-115開發(fā)板

8小時前
195
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

名稱: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ā)板可以修改管腳適配:

DE2-115.png

部分代碼展示:

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è)計文檔:

工程文件

78110707-af58-4798-ab9a-9eef27af8bed.png

程序文件

c6f0ef2f-048e-4c23-8780-4197586e456f.png

程序編譯

9db9b22d-cf92-4ba8-b765-634fffb3ca41.png

RTL圖

c75379d1-eb30-4e74-8021-c69923a43f43.png

管腳分配

704dca06-d5d8-469c-9ea0-3b0573263c7b.png

點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=261

相關(guān)推薦