5分频代码的遇到的问题
时间:10-02
整理:3721RD
点击:
关于我写的5分频代码的疑惑
module div5_freq(clk_in, rst_n,clk_out);
input clk_in;
input rst_n;
output clk_out;
reg clkp;
reg clkn;
reg[2:0] countp;
reg[2:0] countn;
parameter div1 = 2 , div2 = 4; // div1=5 / 2, div2 = 5 - 1
assign clk_out = clkp | clkn;
always@(posedge[/email] clk_in or negedge rst_n)
begin
if(!rst_n)
clkp <= 0;
else if(countp == div1)
clkp <= ~clkp;
else if(countp == div2)
clkp <= ~clkp;
else
clkp <= clkp;
end
always@(negedge[/email] clk_in or negedge rst_n)
if(!rst_n)
clkn <= 0;
else if(countn == div1)
clkn<=~clkn;
else if(countn == div2)
clkn <=~ clkn;
else
clkn <= clkn;
always@(posedge[/email] clk_in or negedge rst_n)
if(!rst_n)
countp <= 0;
else if(countp == div2)
countp <= 0;
else
countp <= countp + 1;
always@(negedge[/email] clk_in or negedge rst_n)
if(!rst_n)
countn <= 0;
else if(countn == div2)
countn <= 0;
else
countn <= countn + 1;
endmodule
我发现这里输出变量clk_out没有定义类型,且我尝试着给输出定义为reg型。run之后结果发现仿真没完没了的进行,且仿真窗口也没有波形产生!
请问这是问什么?
module div5_freq(clk_in, rst_n,clk_out);
input clk_in;
input rst_n;
output clk_out;
reg clkp;
reg clkn;
reg[2:0] countp;
reg[2:0] countn;
parameter div1 = 2 , div2 = 4; // div1=5 / 2, div2 = 5 - 1
assign clk_out = clkp | clkn;
always@(posedge[/email] clk_in or negedge rst_n)
begin
if(!rst_n)
clkp <= 0;
else if(countp == div1)
clkp <= ~clkp;
else if(countp == div2)
clkp <= ~clkp;
else
clkp <= clkp;
end
always@(negedge[/email] clk_in or negedge rst_n)
if(!rst_n)
clkn <= 0;
else if(countn == div1)
clkn<=~clkn;
else if(countn == div2)
clkn <=~ clkn;
else
clkn <= clkn;
always@(posedge[/email] clk_in or negedge rst_n)
if(!rst_n)
countp <= 0;
else if(countp == div2)
countp <= 0;
else
countp <= countp + 1;
always@(negedge[/email] clk_in or negedge rst_n)
if(!rst_n)
countn <= 0;
else if(countn == div2)
countn <= 0;
else
countn <= countn + 1;
endmodule
我发现这里输出变量clk_out没有定义类型,且我尝试着给输出定义为reg型。run之后结果发现仿真没完没了的进行,且仿真窗口也没有波形产生!
请问这是问什么?
第一,clk_out定义成output,默认就是wire类型
你定义成reg还能用assign?工具没报错就是我脑子短路了
仿真进行不下去的原因是,你有一个组合逻辑的环路存在,因为没有加入延迟信息,因此某一点或者几点的值一直在变化中,所以仿真始终处于这个时间点上进行不下去。代码都是时序逻辑,不会有这个问题,你查查你的TB
关于楼上回答,我也尝试过output定义成reg,但是我用的always clk_out = clkp | clkn;也是运行不下去!
应该tb没问题的。因为我不定义输出类型时,运行很好!
always clk_out = clkp | clkn...
....这句话...麻烦要么你always后面加个#1,或者写成时序逻辑
不然就是每0个时间后做clk_out的赋值..不死才怪了...- -+
定义成wire应该不会有问题了。
默认就是wire, 不用加的,
看看你的testbench吧。
典型的新人,哈哈~
