二进制转BCD码verilog代码的综合警告
input [5:0] bin_in,
output reg [3:0] bcd_unit,bcd_dec);
reg [7:0] bcd_temp;
reg [5:0] bin_data;
integer i;
always@(bin_in)
begin
bcd_temp=8'b0;
bin_data=bin_in;
for(i=0;i<5;i=i+1)
begin
bcd_temp={bcd_temp[6:0],bin_data[5]};
if(bcd_temp[3:0]>4'd4)
bcd_temp[3:0]=bcd_temp[3:0]+4'd3;
else if(bcd_temp[7:4]>4'd4)
bcd_temp[7:4]=bcd_temp[7:4]+4'd3;
bin_data=bin_data<<1;
end
{bcd_dec,bcd_unit}={bcd_temp[6:0],bin_data[5]};
end
endmodule
最后综合的时候却提示:
WARNING:Xst:646 - Signal <bin_data> is assigned but never used. This unconnected signal will be trimmed during the optimization process.
WARNING:Xst:646 - Signal <bcd_temp<7:4>> is assigned but never used. This unconnected signal will be trimmed during the optimization process.
程序经过了功能仿真,看了半天也没琢磨透为什么会有这个警告,求大神指导啊!
要利用这个代码做实验了,求助啊 !
组合逻辑的输入条件不全,也就是always @()括号里面的条件不全。bin_data也是输入条件,但并未在列表里。最好的方法就是组合逻辑都用always @(*),这样就不会掉输入条件了。
.....做好事不留名...哈哈哈
赞一个
我添加进去后又综合了一遍,还是存在一样的警告啊
之所以出现这种Warnings,是因为这条语句是阻塞赋值语句
那么,bin_data和bcd_temp这两个中间变量,就会被优化掉了
原来是这样子,那就不用管他的警告了,另外再请教一下啊,我在网上看到状态机的这么一段描述,状态机中状态变量初始化赋值:如果所有的状态都使用到了,可以使用x,它可以让综合器删除不必要的译码电路,使生成的电路简洁,并与设计要求一致,另外调试的时候很方便;如果状态没有使用完,有多余的状态,则不能使用x,应该设置为IDLE或者0。这样做能使状态机若偶然进入多余状态后仍能在下一时钟跳变沿时返回正常工作状态,否则会引起死锁。
对于第一句话,如果所有的状态都使用到了,这是指什么意思啊,比如我设定5个状态,用三位二进制编码,只利用了其中的五个值,那么剩下的三个是不是没有用到的状态?这时存在多余的状态,就不能使用x?还有这个所谓的初始化赋值的效果是不是和将其放在default里一样啊?希望能得到大神的指点,小弟感激不尽!
我没有这么赋值过,但是考虑到某些要求精准时钟个数的设计,或者支持级联模式的设计,这个赋值方式必然是不行的
无效的状态放在default里,可以避免死锁
我的建议是:在保证设计健壮运行的前提下,可以使用某些手段进行电路优化
恩恩,多谢!
