|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
毕业设计要做一个I2C的时序仿真,用verilog语言编写的。因为我自己没这个基础做不来,求大神帮忙。这个是SCCB底层驱动程序:module I2C_Controller (
CLOCK,
I2C_SCLK,//I2C CLOCK
I2C_SDAT,//I2C DATA
I2C_DATA,//DATA:[SLAVE_ADDR,SUB_ADDR,DATA]
GO, //GO transfor
END, //END transfor
W_R, //W_R
ACK, //ACK
RESET,
//TEST
SD_COUNTER,
count,
SDO
);
output [7:0] count;
input CLOCK;
input [23:0]I2C_DATA;
input GO;
input RESET;
input W_R;
inout I2C_SDAT;
output I2C_SCLK;
output END;
output ACK;
//TEST
output [5:0] SD_COUNTER;
output SDO;
reg [7:0] count;
parameter tpd_RESET_to_count = 3;
parameter tpd_CLOCK_to_count = 2;
function [7:0] increment;
input [7:0] val;
reg [3:0] i;
reg carry;
begin
increment = val;
carry = 1'b1;
/*
Exit this loop when carry == zero, OR all bits processed
*/
for (i = 4'b0; ((carry == 4'b1) && (i <= 7)); i = i+ 4'b1)
begin
increment = val ^ carry;
carry = val & carry;
end
end
endfunction
/*
always @ (posedge CLOCK or posedge RESET)
if (RESET)
count = #tpd_RESET_to_count 8'h00;
else
count <= #tpd_CLOCK_to_count increment(count);
*/
always @ (posedge CLOCK or posedge RESET)
if (RESET)
count = 8'h00;
else
count <= count + 8'h01;
reg SDO;
reg SCLK;
reg END;
reg [23:0]SD;
reg [5:0]SD_COUNTER;
wire I2C_SCLK=SCLK | ( ((SD_COUNTER >= 4) & (SD_COUNTER <=30))? ~CLOCK :0 );
wire I2C_SDAT=SDO?1'bz:0 ;
reg ACK1,ACK2,ACK3;
wire ACK=ACK1 | ACK2 |ACK3;
//--I2C COUNTER
always @(negedge RESET or posedge CLOCK ) begin
if (!RESET) SD_COUNTER=6'b111111;
else begin
if (GO==0)
SD_COUNTER=0;
else
if (SD_COUNTER < 6'b111111) SD_COUNTER=SD_COUNTER+1;
end
end
//----
always @(negedge RESET or posedge CLOCK ) begin
if (!RESET) begin SCLK=1;SDO=1; ACK1=0;ACK2=0;ACK3=0; END=1; end
else
case (SD_COUNTER)
6'd0 : begin ACK1=0 ;ACK2=0 ;ACK3=0 ; END=0; SDO=1; SCLK=1;end
//start
6'd1 : begin SD=I2C_DATA;SDO=0;end
6'd2 : SCLK=0;
//SLAVE ADDR
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;//ACK
//SUB ADDR
6'd12 : begin SDO=SD[15]; ACK1=I2C_SDAT; end
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;//ACK
//DATA
6'd21 : begin SDO=SD[7]; ACK2=I2C_SDAT; end
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;//ACK
//stop
6'd30 : begin SDO=1'b0;
SCLK=1'b0; ACK3=I2C_SDAT; end
6'd31 : SCLK=1'b1;
6'd32 : begin SDO=1'b1; END=1; end
endcase
end
endmodule
这个是已经编写的部分激励程序
`timescale 1 ps/ 1 ps
module I2C_Controller_vlg_tst();
// constants
// general purpose registers
reg eachvec;
// test vector input registers
reg CLOCK;
reg GO;
reg [23:0] I2C_DATA;
reg treg_I2C_SDAT;
reg RESET;
reg W_R;
// wires
wire ACK;
wire END;
wire I2C_SCLK;
wire I2C_SDAT;
wire SDO;
wire [5:0] SD_COUNTER;
wire [7:0] count;
// assign statements (if any)
assign I2C_SDAT = treg_I2C_SDAT;
I2C_Controller i1 (
// port map - connection between master ports and signals/registers
.ACK(ACK),
.CLOCK(CLOCK),
.\END (END),
.GO(GO),
.I2C_DATA(I2C_DATA),
.I2C_SCLK(I2C_SCLK),
.I2C_SDAT(I2C_SDAT),
.RESET(RESET),
.SDO(SDO),
.SD_COUNTER(SD_COUNTER),
.W_R(W_R),
.count(count)
);
initial
begin
CLOCK = 0;
forever #50 CLOCK = ~CLOCK;
end
initial
begin
RESET=0;
#50 RESET=1;
#40 RESET = 0;
#40 RESET = 1;
GO=1;
#500 GO=0;
#400 GO = 1;
end
initial
$monitor($stime,, RESET,, CLOCK,,, count,, SD_COUNTER);
endmodule 求助:要在源程序或者激励文件中怎样修改,才能使所有端口的波形都能正确仿真,尤其是I2C_DATA 跟I2C_SDAT。。 |
|