在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5345|回复: 12

[求助] 计数器的代码不能被综合

[复制链接]
发表于 2011-7-18 11:14:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 shadow_cuk 于 2011-7-18 11:44 编辑

用verilog写了个计数器的代码,异步复位,clk的高电平期间对fin计数,clk的下降沿输出计数值,modelsim里面做功能仿真没啥问题,但是DC综合的话就不行,报cout[6:0]和counter_buf[6:0]被多个源驱动,但是我查不出错误在哪儿,请教各位帮忙看看



  1. //Verilog HDL for "pll_system_sim", "COUNTER_AFC" "verilog"

  2. module COUNTER_AFC(clk,fin,reset,cout);
  3.   input clk,fin,reset;
  4.   output [6:0]cout;
  5.   reg [6:0]cout;
  6.   reg [6:0]counter_buf;
  7.   
  8.   always @(posedge reset or posedge fin)
  9.     if (reset)
  10.       begin                                    
  11.         counter_buf[6:0] <= 7'b0000000;
  12.         cout[6:0] <= 7'b1111111;
  13.       end
  14.     else if (clk)   
  15.       counter_buf[6:0] <= counter_buf[6:0] + 1;
  16.   always @(negedge clk)
  17.     if (!reset)
  18.             begin
  19.               cout[6:0] <= counter_buf[6:0];
  20.         counter_buf[6:0] <= 7'b0000000;
  21.       end
  22. endmodule


复制代码
未命名.jpg
发表于 2011-7-18 11:55:43 | 显示全部楼层
错误比较多
reg只能在一个always块里赋值,你用了2个
15行中的clk怎么做为使能信号?
建议把时序图先画出来再理解透彻了再写代码吧。
看得比较乱
发表于 2011-7-18 12:35:05 | 显示全部楼层
一个寄存器不能在2个always块里赋值,而且一般同步时序设计里面把clk信号用作时钟而非使能。
一般clk的频率要远大于fin的频率,感觉你对计数器电路的实现原理没弄透,做这个设计不像C语言,还是要看硬件时序的。
 楼主| 发表于 2011-7-18 13:29:29 | 显示全部楼层
本帖最后由 shadow_cuk 于 2011-7-18 13:37 编辑

回复 3# pptwo


    我这个计数器是对fin计数,fin的频率远高于clk,clk上升沿开始对fin计数,计数方式是采集fin的上升沿,clk下降沿计数结束并输出结果,如果没有异步复位倒也不难弄,有这个异步复位就不知道怎么弄了。本人是搞模拟的,数字方面接触不多。
发表于 2011-7-18 13:41:42 | 显示全部楼层
回复 4# shadow_cuk


    这个电路的电路图应该是怎样的呢?
画一下你就知道为什么了。
发表于 2011-7-18 15:18:47 | 显示全部楼层
1、使用fin得到clk的沿
2、上升沿计数。 不知道你的下降沿是否清0
3、下降沿输出
 楼主| 发表于 2011-7-18 16:48:11 | 显示全部楼层
本帖最后由 shadow_cuk 于 2011-7-18 16:49 编辑

回复 6# newliujian

不太明白你的意思
clk下降沿输出计数值并保持到下一个下降沿来临之前,cout不用清零,但counter_buf要清零的
发表于 2011-7-19 09:00:17 | 显示全部楼层
本帖最后由 down_load 于 2011-7-19 09:02 编辑

就这点东西,function能对才怪呢。回家好好看看书,基础的东西自己多学习
发表于 2011-7-19 10:20:05 | 显示全部楼层
1、使用fin得到clk的沿,不知道同步异步的关系,假定为同步
2、下降沿输出
always @(posedge fin or posedge reset)
    if(reset)
        clk_d1 <= 1'b0;
    else
        clk_d1 <= clk;

assign        clk_negedge = clk_d1==1'b1 && clk==1'b0;

always @(posedge fin or posedge reset)
    if(reset)
        counter_buffer <= 7'b0;
    else (clk) //饱和翻转
        counter_buffer <= counter_buffer + 1;
    else
        counter_buffer <= 7'b0

always @(posedge fin or posedge reset)
    if(reset)
        counter <= 7'b0;
    else if(clk_negedge)
        counter <= counter_buffer;
发表于 2011-7-19 22:15:45 | 显示全部楼层
另外,fin不是时钟的话怎么能写到敏感列表里?这是绝对错误的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-20 05:50 , Processed in 0.035224 second(s), 10 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表