首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]请帮我看看verilog的程序,万分感谢!

[求助]请帮我看看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)得不到我想要的结果啊

这个问题怎么没人帮我啊,急啊
你是想上升和下降沿都计数
还是上升或者下降沿计数

╔☆→────────────────←☆╗
┊寻觅在电子中, , , 寻求适合自己的一席┊┊┊┊
┊也许生活本忙碌,  想享受安逸只能是心态了吧┊
╚☆→────────────────←☆╝      &
我想都计数
你在设计前应该想清楚,你要用的是计数器,计数器是由触发器组成的,触发器是边缘跳变敏感的,不是电平敏感的,电平敏感的是锁存器,所以用always描述一个计数器的行为当然要用posedge和negedge。
Verilog是硬件描述语言,不是硬件设计语言,你只能用它来描述合理电路的行为,不能用它来创造“未知”的电路,想当然的认为用电平敏感量来说明正负边缘虽然在逻辑上没错,但是在电路上是不能实现的。
另外,双边缘触发的计数器好像只有CoolRunner系列的CPLD支持吧。
谢谢楼上的指教,我现在想设计双边缘触发的计数器,所以我想把下降沿也变成上升沿,这样我就只需对上升沿计数了.
我转换的方法是这么想的,将这个波形稍延迟一下,和原来的波形有个错位,这样再将两个异或,就可以得到两个上升沿了,也就是将原来的波形二分频了,我觉得这个方法想起来没错,但是实现延迟,我不知道该怎么办,我记得以前模拟电路用电阻和电容就可以了,具体的请看我发的另一个求助贴子:verilog 延迟问题,多谢了
这个2倍频的思路是对的,是数字倍频电路最常用的方法,但是实现固定时间的延时是非常困难的,一般的实现方法是利用FPGA/CPLD的门级延迟(几个ns)也就是把输入时钟加几个buf,再和原时钟做异或。这样做的缺点有3个:
1。综合工具会认为你加的延时单元是冗余逻辑会自动去掉,所以要加入综合保留标志或者手动加。
2。延时只能是门级延时的整数倍,往往不能保证50%的占空比,而且对于频率较低的情况下要加的延时单元太多。
3。延时受不同温度、不同芯片(既便是同型号也会存在个体差异)、不同工作电压等具体情况的影响较大,一般要反复调试才行。

如果用FPGA的话,不妨用PLL倍频,否则,考虑一下改改设计,别用倍频。
非常感谢!我用的是cpld,我理解您的意思,如果对延时的精度要求不那么高,就可以用这个方法做啊
一般的实现方法是利用FPGA/CPLD的门级延迟(几个ns)也就是把输入时钟加几个buf,您能不能再说的具体点,就这句话我也不知道怎么实现
我想过对上升沿和下降沿分别计数,然后再把两个相加,就得到我要的计数了,这个方法最简单,但是我选的芯片资源太少了,实现不了,我又不想重新制版,所以想用这个二倍频的方法
请参考Software Manuals-Libraries Guide-BUF、BUFG(全局)可同时参考IBUF IBUFG。
谢谢
楼上的同学,您说的方法当然没问题。
可是,倍频的目的就是用比较低的输入频率获得2倍于它的输出频率。
如果要通过计数倍频,那么这个计数器的工作时钟频率肯定要高于生成的倍频频率了。
既然有这么高的时钟,分频不是更合适吗?何必要倍频呢?

我想定义一个寄存器,
直接将时钟的输入+1计数,
到你所需要的时间将另一个寄存器(如fclk)取反,
然后你以后所有的时钟都用fclk,
实现的是分频
就是不清楚这个寄存器与全局时钟的关系

恩,,,说错了,应该是分频

[此贴子已经被作者于2006-8-30 16:35:06编辑过]

╔☆→────────────────←☆╗
┊寻觅在电子中, , , 寻求适合自己的一席┊┊┊┊
┊也许生活本忙碌,  想享受安逸只能是心态了吧┊
╚☆→────────────────←☆╝      &
always @(posedge outabc or posedge outabc)

你的那个always @(outabc)只代表outabc有变化,如果没有变化,一直是高电平,那就不会计数!
david
除了特定提供双沿用法的器件(bemoon提到的),一般来说不提倡同时使用上升沿和下降沿,这样的做法相当于芯片的工作频率提高了一倍
美梦成真-->噩梦降临!
返回列表