[求助]请帮我看看verilog的程序,万分感谢!
- UID
- 146921
- 性别
- 男
|
[求助]请帮我看看verilog的程序,万分感谢!
module cpld_code(encode_a,encode_b,pulse); input [0:0] encode_a; input [0:0] encode_b; output [15:0] pulse; reg [15:0] pulse_counta;
reg outabc; always begin outabc=((!encode_a)&encode_b)|((!encode_b)&encode_a);//两个信号的异或 end always @ ( outabc)//问题就出在这儿,我想在outabc的上升和下降沿计数,结果不对
如果我把这儿改为posedge或negedge就对了,为什么啊? begin
pulse_counta=pulse_counta+1; end assign pulse=pulse_counta;
endmodule
请问为什么always @ ( outabc)得不到我想要的结果啊 |
|
|
|
|
|
- UID
- 146921
- 性别
- 男
|
|
|
|
|
|
- UID
- 132277
- 性别
- 男
|
╔☆→────────────────←☆╗
┊寻觅在电子中, , , 寻求适合自己的一席┊┊┊┊
┊也许生活本忙碌, 想享受安逸只能是心态了吧┊
╚☆→────────────────←☆╝ & |
|
|
|
|
|
- UID
- 146921
- 性别
- 男
|
|
|
|
|
|
- UID
- 132834
- 性别
- 男
|
你在设计前应该想清楚,你要用的是计数器,计数器是由触发器组成的,触发器是边缘跳变敏感的,不是电平敏感的,电平敏感的是锁存器,所以用always描述一个计数器的行为当然要用posedge和negedge。
Verilog是硬件描述语言,不是硬件设计语言,你只能用它来描述合理电路的行为,不能用它来创造“未知”的电路,想当然的认为用电平敏感量来说明正负边缘虽然在逻辑上没错,但是在电路上是不能实现的。
另外,双边缘触发的计数器好像只有CoolRunner系列的CPLD支持吧。 |
|
|
|
|
|
- UID
- 146921
- 性别
- 男
|
谢谢楼上的指教,我现在想设计双边缘触发的计数器,所以我想把下降沿也变成上升沿,这样我就只需对上升沿计数了.
我转换的方法是这么想的,将这个波形稍延迟一下,和原来的波形有个错位,这样再将两个异或,就可以得到两个上升沿了,也就是将原来的波形二分频了,我觉得这个方法想起来没错,但是实现延迟,我不知道该怎么办,我记得以前模拟电路用电阻和电容就可以了,具体的请看我发的另一个求助贴子:verilog 延迟问题,多谢了 |
|
|
|
|
|
- UID
- 132834
- 性别
- 男
|
这个2倍频的思路是对的,是数字倍频电路最常用的方法,但是实现固定时间的延时是非常困难的,一般的实现方法是利用FPGA/CPLD的门级延迟(几个ns)也就是把输入时钟加几个buf,再和原时钟做异或。这样做的缺点有3个:
1。综合工具会认为你加的延时单元是冗余逻辑会自动去掉,所以要加入综合保留标志或者手动加。
2。延时只能是门级延时的整数倍,往往不能保证50%的占空比,而且对于频率较低的情况下要加的延时单元太多。
3。延时受不同温度、不同芯片(既便是同型号也会存在个体差异)、不同工作电压等具体情况的影响较大,一般要反复调试才行。
如果用FPGA的话,不妨用PLL倍频,否则,考虑一下改改设计,别用倍频。 |
|
|
|
|
|
- UID
- 146921
- 性别
- 男
|
非常感谢!我用的是cpld,我理解您的意思,如果对延时的精度要求不那么高,就可以用这个方法做啊
一般的实现方法是利用FPGA/CPLD的门级延迟(几个ns)也就是把输入时钟加几个buf,您能不能再说的具体点,就这句话我也不知道怎么实现 |
|
|
|
|
|
- UID
- 146921
- 性别
- 男
|
我想过对上升沿和下降沿分别计数,然后再把两个相加,就得到我要的计数了,这个方法最简单,但是我选的芯片资源太少了,实现不了,我又不想重新制版,所以想用这个二倍频的方法 |
|
|
|
|
|
- UID
- 132834
- 性别
- 男
|
请参考Software Manuals-Libraries Guide-BUF、BUFG(全局)可同时参考IBUF IBUFG。 |
|
|
|
|
|
- UID
- 146921
- 性别
- 男
|
|
|
|
|
|
- UID
- 132834
- 性别
- 男
|
楼上的同学,您说的方法当然没问题。
可是,倍频的目的就是用比较低的输入频率获得2倍于它的输出频率。
如果要通过计数倍频,那么这个计数器的工作时钟频率肯定要高于生成的倍频频率了。
既然有这么高的时钟,分频不是更合适吗?何必要倍频呢? |
|
|
|
|
|
- UID
- 132277
- 性别
- 男
|
我想定义一个寄存器, 直接将时钟的输入+1计数, 到你所需要的时间将另一个寄存器(如fclk)取反, 然后你以后所有的时钟都用fclk, 实现的是分频 就是不清楚这个寄存器与全局时钟的关系
恩,,,说错了,应该是分频
[此贴子已经被作者于2006-8-30 16:35:06编辑过] |
╔☆→────────────────←☆╗
┊寻觅在电子中, , , 寻求适合自己的一席┊┊┊┊
┊也许生活本忙碌, 想享受安逸只能是心态了吧┊
╚☆→────────────────←☆╝ & |
|
|
|
|
|
- UID
- 146707
- 性别
- 男
|
always @(posedge outabc or posedge outabc)
你的那个always @(outabc)只代表outabc有变化,如果没有变化,一直是高电平,那就不会计数! |
|
|
|
|
|
- UID
- 132434
- 性别
- 男
|
除了特定提供双沿用法的器件(bemoon提到的),一般来说不提倡同时使用上升沿和下降沿,这样的做法相当于芯片的工作频率提高了一倍 |
|
|
|
|
|