微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 谁能帮我看看这个计数器的逻辑如何控制?

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

时间:10-02 整理:3721RD 点击:
我想设计这样的一个计数器:当标志信号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

if(bfw==1)
     cnt<=1;
   else if( cnt != 0)
     cnt<=cnt+1;
  end

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



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

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

我尝试写了几种方法,可是逻辑都不对~



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



    不过我还是从您的回答中受到启发,呵呵,现在已经满足我的要求了,非常感谢!
是这样的:
begin
   if(bfw==1)
     cnt<=1;
   else if(cnt!=0)
     cnt<=cnt+1;
   else
     cnt<=cnt;
  end



    非常感谢您的热心帮助!

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



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


来晚了


你这个输出是不是循环输出的? 还是每次来一个bfw高电平就仅仅输出一次ctr高? 如果仅仅输出一次,代码如下:
reg   [3:0]  cnt  ;
reg            ctr   ;  
always @( posedge clk or negedge rst )  begin
    if( !rst )
        cnt <= 4'b0000    ;
    else if( bfw )
        cnt <= 4'b0100    ;       //  这个数值开始计数,cnt最高位就是要输出的控制信号
    else if( cnt == 4'b0000 )   
        cnt <= cnt           ;        
    else
        cnt <= cnt + 4'b1 ;
end
always @( posedge clk ) begin
  if( !rst )
      ctr <= 0 ;
  else
      ctr <= cnt[3] ;   
// 等同    ctr <= cnt[3]  &&  rst  ;
end


//  -----   不需要rst信号更简单  -----

reg    [3:0]   cnt  ;
wire             ctr   ;  

always @( posedge clk or negedge rst )  begin
    if( bfw )
        cnt <= 4'b0011    ;          //  这种写法,数值就要提前一个  
    else if( cnt == 4'b0000 )   
        cnt <= cnt           ;       //  这两行删了吧
    else
        cnt <= cnt + 4'b1 ;
end
assign  ctr  =  cnt[3]  ;   

学习一下!

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

网站地图

Top