📄 thermal_bakk.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 + -