微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 求:大家帮忙看下这段地址代码!

求:大家帮忙看下这段地址代码!

时间:10-02 整理:3721RD 点击:
always @(posedge clk or negedge reset)
begin
  if(!reset)
  begin
    addr <= 18'b0;
  end
  else
  begin
    if(data_start)
    begin
      addr <= {1'b0,Data21[15:8],1'b0,Data21[7:0]};
    end
    else if(next_grab & (cnt0 == 2'b11))
    begin
      addr <= addr + 1'b1;
      if(addr == {1'b0,addr[16:9],1'b0,Data44[15:8]})
      begin
        addr <= {1'b0,(addr[16:9] + 1'b1),1'b0,Data44[7:0]};
        if(addr == {1'b0,Data45[15:8],1'b0,Data44[15:8]})
        begin
          addr <= 18'b0;
        end
      end
    end
  end
end
其中Data21[15:0],Data44[15:0],Data45[15:0]均可从先前的数据中得到,属于已知数值。主要是这个addr的跳转问题。
请大家帮忙看下这段代码有什么问题么?谢谢了!
希望大家多多提意见与参考,小弟在此谢过了......非常感谢!

阻塞与非阻塞的问题....

个人建议,你写的else if(next_grab & (cnt0 == 2'b11))
    begin
      addr <= addr + 1'b1;
      if(addr == {1'b0,addr[16:9],1'b0,Data44[15:8]})
      begin
        addr <= {1'b0,(addr[16:9] + 1'b1),1'b0,Data44[7:0]};
        if(addr == {1'b0,Data45[15:8],1'b0,Data44[15:8]})
        begin
          addr <= 18'b0;
        end
      end
比较繁琐,你好好把addr的下一个状态规整下,赋值与nextaddr.

对,阻塞的问题,

代码的可读性不好,if语句一层一层的套着,这样不好看,以后也不好定位问题。
用的时序逻辑,非阻塞语句应该没有问题的,建议小编先把代码整理下

要看LZ想实现什么样的功能。这样的写法,条件里的addr和被赋值的addr必须是不同cycle的值,换句话说,条件里的addr的值必须是之前的时钟计算所得到的值。

代码在修改中,后续修改验证之后会发上来,谢谢大家的关注与参与。非常感谢!

改后的代码如下:
always @(posedge clk)
begin
  if(!reset)
  begin
    addr <= 16'b0;
  end
  else if(data_start)
  begin
    addr <= Data21;
  end
  else if(next_grab)
  begin
    if(addr == {addr[15:8],Data44[15:8]})
    begin
      addr <= {(addr[15:8] + 1'b1),Data44[7:0]};
      if(addr == {Data45[15:8],Data44[15:8]})
      begin
         addr <= 16'b0;
      end
    end
    else
    begin
      addr <= addr + 1'b1;
    end
  end
end
可以实现跳转。

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

网站地图

Top