⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 up3_clock.vhd

📁 在UP3开发板上已经验证过的VHDL代码。精确到十分之一秒
💻 VHD
📖 第 1 页 / 共 4 页
字号:
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"3" & "1000";--BCD_YEAR0;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR15;
				
				WHEN WRITE_CHAR15 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"2E"; 
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR16;
						
				WHEN WRITE_CHAR16 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"3" & BCD_MONTH1;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR17;
				
				WHEN WRITE_CHAR17 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"3" & BCD_MONTH0;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR18;
						
				WHEN WRITE_CHAR18 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"2E";
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR19;
						
				WHEN WRITE_CHAR19 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"3" & BCD_DATE1;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR20;
									  						
				WHEN WRITE_CHAR20 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"3" & BCD_DATE0;
						state <= TOGGLE_E;
						next_command <= WRITE_BLANK3;
				
				WHEN WRITE_BLANK3 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"2A";
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR21;
						
				WHEN WRITE_CHAR21 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"3" & ALARM_BCD_HRD1;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR22;
						
				WHEN WRITE_CHAR22 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"3" & ALARM_BCD_HRD0;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR23;
						
				WHEN WRITE_CHAR23 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"3A";
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR24;
			    		
				WHEN WRITE_CHAR24 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"3" & ALARM_BCD_MIND1;
						state <= TOGGLE_E;
						next_command <= WRITE_CHAR25;
						
				WHEN WRITE_CHAR25 =>
						LCD_E <= '1';
						LCD_RS <= '1';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"3" & ALARM_BCD_MIND0;
						state <= TOGGLE_E;
						next_command <= RETURN_HOME;
						
-- Return write address to first character postion
				WHEN RETURN_HOME =>
						LCD_E <= '1';
						LCD_RS <= '0';
						LCD_RW <= '0';
						DATA_BUS_VALUE <= X"80";
						state <= TOGGLE_E;
						next_command <= WRITE_CHART;
-- The next two states occur at the end of each command to the LCD
-- Toggle E line - falling edge loads inst/data to LCD controller
				WHEN TOGGLE_E =>
						LCD_E <= '0';
						state <= HOLD;
-- Hold LCD inst/data valid after falling edge of E line				
				WHEN HOLD =>state <= next_command;
				
				WHEN OTHERS =>state<= RESET1;
			END CASE;
		END IF;
	END PROCESS;
	
	
	--////////////////////////////////////////////////////////////////////////////////////   
	--//////////////////////////////////////////////////////////////////////////////////// 
	--////////////////////////////////////////////////////////////////////////////////////   
	--////////////////////////////////////////////////////////////////////////////////////   
READ_I2C :process(CLK_4000HZ,reset)               --进程2,状态机的转换
variable read_slave_address,write_slave_address,sub_address :std_logic_vector(8 downto 1);
variable pre_cnt   :std_logic_vector(7 downto 0);
variable cnt1      :integer range 0 to 8;
variable count1    :integer range 0 to 8;
variable delay_num :integer range 0 to 20000;
begin
  	 if  reset='0' then 
			
			delay_num:=0;
 			pre_cnt:="00000000";
            R_current_state<=R_prepare;
			W_current_state<=W_prepare;
            FLAG<='1';

	 elsif rising_edge(CLK_4000HZ) then
	
	 if( DipSwitch1 = '1' ) then	                  
	 case R_current_state is
	
	 when R_prepare=>pre_cnt:=pre_cnt+1;                           --准备状态,等各个器件复位
	      			if pre_cnt="00000010" then 
	                pre_cnt:="00000000";
			 		R_current_state<=R_start;
			
			        sub_address:="00000000";
					read_slave_address :="11010001";
					write_slave_address:="11010000";
					count1:=0;
					cnt1:=8;
					sda<='1';
					scl<='1';
	   	  			else R_current_state<=R_prepare;
		  			end if;		           			   				
		             
	 when R_start=>count1:=count1+1;      --起始信号产生状态
	                case count1 is
				    when 1=>sda<='1';
				    when 3=>scl<='1';
				    when 5=>sda<='0';
				    when 7=>scl<='0';
				    when 8=>count1:=0;
					R_current_state<=R_transmit_slave_address;
				    when others=>null;
				    end  case;
		
	 when R_transmit_slave_address=>count1:=count1+1;  --发送器件从地址
	                case count1 is
				    when 1=>sda<=write_slave_address(cnt1);
				    when 3=>scl<='1';
				    when 7=>scl<='0';
				    when 8=>cnt1:=cnt1-1; 
					        count1:=0;
					        if cnt1=0 then 
							cnt1:=8;
					        R_current_state<=R_check_ack1;
					        else R_current_state<=R_transmit_slave_address;
					        end if;
				    when others=>null;
				    end case;
					
	 when R_check_ack1=>count1:=count1+1;         --查询应答信号
	                case count1 is
				    when 1 =>sda<='Z';
				    when 3 =>scl<='1';
				    when 5 =>if sda = '0' then
				             R_current_state<=R_check_ack1;
				             else
				             R_current_state<=R_prepare;
				             end if;				    
				    when 7 =>scl<='0';				    				    				    
				    when 8 =>R_current_state<=R_transmit_sub_address;						  
						     count1:=0;
				    when others=>null;
				    end case;

     when R_transmit_sub_address=>count1:=count1+1; --发送器件子地址
	                case count1 is				   
				    when 1=>sda<=sub_address(cnt1);
				    when 3=>scl<='1';
				    when 7=>scl<='0';
				    when 8=>cnt1:=cnt1-1;
					        count1:=0;
					        if cnt1=0 then 
							cnt1:=8;
					        R_current_state<=R_check_ack2;
					        else R_current_state<=R_transmit_sub_address;
					        end if;
				    when others=>null;
				    end case;			 
	
	 when R_check_ack2=>count1:=count1+1;         --查询应答信号
	                case count1 is
				    when 1 =>sda<='Z';
				    when 3 =>scl<='1';
				    when 5 =>if sda = '0' then
				             R_current_state<=R_check_ack2;
				             else
				             R_current_state<=R_prepare;
				             end if;				    
				    when 7 =>scl<='0';				    				    				    
				    when 8 =>R_current_state<=R_start1;						  
						     count1:=0;
				    when others=>null;
				    end case;					
	
	 when R_start1=>count1:=count1+1;   --重新起始信号产生状态
	                case count1 is
				    when 1=> sda<='1';
				    when 3=> scl<='1';
				    when 5=> sda<='0';
				    when 7=> scl<='0';
				    when 8=> count1:=0;
					         R_current_state<=R_transmit_read;
				    when others=>null;
				    end case;
					
	 when R_transmit_read=>count1:=count1+1; --发送器件从地址
	                case count1 is
				    when 1=>sda<=read_slave_address(cnt1);
				    when 3=>scl<='1';
				    when 7=>scl<='0';
				    when 8=>cnt1:=cnt1-1;
					        count1:=0;
					        if cnt1=0 then 
							cnt1:=8;
					        R_current_state<=R_check_ack3;
					        else R_current_state<=R_transmit_read;
					        end if;
				    when others=>null;
				    end case;
	
	 when R_check_ack3=>count1:=count1+1;         --查询应答信号
	                case count1 is
				    when 1 =>sda<='Z';
				    when 3 =>scl<='1';
				    when 5 =>if sda = '0' then
				             R_current_state<=R_check_ack3;
				             else
				             R_current_state<=R_prepare;
				             end if;				    
				    when 7 =>scl<='0';				    				    				    
				    when 8 =>R_current_state<=R_read_data1;						  
						     count1:=0;
				    when others=>null;
				    end case;	
								  
	 when R_read_data1=>count1:=count1+1;FLAG<='0';         --读操作
	                case count1 is
				    when 1=>sda<='Z';			    
				    when 3=>scl<='1';
				    when 5=>RTC_SEC(cnt1)<=sda;				    
				    when 7=>scl<='0';				    
				    when 8=>cnt1:=cnt1-1;
					        count1:=0;
					        if cnt1=0 then 
							cnt1:=8;
					        R_current_state<=R_check_ack4;
					        FLAG<='1';
					        else R_current_state<=R_read_data1;
					        end if;
				    when others=>null;
				    end case;
					
	  when R_check_ack4=>count1:=count1+1;         --查询应答信号
	                case count1 is
				    when 1 =>sda<='0';
				    when 3 =>scl<='1';				    
				    when 7 =>scl<='0';				    				    				    
				    when 8 =>R_current_state<=R_read_data2;						  
						     count1:=0;
				    when others=>null;
				    end case;
				
	 when R_read_data2=>count1:=count1+1;FLAG<='0';         --读操作
	                case count1 is
				    when 1=>sda<='Z';			    
				    when 3=>scl<='1';
				    when 5=>RTC_MIN(cnt1)<=sda;				    
				    when 7=>scl<='0';				    
				    when 8=>cnt1:=cnt1-1;
					        count1:=0;
					        if cnt1=0 then 
							cnt1:=8;
					        R_current_state<=R_check_ack5;
					        FLAG<='1';
					        else R_current_state<=R_read_data2;
					        end if;
				    when others=>null;
				    end case;
	
	  when R_check_ack5=>count1:=count1+1;         --查询应答信号
	                case count1 is
				    when 1 =>sda<='0';
				    when 3 =>scl<='1';				    
				    when 7 =>scl<='0';				    				    				    
				    when 8 =>R_current_state<=R_read_data3;						  
						     count1:=0;
				    when others=>null;
				    end case;			
	
     when R_read_data3=>count1:=count1+1;FLAG<='0';         --读操作
	                case count1 is
				    when 1=>sda<='Z';			    
				    when 3=>scl<='1';
				    when 5=>RTC_HOR(cnt1)<=sda;				    
				    when 7=>scl<='0';				    
				    when 8=>cnt1:=cnt1-1;
					        count1:=0;
					        if cnt1=0 then 
							cnt1:=8;
					        R_current_state<=R_check_ack6;
					        FLAG<='1';
					        else R_current_state<=R_read_data3;
					        end if;
				    when others=>null;
				    end case;	
				
	 when R_check_ack6=>count1:=count1+1;         --查询应答信号
	                case count1 is
				    when 1 =>sda<='0';
				    when 3 =>scl<='1';				    
				    when 7 =>scl<='0';				    				    				    
				    when 8 =>R_current_state<=R_read_data4;						  
						     count1:=0;
				    when others=>null;
				    end case;	
		
	 when R_read_data4=>count1:=count1+1;FLAG<='0';         --读操作
	                case count1 is
				    when 1=>sda<='Z';			    
				    when 3=>scl<='1';
				    when 5=>RTC_DAY(cnt1)<=sda;				    
				    when 7=>scl<='0';				    
				    when 8=>cnt1:=cnt1-1;
					        count1:=0;
					        if cnt1=0 then 
							cnt1:=8;
					        R_current_state<=R_check_ack7;
					        FLAG<='1';
					        else R_current_state<=R_read_data4;
					        end if;
				    when others=>null;
				    end case;
				
	 when R_check_ack7=>count1:=count1+1;         --查询应答信号
	                case count1 is
				    when 1 =>sda<='0';
				    when 3 =>scl<='1';				    
				    when 7 =>scl<='0';				    				    				    
				    when 8 =>R_current_state<=R_read_data5;						  
						     count1:=0;
				    when others=>null;
				    end case;		
	
	when R_read_data5=>count1:=count1+1;FLAG<='0';         --读操作
	                case count1 is

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -