//file state //Rev.: rev.1.0 module spi_state( sclk, sclk_o, cs, scl_en, wait_en, allone_en, allzero_en, command_en, allone_prep_en, allzero_prep_en, command_prep_en, data_recieve_en, data_fix_en, scl_16cnt, wait_cnt, clk_div, rst); //////////output//// output sclk ; output sclk_o ; output cs ; output scl_en ;//SCLKを動かすステートenable信号 counter.vへ output wait_en ;//WAITステートenable信号 counter.vへ output allone_en ;//ALL 1 を送るステートenable信号 spi_tx.vへ output allone_prep_en ;//ALL 1 を送る前のステートenable信号 spi_tx.vへ output allzero_en ;//ALL 0 を送るステートenable信号 spi_tx.vへ output allzero_prep_en ;//ALL 0 を送る前のステートenable信号 spi_tx.vへ output command_en ;//コマンドを送るステートenable信号 spi_tx.vへ output command_prep_en ;//コマンドを送る前のステートenable信号 spi_tx.vへ output data_recieve_en ;//データを受け取るステートenable信号 spi_rx.vへ output data_fix_en ;//データを確定するステートenable信号 spi_rx.vへ //////////input///// input rst ; input clk_div ; input [4:0]scl_16cnt; input [17:0]wait_cnt; //////////reg/////// reg[4:0]state /* synthesis syn_encoding = "safe, original" */; //おまじない(アトリビュート指定) reg scl; //////////wire////// wire cs,cs_en,scl_en,wait_en,command_en,allone_en,allzero_en, data_recieve_en, data_fix_en, command_prep_en, allone_prep_en, allzero_prep_en, scl_high_en; /////////parameter// parameter s00 = 5'b00000;//各ステートをパラメータ化 parameter s01 = 5'b00001; parameter s02 = 5'b00010; parameter s03 = 5'b00011; parameter s04 = 5'b00100; parameter s05 = 5'b00101; parameter s06 = 5'b00110; parameter s07 = 5'b00111; parameter s08 = 5'b01000; parameter s09 = 5'b01001; parameter s10 = 5'b01010; parameter s11 = 5'b01011; parameter s12 = 5'b01100; parameter s13 = 5'b01101; parameter s14 = 5'b01110; parameter s15 = 5'b01111; parameter s16 = 5'b10000; parameter s17 = 5'b10001; parameter s18 = 5'b10010; parameter s19 = 5'b10011; localparam W_CNT = 18'b111101000010010000; // 000000000011111010 // 111101000010010000 localparam S_CNT = 5'b11111; //////////assign_enable////////////////////////// /////for_chip_select////////// assign cs_en = ((state==s00)||(state==s03)||(state==s04)||(state==s07)||(state==s08)||(state==s11)||(state==s12)||(state==s15)||(state==s16)||(state==s19)) ? 1'b1 : 1'b0; /////for_scl////////// assign scl_en = ((state==s02)||(state==s06)||(state==s10)||(state==s14)||(state==s18)) ? 1'b1 : 1'b0; assign scl_high_en = ((wait_en==1'b1)||(state==s03)||(state==s07)||(state==s11)||(state==s15)||(state==s19)||(state==s01)||(state==s05)||(state==s09)||(state==s13)||(state==s17)) ? 1'b1 : 1'b0; /////for_wait///////// assign wait_en = ((state==s04)||(state==s08)||(state==s12)||(state==s16)) ? 1'b1 : 1'b0; /////for_spi_tx.v////////// assign command_prep_en = (state==s13) ? 1'b1 : 1'b0; assign command_en = (state==s14) ? 1'b1 : 1'b0; assign allzero_prep_en = ((state==s01)||(state==s17)) ? 1'b1 : 1'b0; assign allzero_en = ((state==s02)||(state==s18))? 1'b1 : 1'b0; assign allone_prep_en = ((state==s05)||(state==s09)) ? 1'b1 : 1'b0; assign allone_en = ((state==s06)||(state==s10))? 1'b1 : 1'b0; /////for_spi_rx.v////////// assign data_recieve_en = (state==s18) ? 1'b1 : 1'b0; assign data_fix_en = (state==s19) ? 1'b1 : 1'b0; //////////Chip_Select_Comtrol//////////////////// assign cs = (cs_en==1'b1) ? 1'b1 : 1'b0; //////////SCL_Comtrol//////////////////////////// always @ ( posedge clk_div or posedge rst ) begin if(rst == 1'b1) begin scl <= 1'b0; end else if (scl_en == 1'b1)begin scl <= scl + 1'b1; end//else else if (scl_en == 1'b0)begin scl <= 1'b1; end//else end//always assign sclk =(scl_high_en==1'b1) ? 1'b1 : ~scl; assign sclk_o = ~scl;//温度センサの立ち上がりエッジはFPGAからみると立下りのため反転 //////////State_Machine////////////////////////// always @ ( posedge clk_div or posedge rst ) begin if(rst == 1'b1) begin state <= 5'b00000; end else begin case (state) s00 : begin//Initial////////// state <=s01; end ////////CS_LOW//////////////// s01 : begin state <= s02; end ////////send 0 for 16 bits////// s02 : begin if(scl_16cnt==S_CNT)begin state <= s03; end end ////////CS_High///////////////// s03 : begin state <= s04; end ////////wait/////////////////// s04 : begin if(wait_cnt==W_CNT)begin state <= s05; end end ////////CS_Low////////////////// s05 : begin state <= s06; end ////////send 1 for 16bits/////////// s06 : begin if(scl_16cnt==S_CNT)begin state <= s07; end end ////////CS_High///////////////////// s07 : begin state <= s08; end ////////wait//////////////////// s08 : begin if(wait_cnt==W_CNT)begin state <= s09; end end ////////CS_LOW/// s09 : begin state <= s10; end ////////send 1 for 16bits/////////// s10 : begin if(scl_16cnt==S_CNT)begin state <= s11; end end ////////CS_High///////////////////// s11 : begin state <= s12; end ////////wait//////////////////// s12 : begin if(wait_cnt==W_CNT)begin state <= s13; end end ////////CS_LOW/// s13 : begin state <= s14; end ////////send commands 16bits/////////// s14 : begin if(scl_16cnt==S_CNT)begin state <= s15; end end ////////CS_High///////////////////// s15 : begin state <= s16; end ////////wait//////////////////// s16 : begin if(wait_cnt==W_CNT)begin state <= s17; end end ////////CS_LOW/// s17 : begin state <= s18; end ////////send 0 for 16bits/////////// s18 : begin if(scl_16cnt==S_CNT)begin state <= s19; end end ////////CS_High///////////////////// s19 : begin state <= s16; end ////////def///////////////// default : begin state <= s00; end endcase end//else end//always endmodule