打印
[matlab]

FPGA构建数字锁相环

[复制链接]
4079|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kangwuwei|  楼主 | 2010-12-2 15:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
SuperX-man| | 2010-12-2 21:26 | 只看该作者
你要实现的具体功能能描述一下么?
DCM的话确实可以生成很多的时钟频率,如果是想可调节的话,需要你自己写代码.
IP核中DSP下的DDS模块也不错.

使用特权

评论回复
板凳
kangwuwei|  楼主 | 2010-12-3 17:42 | 只看该作者
我想把输入的50MHz的时钟频率 变成100MHz 或者更高

使用特权

评论回复
地板
SuperX-man| | 2010-12-3 23:38 | 只看该作者
用DCM就完全可以实现了.

举个例子来说,你在ISE下选择好芯片型号后,选择New source,然后选择IP核,找到Single DCM,然后在DCM的模块中,选中CLKFX引脚,然后NEXT,再NEXT,在USE OUTPUT FREQUENCY这里输入你需要产生的频率,然后点下面的CALCULATE,就自动用FPGA的乘法器和加法器生成你需要的频率了,在下面Generated Output里列出的就是为了产生这个频率所消耗的资源.

这在ISE的设计中非常有用,可以随意设计你自己需要的时钟频率,只要资源够用.

使用特权

评论回复
5
kangwuwei|  楼主 | 2010-12-8 11:50 | 只看该作者
4# SuperX-man
按照你说的方法,我生成了一个由50MHz变成100MHz的PLL,让后用一个模块去调用它,但在出现个错误:Port <CLK_50M> has illegal connections. This port is connected to an input buffer and other components.
在网上找了下原因,说是去掉ADD I/O buffer的对号,去掉后,有出现:NgdBuild:924 - input pad net 'CLK_50M' is driving non-buffer primitives:
这前后2个错误自相矛盾啊,该怎么解决呢? 补充一下,我那个自己写的代码:
module top(RESET,CLK_50M,CLK_OUT
    );
input RESET;
input CLK_50M;
output CLK_OUT;
wire PLL_RST;
wire CLK_50M;
reg RST1,RST2;
reg CLK1;
always @(posedge CLK_50M, negedge RESET)
if(!RESET)
begin
RST1 <= 1;
end
else
begin
RST1 <= 0;
end
always @(posedge CLK_50M,negedge RESET)
if(!RESET) RST2 <= 1;
else RST2 <= RST1;
assign PLL_RST = RST2;
test u0 (.CLKIN_IN(CLK_50M),
            .RST_IN(PLL_RST),
            .CLKFX_OUT(CLK_OUT),
            .CLKIN_IBUFG_OUT()
            );

endmodule

使用特权

评论回复
6
kangwuwei|  楼主 | 2010-12-8 15:01 | 只看该作者
在补充下问题,刚刚看到了赛灵思官网上的一个解决方法,第一步和我解决第一个错误的方法一样,第二部是For Synplify Pro, go to Implementation Options -> Device tab -> check "Disable I/O Insertion"
但我怎么找不到Implementation Options  这个选项?

使用特权

评论回复
7
SuperX-man| | 2010-12-8 22:36 | 只看该作者
你两个ALWAYS的条件是一样的,能放在一起再试试看么.

使用特权

评论回复
8
kangwuwei|  楼主 | 2010-12-9 09:10 | 只看该作者
我把第二个always去掉了,还是那个错误

使用特权

评论回复
9
dan_xb| | 2010-12-10 10:26 | 只看该作者
你这个代码需要好好分析一下,有很多错误啊。
1.
首先:always @(posedge CLK_50M, negedge RESET)
正确的写法是: always @(posedge CLK_50M or negedge RESET)
再说,正常情况下,好的代码风格,不要写这种异步复位,直接写成:always @(posedge CLK_50M)
异步复位出的问题太多了。
我想使用异步复位是因为教科书上面都是这样教的吧,我们的教科书。。。算了


2.
你干嘛要把Reset打两拍给逻辑?
你要是怕Reset的抖动,两拍也不够啊
你的这个Reset,直接给DCM吧,不要再在中间搞什么了


3.
对于你的这种情况,其实可以直接使用CLK2X_OUT,另外把LOCKED信号引出来,这个信号为高的时候才表示DCM已经锁定

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
SuperX-man + 2
10
SuperX-man| | 2010-12-11 11:41 | 只看该作者
楼上分析的非常透彻

使用特权

评论回复
11
钻研的鱼| | 2010-12-15 10:59 | 只看该作者
异步复位和同步复位各有优缺点,不能一概而论。

使用特权

评论回复
12
hongbinkdg| | 2010-12-15 12:31 | 只看该作者
我之前也写过一个,不过用的是VHDL格式,好像没有那么复杂,加了DCM后,再增加一些控制描述就实现了

使用特权

评论回复
13
dan_xb| | 2010-12-16 10:42 | 只看该作者
11# 钻研的鱼   其实异步复位和同步复位不是各有优缺点,而是都不太好,特别是异步复位
  对于异步复位来讲,你不知道复位结束的时间和Clock的关系,FPGA里面clock分布是有Skew的,会造成一部分进入工作而另一部分还在复位,或者不满足Setup-time的情况。
  同步复位,情况要轻微一些,可能造成复位结束的时候不满足建立时间,不过这个好解决,你把Reset信号再打两拍就可以了
  最好是写一个异步复位-同步释放的复位方式,有相应的代码,但是这个一个是麻烦,一个是有可能造成综合工具的误解
  我知道A公司鼓励用户使用异步复位,这个是有一些历史故事的,你就不要管了。他们的芯片里面的FF不能做同步复位,X的FF两种复位都可以。他们最大的用户华为和中兴都不用异步复位,你干嘛要去用?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

190

帖子

0

粉丝