(
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代码只是实体描述部分,具体设计根本就没有,毕业设计根本糊弄不过去
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)