一、先把程序写上:
模块adv 7391 (
input sys_clk_p,
input sys_clk_n,
//input wire en_clk,//27MHz
//input reset_ok,
输入wire rst _ n,
//输出wire m reset,
输出wire SCL,
output wire SDA,
输出wire led 2
);
/* * * * * * * frequency * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * frequency cy * * * * * * * * * * * * * * * * * * * * *
reg [9:0] cnt_delay1;
reg [2:0]cnt;
reg mreset_r;
reg reset1;
reg [31:0] Mdelay;
wire en_clk;
IBUFDS# (
. diff_term(false ),
. ibuf_low_PWR('ture ' ),
. io标准(default ) ) )。
) IBUFDS_INST (
. o(en_clk )为、
. I(sys_clk_p ),
. IB(sys_clk_n ) )
);
//assign mreset=mreset_r;
always @ (posedge en _ clkornegedgerst _ n ) begin
//Always@(* ) begin//27000/400=67.5300/4=75300/1=300
if () rst_n==0) ) begin
Mdelay=0;
mreset_r=1'b0;
reset1=1'b0;
end else begin
if(mdelay=(32 ) d27_000_000*8) ) begin //延迟? s
Mdelay=Mdelay 1;
mreset_r=1'b0;
if(mdelay==(32 ) D27_000_000*4) ) reset1=0;
else reset1=1'b1;
end else begin
mreset_r=1'b1;
reset1=1'b1;
结束
结束
结束
Always@(posedgeen_clk ) begin//27000/400=67.5300/4=75300/1=300
if(reset1==0) begin
cnt_delay1=10'd0;
结束
//elseif(CNT_Delay=9'd125 ) cnt_delay=9'd0; //SCL=400KHZ; T=10us
ELSEif(CNT_Delay1=10'D299 ) cnt_delay1=10'd0; //SCL=100KHZ; T=
else cnt_delay1=cnt_delay1 1'b1;
结束
Always@(Posedgeen_clk ) begin
//always @ (posedgeclkornegedgerst _ n ) begin
if(reset1==0) cnt=3'd5;
else begin
case(CNT_delay1) ) ) )。
//9'd20: cnt=3'd2; //SCL高电平中间采样点
//9'd40: cnt=3'd0; //SCL下降沿
//9'd80:
cnt <= 3'd3; //SCL低电平中间采样点,用于数据的变化// 9'd0: cnt <= 3'd1; //SCL上升沿
10'd75: cnt <= 3'd1; //SCL高电平中间采样点
10'd150: cnt <= 3'd2; //SCL下降沿
10'd225: cnt <= 3'd3; //SCL低电平中间采样点,用于数据的变化
10'd299: cnt <= 3'd0; //SCL上升沿
default : cnt <= 3'd5;
endcase
end
end
`define SCL_POS (cnt==3'd0)
`define SCL_HIG (cnt==3'd1)
`define SCL_NEG (cnt==3'd2)
`define SCL_LOW (cnt==3'd3)
reg scl_r; //定义SCL的时序脉冲,1为高电平,0为低电平
always @ (posedge en_clk) begin
//always @ (posedge CLK or negedge RST_N) begin
//if (reset1==0) scl_r <= 1'b0;
// else if(cnt == 3'd1) scl_r<= 1'b1; //40个时钟周期
// else if(cnt == 3'd0) scl_r<= 1'b0; //85个时钟周期
if (reset1==0) scl_r <= 1'b1;
else if(cnt == 3'd0) scl_r<= 1'b1; //40个时钟周期
else if(cnt == 3'd2) scl_r<= 1'b0; //85个时钟周期
end
assign SDA = en_clk; //本来后面给它赋值的,删除后面的,暂赋值en_clk
assign SCL = scl_r;
reg led2_t;
assign led2 = led2_t;
reg[31:0] timer_cnt2;
always @ (posedge en_clk) //27000/400=67.5 300/4=75 300/1 = 300
if (reset1==0) begin
// cnt_delay1 <= 10'd0; //这时一个错误,cnt_delay1在两个地方赋值了
end
else begin
if(timer_cnt2 >=(32'd13_500_000)) //模拟1S时间 30MHz=30_000_000Hz
begin
// timer_cntx <= timer_cntx+1;
led2_t<=~led2_t;
timer_cnt2<=32'd0;
end
else
begin
//timer_cntx <= timer_cntx;
led2_t<=led2_t;
timer_cnt2<=timer_cnt2+32'd1;
end
end
ila_0 your_instance_name2 ( //这是后加的
.clk(en_clk), // input wire clk
.probe0(cnt_delay1), // input wire [8:0] probe1
.probe1(cnt), // input wire [2:0] probe0
.probe2(mreset_r), // input wire [8:0] probe1
.probe3(reset1), // input wire [8:0] probe1
.probe4(rst_n) // input wire [8:0] probe1
);
endmodule
二、加ILA
然后打开这个 ila 里面的 template 例化的例子:
直接拷贝下来到 Verilog 源码下面去,并将信号对应上:如一中最后一小段。
本来应该搞定了,可由于 cnt_delay1 <= 10'd0; //这时一个错误,cnt_delay1在两个地方赋值了,这个错误结果在wave里看不到cnt_deay1,相反有10个const0--9个,由于这个原因cnt_delay1总是0,所以我的程序scl和sda不能运行。
然后我把cnt_delay换成cnt_delay1才查到它。这是一个深刻的教训,永远牢记。