Verilog仿真结果与实际需求不一致,小白求教

wang_bst 2018-08-17 02:45:44
需求描述:XB_HIGH_IN输入下降沿时,H_Trig_OUT立即输出一个负脉冲
仿真结果:XB_HIGH_IN输入下降沿时,H_Trig_OUT输出的波形有4个clk的延时
程序代码:
module TESTCODE(  

input XB_HIGH_IN,

input clk,

input rst,

output reg H_Trig_OUT

);



parameter T100us = 12'd3;

reg H_fir,H_sec;

reg H_change_trig;

reg H_vld;

reg [11:0]H_count;



always@(posedge clk or negedge rst)

if(!rst)

begin

H_fir<=1'b1;

H_sec<=1'b1;

H_change_trig<=1'b0;

end

else

begin

H_fir<=XB_HIGH_IN;

H_sec<=H_fir;

H_change_trig<=~H_fir&H_sec;//下降沿

End

//输出负脉冲

always @(posedge clk or negedge rst)

if(!rst)

begin

H_count<=12'd0;

H_vld<=1'b0;

H_Trig_OUT<=1'b1;

end



else

begin

if(H_change_trig==1'b1)H_vld<=1'b1;

if(H_vld==1'b1)

begin

H_count<=H_count+1'b1;

H_Trig_OUT<=1'b0;

if(H_count==T100us)

begin

H_count<=12'd0;

H_vld<=1'b0;

H_Trig_OUT<=1'b1;

end

end

end



endmodule


仿真代码:
module test;  



// Inputs

reg XB_HIGH_IN;

reg clk;

reg rst;



// Outputs

wire H_Trig_OUT;



// Instantiate the Unit Under Test (UUT)

TESTCODE uut (

.XB_HIGH_IN(XB_HIGH_IN),

.clk(clk),

.rst(rst),

.H_Trig_OUT(H_Trig_OUT)

);

parameter period =250;///////40MHZ

initial begin

// Initialize Inputs

XB_HIGH_IN = 1;

clk = 0;

rst = 0;



// Wait 100 ns for global reset to finish

#100;

rst = 1;

// Add stimulus here

forever begin

#(period/2);

clk=~clk;

end

end

initial begin

forever begin

#(period*20);

XB_HIGH_IN<=1'b1;

#(period*20);

XB_HIGH_IN<=1'b0;

end

end

endmodule


仿真波形
...全文
494 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang_bst 2018-08-20
  • 打赏
  • 举报
回复
嗯,这个我已经通过仿真每个变量的波形明白怎么回事了,还是很感谢你
neoitachi 2018-08-20
  • 打赏
  • 举报
回复
H_fir<=XB_HIGH_IN;
H_sec<=H_fir;
H_change_trig<=~H_fir&H_sec;//下降沿
这里的每句话都会产生一个时钟周期的延时,因为每一句话都产生了一个寄存器。
if(H_change_trig==1'b1)H_vld<=1'b1; //在这又产生了一个寄存器,一个时钟周期的延时
if(H_vld==1'b1) //所以在生成了几个寄存器之后,在这又引入了一个时钟周期的延时
begin
H_count<=H_count+1'b1;
H_Trig_OUT<=1'b0;

想实现上述功能,就必须用下面的方法实现:
always(negedge XB_HIGH_IN or negedge rst)
if(!rst)
H_Trig_OUT <= 1'b1;
else if(pull_done_en)
H_Trig_OUT <= 1'b0;
else if(pull_up_en)
H_Trig_OUT <= 1'b1;
这里,pull_done_en,pull_up_en可以用主时钟产生,但这里会是一个异步动作,需要处理好XB_HIGH_IN与主时钟的关系。

6,125

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧