重庆大学通信工程学院EDA课设——温度检测

  • 格式:docx
  • 大小:56.59 KB
  • 文档页数:5

控制核心及温度接收模块library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity zs4184_tem_kong isport(clk:in std_logic;reset:in std_logic;sda:inout std_logic;scl:inout std_logic;NUM_MS:out std_logic_vector(8 downto 1);NUM_LS:out std_logic_vector(8 downto 1));end zs4184_tem_kong;architecture behav of zs4184_tem_kong is type state is(prepare,start,transmit_slave_address1,check _ack,transmit_pointer_byte1,r1check_ack,res tart,transmit_slave_address2,r2check_ack,rea d_MS,ACK,read_LS,NACK,stop);signal current_state:state;signal MS:std_logic_vector(8 downto 1); signal LS:std_logic_vector(8 downto 1); beginprocess(clk,reset)variable cnt:std_logic_vector(6 downto 0):="0000000";variable cnt1:integer range 0 to 8:=8;variable count1:integer range 0 to 40:=0;variableslave_address1:std_logic_vector(8 downto 1);variableslave_address2:std_logic_vector(8 downto 1);variable pointer_byte:std_logic_vector(8 downto 1);beginif reset='0' thencount1:=0;cnt:="0000000";cnt1:=8;sda<='1';scl<='1';current_state<=prepare;slave_address1:="10010000";--从机地址。

主机发送数据slave_address2:="10010001";--从机地址。

主机接收数据pointer_byte:="00000000";--温度寄存器elsif clk'event and clk='1' thencase current_state iswhen prepare=>cnt:=cnt+1;if cnt="0000100"thencnt:="0000000";current_state<=start;elsecurrent_state<=prepare;end if;when start=> --起始信号count1:=count1+1;case count1 iswhen 1=>sda<='1';when 2=>scl<='1';when 3=>sda<='0';when 4=>scl<='0';when10=>count1:=0;current_state<=transmit_slav e_address1;when others=>null;end case;when transmit_slave_address1=> --从机地址。

主机发送数据count1:=count1+1;case count1 iswhen1=>sda<=slave_address1(cnt1);when 2=>scl<='1';when4=>cnt1:=cnt1-1;count1:=0;scl<='0';if cnt1=0 thencnt1:=8;current_state<=check_ack;elsecurrent_state<=transmit_slave_address1 ;end if;when others=>null;end case;when check_ack=> --应答count1:=count1+1;case count1 iswhen 1=>sda<='Z';when 2=>scl<='1';when 4=>current_state<=transmit_pointer_byte1;scl<='0';count1:=0;when others=>null;end case;when transmit_pointer_byte1=> --温度寄存器count1:=count1+1;case count1 iswhen1=>sda<=pointer_byte(cnt1);when 2=>scl<='1';when 4=>cnt1:=cnt1-1;count1:=0;scl<='0';if cnt1=0 thencnt1:=8;current_state<=r1check_ack;elsecurrent_state<=transmit_pointer_byte1;end if;when others=>null;end case;when r1check_ack=> --应答count1:=count1+1;case count1 iswhen 1=>sda<='Z';when 2=>scl<='1';when 4=>current_state<=restart;scl<='0';count1:=0;when others=>null;end case;when restart=> --重新开始,改变方向count1:=count1+1;case count1 iswhen 1=>sda<='1';when 2=>scl<='1';when 3=>sda<='0';when 4=>scl<='0';when10=>count1:=0;current_state<=transmit_slav e_address2;when others=>null;end case;when transmit_slave_address2=> --从机地址。

主机接收数据count1:=count1+1;case count1 iswhen1=>sda<=slave_address2(cnt1);when 2=>scl<='1';when 4=>cnt1:=cnt1-1;count1:=0;scl<='0';if cnt1=0 thencnt1:=8;current_state<=r2check_ack;elsecurrent_state<=transmit_slave_address2 ;end if;when others=>null;end case;when r2check_ack=> --yingdacount1:=count1+1;case count1 iswhen 1=>sda<='Z';when 2=>scl<='1';when4=>current_state<=read_MS;scl<='0';count1:=0;when others=>null;end case;when read_MS=> --读高位count1:=count1+1;case count1 iswhen 1=>sda<='Z';when 2=>scl<='1';when3=>NUM_MS(cnt1)<=sda;when4=>cnt1:=cnt1-1;count1:=0;scl<='0';if cnt1=0 then cnt1:=8;current_state<=ACK;elsecurrent_state<=read_MS;end if;when others=>null;end case;when ACK=> --主机应答count1:=count1+1;case count1 iswhen 1=>sda<='0';when 2=>scl<='1';when 3=>scl<='0';when4=>current_state<=read_LS;count1:=0;when others=>null;end case;when read_LS=> --读低位count1:=count1+1;case count1 iswhen 1=>sda<='Z';when 2=>scl<='1';when 3=>NUM_LS(cnt1)<=sda;when 4=>scl<='0';when5=>cnt1:=cnt1-1;count1:=0;if cnt1=0 then cnt1:=8;current_state<=NACK;elsecurrent_state<=read_LS;end if;when others=>null;end case;when NACK=> --yingdacount1:=count1+1;case count1 iswhen 1=>sda<='1';when 2=>scl<='1';when 3=>scl<='0';when 4=>current_state<=stop;count1:=0;when others=>null;end case;when stop=> --终止信号--make a stop signalcount1:=count1+1;case count1 iswhen 1=>sda<='0';when 3=>scl<='1';when 10=>sda<='1';when 15=>count1:=0;when others=>null;end case;when others=>scl<='1';sda<='1';end case;end if;end process;end behav;转码电路:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity zs4184_zhuanma isport(clk:in std_logic;MS,LS:in std_logic_vector(7 downto 0); sign:out std_logic_vector(3 downto 0); shiwei:buffer std_logic_vector(3 downto 0); gewei:buffer std_logic_vector(3 downto 0); xwei_1:buffer std_logic_vector(3 downto 0); xwei_2:buffer std_logic_vector(3 downto 0); xwei_3:buffer std_logic_vector(3 downto 0)); end zs4184_zhuanma;architecture behav of zs4184_zhuanma is signal reg:std_logic_vector(10 downto 0); signal Decimal_value:integer range -1024 to 1024;signal De:integer range -1024 to 1024; signal gewei1:integer range 0 to 9;signal shiwei1:integer range 0 to 9;signal xiaoshu:integer range 0 to 9;beginreg<=MS&LS(7 downto 5);process(Decimal_value)beginif reg(10) ='0' thenDecimal_value<=conv_integer(reg(9 downto 0));sign<="1111";elsif reg(10)='1' thenDecimal_value<=1024-conv_integer(reg(9 downto 0));sign<="1010";end if;end process;process(Decimal_value)beginDe<=Decimal_value/ 8;xiaoshu<=Decimal_value mod 8;gewei1<=De mod 10;shiwei1<=De/10;end process;process(gewei1,shiwei1,xiaoshu) begincase shiwei1 iswhen 0=> shiwei<="0000";when 1=> shiwei<="0001";when 2=> shiwei<="0010";when 3=> shiwei<="0011";when 4=> shiwei<="0100";when 5=> shiwei<="0101";when 6=> shiwei<="0110";when 7=> shiwei<="0111";when 8=> shiwei<="1000";when 9=> shiwei<="1001";when others=> shiwei<="1010";end case;case gewei1 iswhen 0=> gewei<="0000";when 1=> gewei<="0001";when 2=> gewei<="0010";when 3=> gewei<="0011";when 4=> gewei<="0100";when 5=> gewei<="0101";when 6=> gewei<="0110";when 7=> gewei<="0111";when 8=> gewei<="1000";when 9=> gewei<="1001";when others=> gewei<="1010";end case;case xiaoshu iswhen 0=> xwei_1<="0000";xwei_2<="0000";xwei_3<="0 000"; --0when 1=> xwei_1<="0001";xwei_2<="0010";xwei_3<="0 101";--0.125when 2=> xwei_1<="0010";xwei_2<="0101";xwei_3<="0 000";--0.25when 3=> xwei_1<="0011";xwei_2<="0111";xwei_3<="0 101";--0.375when 4=> xwei_1<="0101";xwei_2<="0000";xwei_3<="0 000";--0.5when 5=>xwei_1<="0110";xwei_2<="0010";xwei_3<="0 101";--625when 6=> xwei_1<="0111";xwei_2<="0101";xwei_3<="0 000";--0.75when 7=> xwei_1<="1000";xwei_2<="0111";xwei_3<="0101";--0.875whenothers=>xwei_1<="1010";xwei_2<="1010";xw ei_3<="1010";end case;end process;end behav;。