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

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜全文
查看: 5694|回复: 11

[求助] 谁能帮我看看这个计数器的逻辑如何控制?

[复制链接]
发表于 2012-3-14 17:10:38 | 显示全部楼层 |阅读模式

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

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

×
我想设计这样的一个计数器:当标志信号bfw为高电平时(仅持续一个时钟周期),计数器开始计数,当计数器计数值为四时,控制信号ctr有效至高,该信号一直持续,一直计数满12时,控制信号置低。下面我写的代码部分,仿真后波形不正确,求指点,谢谢!



//counter part
always @(posedge clk or negedge rst)
begin
if(!rst)
  cnt<=0;
else
  begin
   if(bfw==1)
     cnt<=1;
   else
     cnt<=cnt+1;
  end
   
end

//ctr part
always @(posedge clk)
begin
  if(!rst)
    ctr<=0;
  else
    begin
  if(cnt==4)
    ctr<=1;  
  else if(cnt==12)
    ctr<=0;
  else
    ctr<=ctr;
    end        
end
发表于 2012-3-14 17:47:53 | 显示全部楼层
if(bfw==1)
     cnt<=1;
   else if( cnt != 0)
     cnt<=cnt+1;
  end
回复 支持 反对

使用道具 举报

发表于 2012-3-14 19:08:30 | 显示全部楼层
begin
   if(bfw==1)
     cnt<=1;
   else
     cnt<=cnt+1;
  end
需求是bfw=1时才开始计数,这个地方明显不对,如果bfw从一开始就不等于1,不是也会计数;bfw=1时只是重新设置了cnt的值为1;
应该这样:
begin
   if(bfw==1)
     cnt_en<=1'b1;
     cnt <= 1; //如果需要在bfw等于1时将cnt值置为1的话
   else
     cnt_en<=cnt_en;
  end
always @(posedge clk)
begin
   if(cnt_en == 1'b1)
    cnt <= cnt+1'b1;
   else;
end
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-14 19:59:00 | 显示全部楼层
回复 3# h646598660


    如果按您说的这样的话,就是在bfw为高电平时,cnt_en就会设置为高电平,我的意思不是这样。


是这样的:bfw相当于标志信号,它的高电平仅持续一个周期,在该信号为高电平时,表示已经有数据进来,但是前四个数据是控制字,不需要处理,我只对后八个用户数据进行计数,也就是第四个到第十二个数据,这个期间我要输出cnt_en控制信号。


我尝试写了几种方法,可是逻辑都不对~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-14 20:05:22 | 显示全部楼层
回复 2# xuy731


    这样的话,如果我一开始进行复位,cnt置零。这时程序怎么执行?这不是产生锁存器了吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-14 20:11:43 | 显示全部楼层
回复 2# xuy731


    不过我还是从您的回答中受到启发,呵呵,现在已经满足我的要求了,非常感谢!!
是这样的:

begin
   if(bfw==1)
     cnt<=1;
   else if(cnt!=0)
     cnt<=cnt+1;
   else
     cnt<=cnt;
  end
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-3-14 20:12:54 | 显示全部楼层
回复 3# h646598660


    非常感谢您的热心帮助!
回复 支持 反对

使用道具 举报

发表于 2012-3-15 20:09:21 | 显示全部楼层
reg    [12:0]    cnt_reg;
always@(posedge clk)
begin
    cnt_reg <= {cnt_reg[12:1],bfw}
end

always@(posedge clk or rst)
begin
    if(rst == 1'b1) begin
         ctr<= 1'b0;
    end
    else if (cnt_reg == 13'0000000100000 ) begin
        ctr<= 1'b1;
    end
    else if (cnt_reg == 13'1000000000000) begin
        ctr<= 1'b0;
    end
end
回复 支持 反对

使用道具 举报

发表于 2012-3-26 17:45:15 | 显示全部楼层
回复 6# 乐烁橙


对CNT的赋值是时钟控制的,if..else..如果没写全默认情况寄存器的值是保持不变的,综合器不会综合成锁存器,但是如果不是时钟控制,条件表达式没写全则会综合处锁存器
回复 支持 反对

使用道具 举报

发表于 2012-3-28 11:41:14 | 显示全部楼层
来晚了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2025-10-27 18:05 , Processed in 0.026375 second(s), 4 queries , Gzip On, Redis On.

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