关于Verilog写的一段CPLD的程序,诚恳求学
input clk;
output reg b;
reg[2:0] count1;
always@(posedge clk)
begin
if(count1==3)
begin
b<=~b;
count1<=0;
end
else
begin
count1<=count1+1;
end
end
endmodule
我刚开始学习CPLD,这是在我脱离书本写第一个程序时遇到的困难
目的是产生一个4分频的波形 输入为clk 输出为b
这个程序仿真之后clk的波形是正确的,但是b没有波形,是一根红线
我当时怀疑是b需要赋值之后才可以产生波形,但是怎么都想不到要如何初始化这个b
我朋友是说使用时 b会有一个确定的值,这一点我并不确定
在书上也没有看到有关的说明
我尝试在else中加入了一个 b<=0 的语句,于是波形在第二次上升沿的时候产生了波形
然后我将if当中的b<=~b 移到else中,波形没有产生
我以此推断,b要在程序中赋值一个确定的值,才会产生波形
另外,当我在else中加入b<=0 时
按理说也应该产生一个高电平占空比为1/4的波形,为何我看到的仿真波形一直是低电平
诚恳求指导,有什么说什么
自己顶一下~求助啊~
加个reset部分
我看的verilog的书好像没有提到reset的内容求指点方向
这个程序貌似不是4分频吧。
always @(posedge CLK or negedge RSTn)
if(!RSTn)
begin
b<=0;
count1<=0;
end
如果板级调试的话可以不用RESET。仿真的话,如果不加就会只有一条红线。
请问你这个程序当中的信号negedge RSTn 是在仿真的时候自动产生并且触发的嘛?
如果不是,那么这个信号的下降沿,依然不可能出现在时间轴的最开始
这个情况怎么办呢?
最好还是用下reset复位吧,
如果不想用的话,可以加条initial b = 0; 这样初始化为0, MS这样综合后也是可以为0的(VHDL有这样的初始赋值语句,对于verilog initial语句能否综合有点疑问,)
是不是在板子上测试的时候,b作为一个输出,如果不做任何操作,一定是一个定值呢?
另外在测试当中这个复位要怎么做?
我大概理解你的意思,但是我找了资料没有找到,希望能得到你的帮助
我学这个的过程中没有看到过相关的说明,所以很迷茫,连找资料都不知道怎么找了。迷茫啊
继续求助。
RSTn由外部送入,系统内部的寄存器一开始都要用RSTn置初值,
modelsim仿真时会是红线(由于你内部寄存器没有赋初值),实际板子上会是你设计的波形。
加一段代码,进行初始化:
initial begin
b = 0;
count1 = 0;
end
建议你加一个RST复位信号,这样你的系统才会稳定工作,要不就会出现很多未知情况
复位 ,复位呢?
加上RESET
1、要用到RESET,保证工作时电路处于一个已知的状态,复位用异步或者同步都行。
2、计数器你用加法来做,4分频可以直接把COUNTER【1:0】中的COUNTER[1]引出就行。逻辑相对简单些。
3、测试或者仿真时,先让RESET有效一段时间。
