求教verilog i2c小程序

求教verilog i2c小程序,第1张

module iic_func_module

(

     input CLK,

 input RSTn,

 

 input [1:0]Start_Sig,

 input [7:0]Addr_Sig,

 input [7:0]WrData,

 output [7:0]RdData,

 output Done_Sig,

 

 output SCL,

 inout SDA,

 

 /***************/

 output [4:0]SQ_i

 

)

    /*************************/

    

 parameter FREQ = 9'd200

 

 /*************************/

 

 reg [4:0]i

 reg [4:0]Go

    reg [8:0]C1

 reg [7:0]rData

 reg rSCL

 reg rSDA

 reg isAck

    reg isDone

    reg isOut  

 

 always @ ( posedge CLK or negedge RSTn )

     if( !RSTn )

      begin

     i <= 5'd0

 Go <= 5'd0

 C1 <= 9'd0

 rData <= 8'd0

 rSCL <= 1'b1

 rSDA <= 1'b1

 isAck <= 1'b1

     isDone <= 1'b0

 isOut <= 1'b1

end

  else if( Start_Sig[0] )

      case( i )

    

    0: // Start

 begin

      isOut = 1

 

      rSCL <= 1'b1

  

      if( C1 == 0 ) rSDA <= 1'b1 

  else if( C1 == 100 ) rSDA <= 1'b0  

  

  if( C1 == FREQ -1) begin C1 <= 9'd0 i <= i + 1'b1 end

  else C1 <= C1 + 1'b1

 end

  

 1: // Write Device Addr

 begin rData <= {4'b1010, 3'b000, 1'b0} i <= 5'd7 Go <= i + 1'b1 end

 

 2: // Wirte Word Addr

 begin rData <= Addr_Sig i <= 5'd7 Go <= i + 1'b1 end

     3: // Write Data

 begin rData <= WrData i <= 5'd7 Go <= i + 1'b1 end

 

 /*************************/

 

 4: // Stop

 begin

      isOut = 1'b1

  

      if( C1 == 0 ) rSCL <= 1'b0

      else if( C1 == 50 ) rSCL <= 1'b1 

                  

  if( C1 == 0 ) rSDA <= 1'b0

  else if( C1 == 150 ) rSDA <= 1'b1

    

  if( C1 == 50 + FREQ -1 ) begin C1 <= 9'd0 i <= i + 1'b1 end

  else C1 <= C1 + 1'b1 

 end

 

 5:

 begin isDone <= 1'b1 i <= i + 1'b1 end

 

 6: 

 begin isDone <= 1'b0 i <= 5'd0 end

 

 /*******************************/ //function

 

 7,8,9,10,11,12,13,14:

 begin

      isOut = 1'b1

  rSDA <= rData[14-i]

  

  if( C1 == 0 ) rSCL <= 1'b0

      else if( C1 == 100 ) rSCL <= 1'b1 

  

  if( C1 == FREQ -1 ) begin C1 <= 9'd0 i <= i + 1'b1 end

  else C1 <= C1 + 1'b1

 end

 

 15: // waiting for acknowledge

 begin

      isOut = 1'b0

      if( C1 == 150 ) isAck <= SDA

  

  if( C1 == 0 ) rSCL <= 1'b0

  else if( C1 == 100 ) rSCL <= 1'b1

  

  if( C1 == FREQ -1 ) begin C1 <= 9'd0 i <= i + 1'b1 end

  else C1 <= C1 + 1'b1 

 end

 

 16:

 if( isAck != 0 ) i <= 5'd0

 else i <= Go 

 

 /*******************************/ // end function

    

endcase

  else if( Start_Sig[1] ) 

      case( i )

    0: // Start

 begin

      isOut = 1

      

      rSCL <= 1'b1

  

      if( C1 == 0 ) rSDA <= 1'b1 

  else if( C1 == 100 ) rSDA <= 1'b0  

  

  if( C1 == FREQ -1 ) begin C1 <= 9'd0 i <= i + 1'b1 end

  else C1 <= C1 + 1'b1

 end

  

 1: // Write Device Addr

 begin rData <= {4'b1010, 3'b000, 1'b0} i <= 5'd9 Go <= i + 1'b1 end

 

 2: // Wirte Word Addr

 begin rData <= Addr_Sig i <= 5'd9 Go <= i + 1'b1 end

 3: // Start again

 begin

      isOut = 1'b1

      

      if( C1 == 0 ) rSCL <= 1'b0

  else if( C1 == 50 ) rSCL <= 1'b1

  else if( C1 == 250 ) rSCL <= 1'b0

  

      if( C1 == 0 ) rSDA <= 1'b0 

  else if( C1 == 50 ) rSDA <= 1'b1

  else if( C1 == 150 ) rSDA <= 1'b0  

  

  if( C1 == 300 -1 ) begin C1 <= 9'd0 i <= i + 1'b1 end

  else C1 <= C1 + 1'b1

 end

 

 4: // Write Device Addr ( Read )

 begin rData <= {4'b1010, 3'b000, 1'b1} i <= 5'd9 Go <= i + 1'b1 end

     5: // Read Data

 begin rData <= 8'd0 i <= 5'd19 Go <= i + 1'b1 end

 

 6: // Stop

 begin

      isOut = 1'b1

 

                          if( C1 == 0 ) rSCL <= 1'b0

      else if( C1 == 50 ) rSCL <= 1'b1 

                  

  if( C1 == 0 ) rSDA <= 1'b0

  else if( C1 == 150 ) rSDA <= 1'b1     

  

  if( C1 == 50 + FREQ -1 ) begin C1 <= 9'd0 i <= i + 1'b1 end

  else C1 <= C1 + 1'b1 

 end

 

 7:

 begin isDone <= 1'b1 i <= i + 1'b1 end

 

 8: 

 begin isDone <= 1'b0 i <= 5'd0 end

 

 /*******************************/ //function

 9,10,11,12,13,14,15,16:

 begin

      isOut = 1'b1

      

  rSDA <= rData[16-i]

  

  if( C1 == 0 ) rSCL <= 1'b0

      else if( C1 == 100 ) rSCL <= 1'b1 

  

  if( C1 == FREQ -1 ) begin C1 <= 9'd0 i <= i + 1'b1 end

  else C1 <= C1 + 1'b1

 end

       

 17: // waiting for acknowledge

 begin

      isOut = 1'b0

     

  if( C1 == 150 ) isAck <= SDA

  

  if( C1 == 0 ) rSCL <= 1'b0

  else if( C1 == 100 ) rSCL <= 1'b1

  

  if( C1 == FREQ -1 ) begin C1 <= 9'd0 i <= i + 1'b1 end

  else C1 <= C1 + 1'b1 

 end

 

 18:

 if( isAck != 0 ) i <= 5'd0

 else i <= Go

 

 /*****************************/

 

 19,20,21,22,23,24,25,26: // Read

 begin

     isOut = 1'b0

     if( C1 == 150 ) rData[26-i] <= SDA

  

  if( C1 == 0 ) rSCL <= 1'b0

  else if( C1 == 100 ) rSCL <= 1'b1 

  

  if( C1 == FREQ -1 ) begin C1 <= 9'd0 i <= i + 1'b1 end

  else C1 <= C1 + 1'b1

 end   

 

 27: // no acknowledge

 begin

     isOut = 1'b1

     //if( C1 == 100 ) isAck <= SDA

  

  if( C1 == 0 ) rSCL <= 1'b0

  else if( C1 == 100 ) rSCL <= 1'b1

  

  if( C1 == FREQ -1 ) begin C1 <= 9'd0 i <= Go end

  else C1 <= C1 + 1'b1 

 end

 

 /*************************************/ // end fucntion

endcase

 /***************************************/

    assign Done_Sig = isDone

 assign RdData = rData

 assign SCL = rSCL

 assign SDA = isOut ? rSDA : 1'bz 

    /***************************************/

 

 assign SQ_i = i

 

 /******************************/

endmodule

什么是单个数据?IIC总线就是把所需的数据经sda数据线串行传入芯片中,需要多少传多少就是 了,我这有个以前写的IIC控制WM8731的例程,你可以参考下

//`timescale 1ns / 1ps

module i2c_control(

clk,

i2c_sclk,

i2c_sdat,

i2c_data,

start,

tr_end,

ack,

rst,

counter,

sdo)

input clk

input [23:0]i2c_data

input start

input rst

// input w_r

inout i2c_sdat

output i2c_sclk

output tr_end

output ack

output [5:0]counter

output sdo

reg sdo

reg sclk

reg tr_end

reg [23:0]sd

reg [5:0]counter

assign i2c_sclk=sclk |(((counter>=4)&(counter<=30))?~clk:0)

assign i2c_sdat=sdo?1'bz:0

reg ack1,ack2,ack3

wire ack=ack1 |ack2 |ack3

always@(negedge rst or posedge clk)begin

if(!rst)counter<=6'b111111

else begin

if(start==0)

counter<=0

else

if(counter<6'b111111)counter<=counter+1

end

end

always@(negedge rst or posedge clk)begin

if(!rst)begin sclk<=1sdo<=1ack1<=0ack2<=0ack3<=0tr_end<=0end

else

case(counter)

6'd0 :begin ack1<=0ack2<=0ack3<=0tr_end<=0sdo<=1sclk<=1end

6'd1 :begin sd<=i2c_datasdo<=0end

6'd2 :sclk=0

6'd3 :sdo<=sd[23]

6'd4 :sdo<=sd[22]

6'd5 :sdo<=sd[21]

6'd6 :sdo<=sd[20]

6'd7 :sdo<=sd[19]

6'd8 :sdo<=sd[18]

6'd9 :sdo<=sd[17]

6'd10 :sdo<=sd[16]

6'd11 :sdo<=1'b1

6'd12 :begin sdo<=sd[15]ack1<=i2c_sdatend

6'd13 :sdo<=sd[14]

6'd14 :sdo<=sd[13]

6'd15 :sdo<=sd[12]

6'd16 :sdo<=sd[11]

6'd17 :sdo<=sd[10]

6'd18 :sdo<=sd[9]

6'd19 :sdo<=sd[8]

6'd20 :sdo<=1'b1

6'd21 :begin sdo<=sd[7]ack2<=i2c_sdatend

6'd22 :sdo<=sd[6]

6'd23 :sdo<=sd[5]

6'd24 :sdo<=sd[4]

6'd25 :sdo<=sd[3]

6'd26 :sdo<=sd[2]

6'd27 :sdo<=sd[1]

6'd28 :sdo<=sd[0]

6'd29 :sdo<=1'b1

6'd30 :begin sdo<=1'b0sclk<=1'b0ack3<=i2c_sdatend

6'd31 :sclk<=1'b1

6'd32 :begin sdo<=1'b1tr_end<=1end

endcase

end

endmodule

晕,你这个没有任何的程序描述,纯粹的输入输出

module top_design(vp_in,

vp_out,

VBLK,

FID,

fpga_0_RS232_req_to_send_pin,

fpga_0_RS232_RX_pin,

fpga_0_RS232_TX_pin,

fpga_0_Generic_GPIO_GPIO_d_out_pin, fpga_0_Generic_GPIO_GPIO_in_pin,

fpga_0_Generic_GPIO_GPIO_t_out_pin ,

fpga_0_Generic_GPIO_GPIO_IO_pin_t,

sys_clk_pin,

sys_rst_pin ,

led_0 ,

led_1,

led_2,

led_3,

led_4,

led_5 ,

VPOUT_LLC,

VPIN_LLC,

vblk_t,

avid_t,

vsync_t,

hsync_t,

fid_t,

in_clk_t,

reset_t,

vp_in_t,

IIC_IO_pin)

input [7:0]vp_in

input VBLK

input fpga_0_RS232_RX_pin

input [1:0]fpga_0_Generic_GPIO_GPIO_in_pin

input sys_clk_pin

input sys_rst_pin

input VPIN_LLC

input vblk_t

input avid_t

input vsync_t

input hsync_t

input fid_t

input in_clk_t

input vp_in_t

output [7:0]vp_out

output fpga_0_RS232_req_to_send_pin

output fpga_0_RS232_TX_pin

output [1:0]fpga_0_Generic_GPIO_GPIO_d_out_pin

output [1:0]fpga_0_Generic_GPIO_GPIO_t_out_pin

output led_0

output led_1

output led_2

output led_3

output led_4

output led_5

output VPOUT_LLC

output reset_t

inout [1:0]fpga_0_Generic_GPIO_GPIO_IO_pin_t

inout [1:0]IIC_IO_pin

end module

你这段VHDL代码只是实体描述部分,具体设计根本就没有,毕业设计根本糊弄不过去


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12081254.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存