微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 分频电路在做综合时的问题(没产生分频时钟)

分频电路在做综合时的问题(没产生分频时钟)

时间:10-02 整理:3721RD 点击:
我的分频电路是用计数器写的,最后综合出来是个加法器,但是没有时钟输出。
综合时的约束我是一开始我是这样写的:
create_clock [get_ports g_clk]  -name g_clk  -period 10 -waveform {0 5}
create_generated_clock -name g_clk -source [get_ports g_clk] -divide_by 10 [get_ports l_clk]
然后综合时报错,说 Can't find clock 'l_clk' in design 'clock_gen'.
之后网上看到说红体标出的部分要写成综合后的pin脚,于是改成:
create_generated_clock -name g_clk -source [get_pins U16/Z] -divide_by 10 [get_ports l_clk]
还是报错说:Can't find object 'U16/Z' in design 'clock_gen'.
所以求教大神们,该怎么写约束能正确地综合。
附上verilog代码:
`timescale 1ns/10ps
module clock_gen(rst, l_clk, g_clk);
  input rst, g_clk;                          
  output l_clk;                              
  reg l_clk;
  reg[7:0] j;
  
//counter
  always @(posedge g_clk or negedge rst)
    if(!rst)
       j <= 0;
    else if(j == 9)
      j <= 0;
    else
      j <= j + 1;
         
//clock generation
  always @(posedge g_clk or negedge rst)
    if(!rst)
      l_clk <= 0;
    else if(j == 9)
      l_clk <= ~l_clk;
                     
endmodule

2个红色的反一下试试.

create_generated_clock -name g_clk -source [get_ports g_clk] -divide_by 10 [get_pins l_clk]


刚刚试了,还是一样的Can't find object 'l_clk' in design 'clock_gen_000000'.

感觉你代码写的很奇怪
第一个always里j的输出是0~8,到不了9(综合为与1的循环加法器)
然后j的输出与9做比较,相等输出1,不相等输出0(综合为与4`b9的比较器)
何不直接一个always
if(j==9)
begin
  j<=0;
l_clk<=0;
end

你这时钟约束有问题啊 首先你在顶层port上定义了一个时钟,然后你后面的又在该port 定义了一个派生时钟,这样相冲突的。后面修改的红色约束也有问题的。source 的时钟该是你的主时钟。
create_generated_clock  [get_pins U16/Z]  -name g_clk -source { l_clk} -divide_by 10 这样修改才是对的,看你对时钟约束理解很矛盾啊


啊,抱歉,发现贴上来时弄错了,我原文件中是这样的:
create_clock [get_ports g_clk]  -name g_clk  -period 10 -waveform {0 5}
create_generated_clock  [get_ports l_clk] -name l_clk -source [get_ports g_clk] -divide_by 10
然后报错就是上文提到的错误。



我一开始是写在一个always块中的,但是老师说最好写到两个块中,于是我就分开写了。
改回到一个always块中以后,果然不再报错了,但是只综合出了加法器,还是没有时钟信号的产生,这个是什么原因呢?



  但是timing report的路径里面又有了l_clk:
  
  Startpoint: U16/Z (internal pin)
  Endpoint: l_clk (output port)
  可是在综合出来的电路图中没有找到U16。

按你原文的约束 ,可以理解成输入一个时钟,输出一个为输入时钟的10分频的时钟, 你在综合的约束里面可以这样写, create_generated_clock  [get_pins A/B/Q] -name l_clk -source { g_clk} -divide_by 10, 意思是在A模块下面B register的Q端创建一个派生时钟。 你就不用去管哪个instance 单元了。


我按您说的改了create_generated_clock  [get_pins A/B/Q] -name l_clk -source { g_clk} -divide_by 10,
但还是报错Can't find object 'A/B/Q' in design 'clock_gen'.
请问您说的A、B、Q是可以随便这么写还是说让我用自己设计中的模块名称代替?但是我好像没有模块名,综合出来也没有寄存器。

我的意思是一个例子,具体的名字还是要和模块名一致,如果你只有一个模块的话就直接写
create_generated_clock  [get_pins 模块名/时钟寄存器/Q] -name l_clk -source { g_clk} -divide_by 10,
如果只有顶层模块。 模块名就不用写了。 你会申明一个寄存器,当然我不知道你会怎么申明哈。我给你一个列子 你看看也许明白了
module div(
               clk,
               rst_n,
               clk_div
);
input clk, rst_n;
output clk_div;
reg clk_div;
always @(posedge clk or negedge rst_n)
           begin
              if(!rst_n)
                  clk_div <= 1'b0;
              else
                  clk_div <= ~ clk_div;
          end
endmodule
时钟约束:
create_clock  [get_ports clk] -name clk -period 10 -waveform {0 5}
create_generated_clock  [get_pins clk_div_reg/Q] -name clk_div -source { clk} -divide_by 10
不知道 这样你能看明白不

最好能把第二个always中的if。else if。else补全,代码风格会导致很多问题



懂了。啊啊啊,我觉得我好笨呐。含泪拜谢
对了,大神能介绍一些综合方面的好的书籍么。我也是刚刚开始做综合,好多基本的都不懂。



  恩恩,加上了~

可以看得出你使用触发器生成一个10分频的时钟
你可以这样定义该生成时钟:
create_generated_clock  -name l_clk -source g_clk -divide_by 10 [get_pins I_clk_reg/Q]

LZ能否把最后正确的脚本和verilog代码贴出来,让大家学习下。
看了上面一些大侠的评论,大概了解了到,就是在create_generated_clock的时候,要get寄存器的Q端,
但为什么不能get最后的output呢?难道中间又插入了啥啥逻辑。
请大牛指点。

如果再加一个clk_div_2,即always @(posedge clk_div or negedge rst_n)
           begin
              if(!rst_n)
                  clk_div_2 <= 1'b0;
              else
                  clk_div_2 <= ~ clk_div_2;
          end
那么create_generated_clock  [get_pins clk_div_2_reg/Q] -name clk_div_2 -source { clk_div} -divide_by 2  这样写对吗?

create_generated_clock  [get_pins clk_div_2_reg/Q] -name clk_div_2 -source { clk} -divide_by 4  那这个对不对?

:)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top