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

📄 thermal_bakk.v

📁 基于SIIGX的PCIe的Kit
💻 V
字号:
/* write/read for MAX1619 Temp_sensor */
/* write Temperature Limits to MAX1619 */
/* Temp_high_Limit = 55C (Fan ON) Temp_Hyst = 40C (Fan Off)*/
/* Read data from MAX1619 and display to seven segment */

module thermal(clock_in, reset, smb_clock, smb_data, data_out,start);

/*port list */	
output 		smb_clock;
output		[7:0]	data_out;
//output		[3:0]	remain_out;
inout 		smb_data;
input 		clock_in;
input		reset;
input		start;

//internal data structures
reg			clock;
wire 		smb_data_in;
reg 		[7:0] data_read;
reg 		[7:0] data_o;
reg			[8:0] smb_data_out;
reg			[4:0] state;
//reg			[3:0] count;
reg			temp;
reg			data_control;
reg			clock_control;
// reg			read;
integer		count;
reg			[2:0]	rw_ctr;
reg			[7:0]	data_w;

parameter	read			=	1'b1;
parameter	write			=	1'b0;
parameter	address			=	7'b0011000;
parameter	thermal_reg		=	8'h01;
parameter	state_zero		=	5'b00000;			//0
parameter	state_one		=	5'b00001;			//1
parameter	state_two		=	5'b00010;			//2
parameter	state_three		=	5'b00011;			//3
parameter	state_four		=	5'b00100;			//4
parameter	state_five		=	5'b00101;			//5
parameter	state_six		=	5'b00110;			//6
parameter	state_seven		=	5'b00111;			//7
parameter	state_eight		=	5'b01000;			//8
parameter	state_nine		=	5'b01001;			//9
parameter	state_ten		=	5'b01010;			//10
parameter	state_eleven	=	5'b01011;			//11
parameter	state_twelve	=	5'b01100;			//12
parameter	state_w_zero	=	5'b01101;			//13 									
parameter	state_w_one		=	5'b01110;			//14 									
parameter	state_w_two		=	5'b01111;			//15 									
parameter	state_w_three	=	5'b10000;			//16 									
parameter	state_w_four	=	5'b10001;			//17 									
parameter	state_w_five	=	5'b10010;			//18 									
parameter	state_w_six		=	5'b10011;			//19 									
parameter	state_w_seven	=	5'b10100;			//20 									
parameter	state_w_eight	=	5'b10101;			//21 									
parameter	state_w_nine	=	5'b10110;			//22 									
parameter	state_w_ten		=	5'b10111;			//23 									
parameter	state_w_eleven	=	5'b11000;			//24 									
parameter	state_w_twelve	=	5'b11001;			//25 									

assign		smb_data_in 	=	smb_data;
assign		data_out 		=	data_o;
assign		smb_data	 	=	data_control ? smb_data_out[8]:1'bz;
assign		smb_clock	 	=	~clock_control ? ~clock_in:1'bz;


// Synchronize the module outputs.

always @ (posedge clock_in or negedge start)

	begin
		if	(~start)
		begin
			state	<=	state_w_zero;													//start write code
			rw_ctr	<=	0;
		end else begin
			case	(rw_ctr)
				0:			temp_write (8'b00001001,8'b00001101);						//write configuration byte
				1:			temp_write (8'b00010010,8'b00110010);						//write Temp. Max								
				2:			temp_write (8'b00010011,8'b00101000);						//write Temp Hysterisis
				default:	temp_rw(address[6:0],read[0],thermal_reg[7:0],data_w[7:0]);	//Read 	
			endcase
		end
	end
				
task	temp_rw;
input	[6:0]	address;
input			rw;
input	[7:0]	max_reg;
input	[7:0]	data_w;

/*Read_Temperature_sense_start_code*/	
	begin
		case	(state)
			state_zero:
				begin
					clock_control		<=	1;				// 1
					data_control		<=	0;				// 1
					count				<=	8;
					smb_data_out		<=	{address[6:0],write};
					state				<=	state_one;
				end
			state_one:
				begin
					clock_control		<=	1;				// 1
					data_control		<=	1;				// 0 (need smd_data_out[8] <= 0;
					smb_data_out[8]		<=	0;
//					clock				=	1'b0;	
					state				<=	state_two;
				end								
			state_two:
				begin
					clock_control		<=	0;
					data_control		<=	1;
					clock				=	clock_in;
					smb_data_out[8]		<=	smb_data_out[count-1];
					count 				<= count -1;
					if (count == 0)	
						begin
						data_control	<=	0;
						count			<=	8;
						state			<=	state_three;
						end
					else
						state			<=	state_two;
							
				end	
			state_three:
				begin				
					//clock_control		<=	0;
					// data_control		<=	0;
					//smb_data_out		<=	max_reg;		// thermal_reg;
					// count				<=	8;
					if (~smb_data_in) 
						begin
						
							clock_control		<=	0;
							data_control		<=	1;
							smb_data_out[8]		<=	max_reg[7];
							smb_data_out[7:0]	<=	max_reg;
							count				<=	8-1;
							state				<=	state_five;						
					//		clock_control	<=	0;
					//		data_control	<=	1;
					//		smb_data_out[8]	<=	smb_data_out[count-1];
					//		count 			<= count - 1;
					//		state			<=	state_five;
						end
					else
						state			<=	state_three;
									
				end		
			state_four:
				begin
					clock_control		<=	1;
					data_control		<=	1;
//					smb_data_out[0]		<=	1'b1;
					clock				=	1'b0;	
					state				<=	state_five;
				end								
			state_five:
				begin
					clock_control		<=	0;
					data_control		<=	1;
					clock				=	clock_in;				// remove
					smb_data_out[8]		<=	smb_data_out[count-1];
					count 				<= count - 1;
					if (count == 0)	
						begin
						state			<=	state_six;
						data_control	<=	0;						
						end
					else
						state			<=	state_five;
							
				end	
			state_six:
				begin				
					data_control		<=	0;
					// smb_data_out		<=	address << 1;
					// smb_data_out[0]		<=	rw;						// 1'b1;
					smb_data_out		<=	{address[6:0],write};
					count				<=	8;
					if (~smb_data_in) 
						begin
						clock_control	<=	1;
						state			<=	state_seven;
						end
					else
						state			<=	state_six;
							
				end		
			state_seven:
				begin
					clock_control		<=	1;
					data_control		<=	0;
					state				<=	state_eight;
				end
			state_eight:
				begin
					clock_control		<=	1;
					data_control		<=	1;
					clock				=	1'b0;	
					state				<=	state_nine;
				end								
			state_nine:
				begin
					clock_control		<=	0;
					data_control		<=	1;
					clock				=	clock_in;
					smb_data_out[8]		<=	smb_data_out[count-1];
					count 				= count -1;
					if (count == 0)	
						state			<=	state_ten;
					else
						state			<=	state_nine;
							
				end	
			state_ten:
				begin				
					data_control		<=	0;
					count				<=	8;
					if (~smb_data_in) begin
						clock_control	<=	1;
						state			<=	state_eleven;
						end
					else
						state			<=	state_ten;
									
				end			

			state_eleven:
				begin				
					clock_control			<=	0;
					data_control			<=	0;
					data_read[0]		<=	smb_data_in;
					count				<=	count - 1;
					if (count == 0) 
						begin
						count			<=	8;				
						smb_data_out	<=	address << 1;
						smb_data_out[0]	<=	1'b1;
						data_o			<=	data_read;
						clock_control	<=	0;
						state			<=	state_twelve;
						end
					else	
						begin
						data_read[7]	<=	data_read[6];
						data_read[6]	<=	data_read[5];
						data_read[5]	<=	data_read[4];
						data_read[4]	<=	data_read[3];
						data_read[3]	<=	data_read[2];
						data_read[2]	<=	data_read[1];
						data_read[1]	<=	data_read[0];
						state			<=	state_eleven;
						end
									
				end						
			state_twelve:
				begin				
					clock_control		<=	1;
					data_control		<=	0;
					count				<=	count - 1;
					if (count == 0)
						 begin
						count			<=	8;				
//						smb_data_out	<=	address << 1;
						state			<=	state_seven;
						end
					else	
						begin
						state			<=	state_twelve;
						end	
				end							
									
			default:	state 			<= state_zero;

			endcase	
//		end						
	end
endtask


/*Write_Temperature_sense_start_code*/	

task	temp_write ;															//task write blocks 
input	[7:0]	smb_write_addr;													//7'b0011000 (0 last bit is wr)
input	[7:0]	smb_write_data;
/*
parameter smb_wca_out 			= 8'b00001001;									//Write Configuration Byte 09h
parameter smb_wca_data_out 		= 8'b00101101;									//Write Configuration data 2Dh
parameter smb_wrtm_out			= 8'b00010010;									//Write Temp Max 12h
parameter smb_wrtm_data_out		= 8'b00110000;								
parameter smb_wrth_out			= 8'b00010011;
parameter smb_wrth_data_out		= 8'b00101000;
*/
 	case (state)
			state_w_zero:														//write start
				begin
					clock_control		<=	1;
					data_control		<=	0;
					count				<=	8;
					smb_data_out		<=	{address[6:0],write};				// do in read above !!!
					state				<=	state_w_one;
				end
			state_w_one:														//write start bit
				begin
					clock_control		<=	1;
					data_control		<=	1;
					smb_data_out[8]		<=	0;
					state				<=	state_w_two;
				end								
				
			state_w_two:														//write slave address to Max1619 (7bits) 0011000
				begin
					clock_control		<=	0;
					data_control		<=	1;
					clock				=	clock_in;
					smb_data_out[8]		<=	smb_data_out[count-1];				//smb_data_out = 7bits 0011000 and write bit
					count 				<= 	count -1;
					if (count == 0)	
						begin
						data_control	<=	0;
						count			<=	8;
						state			<=	state_w_three;
						end
					else
						state			<=	state_w_two;
				end	
				
			state_w_three:														//waiting for ack
				begin				
					if (~smb_data_in) 
						begin
							clock_control		<=	0;
							data_control		<=	1;
							smb_data_out[8]		<=	smb_write_addr[7];
							smb_data_out[7:0]	<=	smb_write_addr;
							count 				<= 	8-1;
							state				<=	state_w_five;
						end else begin 
						state					<=	state_w_three;
					end				
				end		
										
			state_w_five:														//write command to slave Max1619
				begin															
					clock_control		<=	0;
					data_control		<=	1;									// move to else
					clock				=	clock_in;
					smb_data_out[8]		<=	smb_write_addr[count-1];			//write config byte 09h
					count 				<= 	count - 1;
					if (count == 0)	
						begin
						state			<=	state_w_six;
						data_control	<=	0;						
						end
					else
						state			<=	state_w_five;
							
				end	
										
			state_w_six:														//waiting for acknowdlege from slave
				begin				
					if (~smb_data_in) 											//once ack receive go to state_seven
						begin
							clock_control		<=	0;
							data_control		<=	1;
							smb_data_out[8]		<=	smb_write_data[7];
							smb_data_out[7:0]	<=	smb_write_data;
							count				<=	8-1;
							state			<=	state_w_nine;
						end
					else
						state			<=	state_w_six;
				end		
			state_w_nine:														//write data to slave Max1619
				begin
					clock_control		<=	0;
					data_control		<=	1;
					clock				=	clock_in;
					smb_data_out[8]		<=	smb_write_data[count-1];			//data = 2Dh 0010 1101
					count 				<= 	count -1;
					if (count == 0)	
					begin
						data_control	<=	0;
						state			<=	state_w_ten;
					end else begin
						state			<=	state_w_nine;
					end
				end	
								
			state_w_ten:														//receive acknowledge from slave Max1619
				begin				

					if (~smb_data_in) 
						begin
						data_control	<=	1;
						smb_data_out[8]	<=	0;
						state			<=	state_w_eleven;
						end
					else
						state			<=	state_w_ten;
				end		
				
			state_w_eleven:														//tri-state
				begin
					clock_control		<=	1;
					data_control		<=	1;
					smb_data_out[8]		<=	0;
					state				<=	state_w_twelve;
				end			
				
			state_w_twelve:														//tri-state stop bit
				begin
					clock_control		<=	1;
					data_control		<=	1;
					smb_data_out[8]		<=	1;
					rw_ctr				<=	rw_ctr + 1;							// loop 3 times for write
					if	(rw_ctr != 3)
						begin
							state			<=	state_w_zero;					
						end 
					else 
						begin
							state			<=	state_zero;						// go to read temp sensor
						end
				end		

	endcase
endtask

endmodule

⌨️ 快捷键说明

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