谁能帮我看看这个计数器的逻辑如何控制?
//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] ;
学习一下!
