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

📄 i2c_cmd.v

📁 AV视频信号输入后
💻 V
字号:
module i2c_cmd(clk,rst,rom_data,busy,
               rom_addr,i2c_data_t,cmd_stop,cmd_start,cmd_send,
               execute,i2c_w_finish
               );
//Io defination
input          clk,rst,busy;
input [7:0]    rom_data;

output         cmd_stop,cmd_start,cmd_send,execute,i2c_w_finish;
output[6:0]    rom_addr;
output[7:0]    i2c_data_t;



reg            cmd_stop,cmd_start,cmd_send,execute,i2c_w_finish;
reg[6:0]       rom_addr;
reg[7:0]       i2c_data_t;

//Internal Reg
parameter      GEN_S='H1, S_WAIT='H2, 
               SUBADDR='H5, SUBADDR_ACK='H6, DATA='H7, DATA_ACK='H8,
               GEN_P='H9, P_WAIT='HA, IDLE='HB ,I2C_W_OK='HC,HALT='HD,CREATE_CHIP_RST='HE;
reg   [3:0]    STATE;
reg            group_index;


always @ (posedge clk)
begin
if(!rst)
  begin
  STATE<=IDLE;
  cmd_stop<=0;
  cmd_start<=0;
  cmd_send<=0;
  execute<=0;
  rom_addr<='b0;
  i2c_data_t<='b0;
  group_index<='b0;
  i2c_w_finish<=0;
  end
else
  case (STATE)
  IDLE: begin
        STATE<=GEN_S;
        end
  GEN_S:begin
        i2c_data_t<='h4A;    //Saa7113 Write Address
        cmd_start<=1;
        execute<=1;
        if(busy)
           STATE<=S_WAIT;
        else
           STATE<=GEN_S;
        end
 S_WAIT:begin
        cmd_start<=0;
        execute<=0;
        if (!busy)
           STATE<=SUBADDR;  //SLAVE_W;
        else
           STATE<=S_WAIT;
        end
 SUBADDR:
        begin
        i2c_data_t<=group_index? 'h40 : 'h01;     //Start of Group Address 
        cmd_send<=1;
        execute<=1;  
        if(busy)
           STATE<=SUBADDR_ACK;
        else
           STATE<=SUBADDR;
        end
 SUBADDR_ACK:
        begin
        cmd_send<=0;
        execute<=0;
        rom_addr<=group_index?  'h40 : 'h01; 
        if (!busy)
           STATE<=DATA;
        else
           STATE<=SUBADDR_ACK;
        end
 DATA:  begin
        i2c_data_t<=rom_data;     //Data
        cmd_send<=1;
        execute<=1;  
        if(busy)
           STATE<=DATA_ACK;
        else
           STATE<=DATA;
        end
 DATA_ACK:
        begin
        cmd_send<=0;
        execute<=0;
        if (!busy)
           begin
           if( ((!group_index) & (rom_addr>='h17)) | ((group_index) & (rom_addr>='h5f)) ) 
               STATE<=GEN_P;
           else
               begin
               rom_addr<=rom_addr+1;   
               STATE<=DATA;
               end
           end
        else
           STATE<=DATA_ACK;
        end
  GEN_P:begin
        cmd_stop<=1;
        execute<=1;
        if(busy)
           STATE<=P_WAIT;
        else
           STATE<=GEN_P;
        end
 P_WAIT:begin
        cmd_stop<=0;
        execute<=0;
        if (!busy)
           STATE<=I2C_W_OK;
        else
           STATE<=P_WAIT;
        end

 I2C_W_OK:
        begin
        if (group_index)
           begin
           STATE<=HALT;
           end
        else
           begin
           group_index<=1;
           STATE<=GEN_S;
           end 
		end 
 HALT:  begin
        STATE<=HALT;
        i2c_w_finish<=1;
        end
 default: STATE<=IDLE;
 endcase
end

endmodule 

⌨️ 快捷键说明

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