原创 DCM之引狼入室终成狗

2010-9-4 16:18 3293 8 9 分类: FPGA/CPLD

如果以Xilinx器件为载体学习FPGA,那么DCM的学习和使用无疑是一项基本技能。Xilinx大学计划书籍和有些学习板的教程都提供了室外版的DCM例程。该类例程通常是这么几步:


1. 配置好IP核参数


2. 在顶层模块例化IP核,把所有端口引出


3. 在testbench里控制输入端口。


看看testbench。通常是这样——


module tb_mydcm_v;


       reg CLKIN_IN;


       reg RST_IN;


        wire CLKFX_OUT;


       wire CLKIN_IBUFG_OUT;


       wire CLK0_OUT;


       wire LOCKED_OUT;


               dcm_top uut (


              .CLKIN_IN(CLKIN_IN),


              .RST_IN(RST_IN),


              .CLKFX_OUT(CLKFX_OUT),


              .CLKIN_IBUFG_OUT(),


              .CLK0_OUT(),


              .LOCKED_OUT(LOCKED_OUT)


       );


        initial begin


              CLKIN_IN = 0;


              RST_IN = 1;        


              #100;


           RST_IN = 0; 


              end


          always #10 CLKIN_IN = !CLKIN_IN;


  endmodule


要在硬件上实现这样一个工程,必须有一个来自外部的复位控制。有些烦。这个复位能不能移到内部,完全由FPGA内部资源实现呢?谁不想省事呢?!


于是出现了一个这样的版本——


module dcm_top( CLKIN_IN, RST_IN, CLKFX_OUT, CLKIN_IBUFG_OUT, CLK0_OUT, LOCKED_OUT);


input CLKIN_IN;


output RST_IN;
output CLKFX_OUT;
output CLKIN_IBUFG_OUT;
output CLK0_OUT;
output LOCKED_OUT;


 reg RST_IN = 1’b1;


reg [2:0] CNT = 3’b0;


mydcm dcm1(


.CLKIN_IN(CLKIN_IN),
.RST_IN(RST_IN),
.CLKFX_OUT(CLKFX_OUT),
.CLKIN_IBUFG_OUT(CLKIN_IBUFG_OUT),
.CLK0_OUT(CLK0_OUT),
.LOCKED_OUT(LOCKED_OUT)
);


always@(posedge CLKIN_IN)


if(CNT != 3’d5) CNT <= CNT + 3’d1;


else RST_IN <= 1’b0;


endmodule 
为了保证复位条件,先进行初始化,然后计数延时。


综合时,出现这么一条警告——


WARNING:Xst:1305 - Output <RST_IN> is never assigned. Tied to value 1.


在modelsim中观察RST_IN,一直为高阻。这说明初始化没有起到作用,并且基于计数延时的状态转换也失效了。


这下引狼入室了。怎么办?原来——


“reg RST_IN = 1’b1”中暗含一个用于initial的初始化语句。而initial只用于仿真激励,不能综合。这样一来,综合时的警告和modelsim中观察到的现象就很容易理解了。


为此,可将always语句改成——
always@(posedge CLKIN_IN)
                if(CNT != 3'd5)  begin CNT <= CNT + 3'd1; RST_IN <= 1'b1; end
                else                RST_IN <= 1'b0;


这样解决了初始化,并且基于计数延时的状态转换也没有问题。再综合,ISE说时钟连接不正确。原来,用于计数延时的时钟又用于DCM的输入时钟,和ISE的默认规则冲突。解决方法为——


选中synthesize,然后process->properties->Xilinx Specific Options,把add I/O buffer 的勾去掉。


这下仿真。看到预期的波形,那种久违的喜悦真是“又上心头”啊!


引狼入室没啥可怕,驯化成狗不是很好吗?

文章评论1条评论)

登录后参与讨论

用户234619 2010-9-10 16:49

更正: 1.初始化没有起到作用,并且基于计数延时的状态转换也失效的原因是reg [2:0] CNT = 3’b0写成了reg CNT = 3’b0 2.禁止add I/O buffer可以通过综合,但不能翻译(Translate)。解决办法为启动always语句的时钟改为DCM输出的CLKIN_IBUFG_OUT。 如果有误导,说声抱歉!
相关推荐阅读
用户234619 2010-06-26 17:01
天热了
骄阳似火滚神州,羡慕南非值晚秋。家中球迷笑不止,“除非黛玉别春愁”! 三伏天马上就要来了,天气一天比一天热。“南非现在是秋天,挺好。”妻子听了笑个不停:“搞错了。难道你现在刚刚度过春天吗?!” ...
用户234619 2010-06-24 16:14
又是一年
 刘家窑桥风习习,伏日一来了无迹。风花漫卷雪月地,春去春回最真机。 从去年春天开始,每天在刘家窑坐班车去公司。早上空气清新,经常是凉风习习。后来到了夏天,情况开始发生改变。尤其是进入三伏之后,凉爽的感...
用户234619 2010-06-20 13:44
翻译About the SinalTap II Logic Analyser
自定义简称:ST II LAE:SinalTap II Logic Analyzer EditorST II LA:SinalTap II Logic AnalyzerST II:SinalTap I...
用户234619 2010-06-19 10:55
南非世界杯,激情唱响非洲大陆
世界杯来了,家里的球迷毫不客气地占据了电视机前的头把交椅。我和母亲默默地、自觉地落坐在左右两厢。当然,可以随时离开。凌晨的比赛没有几个人撑得住。恰逢端午假期,白天的频道有时就被切换到风云足球。忽然,电...
用户234619 2010-06-16 22:44
同为下降沿,用法却不同
串口接收和ps2接收均用到了下降沿检测,但是用法却不尽相同。哪不同?往下看。图1所示为串口接收的一个数据帧(8位数据,无校验)。当检测到下降沿后,串口接收启动。启动过程为:延时一个波特率周期;依次接收...
我要评论
1
8
关闭 站长推荐上一条 /2 下一条