Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
input Reset;
input CLK19;
input Start; // Импульс раз в секунду
input SPI_DI;
output SPI_CS;
output SPI_CLK;
output [11:0] Temperature;
reg SPI_CS, SPI_CLK;
reg [11:0] Temperature;
reg [1:0] Count_4; // Счетчик 4-х импульсов CLK19 (для формирования интервала времени < 200 нс)
reg [3:0] Count_16; // Счетчик количества считываемых с датчика бит (всего 16)
reg State; // Состояние автомата
localparam Busy = 1'b0;
localparam Read = 1'b1;
localparam [7:0] Warning_Level = 32;
localparam [7:0] Failure_Level = 40;
always @(posedge CLK19) begin
if (!Reset) begin
SPI_CS = 1;
SPI_CLK = 0;
Temperature = 0;
Count_4 = 0;
Count_16 = 0;
State = Busy;
end //if
else begin
case (State)
Busy : begin
if (Start) begin
SPI_CS = 0;
SPI_CLK = 0;
State = Read;
Count_4 = 0;
Count_16 = 0;
end //if
end //Busy
Read : begin
if (Count_4 == 1) begin
SPI_CLK = 1;
case (Count_16)
4'b0000 : Temperature[8] = SPI_DI;
4'b0001 : Temperature[7] = SPI_DI;
4'b0010 : Temperature[6] = SPI_DI;
4'b0011 : Temperature[5] = SPI_DI;
4'b0100 : Temperature[4] = SPI_DI;
4'b0101 : Temperature[3] = SPI_DI;
4'b0110 : Temperature[2] = SPI_DI;
4'b0111 : Temperature[1] = SPI_DI;
4'b1000 : Temperature[0] = SPI_DI;
4'b1101 : Temperature[9] = (SPI_DI) ? 1 : 0; // Если 1 , то ошибка
4'b1110 : Temperature[10] = (Temperature[7:0] >= Warning_Level) ? 1 : 0;
4'b1111 : Temperature[11] = (Temperature[7:0] >= Failure_Level) ? 1 : 0;
endcase //Count_16
end //if
else if (Count_4 == 3) begin
SPI_CLK = 0;
if (Count_16 == 15) begin
SPI_CS = 1;
State = Busy;
end //if
end //else if
if (Count_4 == 3) Count_16 = Count_16 + 1;
Count_4 = Count_4 + 1;
end //Read
endcase //State
end //else
end //always
endmodule //MAX6627