求:大家帮忙看下这段地址代码!
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
可以实现跳转。
