做第二个实验的时候
看到这段代码
我把这段代码揪出来做了一些简单的调整单独做成一个module进行综合得到了以下情况
做的调整是 首先把led的八位信号变成两位,增加一个两位的输入in信号,将移位操作去掉变成led被in赋值;此外我认为delay_cnt类似于一个使能信号,单独做成module的话抽出来成为一个输入管脚,也就是代码如下
module dfif(sys_clk,sys_rstn,led,delay_cnt,in);
input sys_clk;
input sys_rstn;
input[1:0] in;
input delay_cnt;
output[1:0] led;
reg[1:0] led;
always@(posedge sys_clk, negedge sys_rstn)
begin
if(!sys_rstn)
led<=2'b11;
else if(delay_cnt==1'b1)
led<=in;
/*begin
if(led==8'b00000000)
led<=8'b11111111;
else led<=led<<1;
end */
else led<=led;
end
endmodule
综合出来的实际电路图是
图上红线部分接入了D触发器的使能信号
然后我对上面的代码又做了一点调整,将in和led都分别改成一位,也就是成为一个彻底的带使能的D触发器的代码
如下
module diff2(sys_rstn,sys_clk,in,led,delay_cnt);
input sys_rstn;
input sys_clk;
input in ;
input delay_cnt;
output led;
reg led;
always@(posedge sys_clk, negedge sys_rstn)
begin
if(!sys_rstn)
led<=1'b1;
else if(delay_cnt==1'b1)
led<=in;
/*begin
if(led==8'b00000000)
led<=8'b11111111;
else led<=led<<1;
end*/
else led<=led;
end
endmodule
综合出来实际电路为
观察上面的delay_cnt使能信号输入线
问题来了:
两段代码除了输入和输出的数据位宽不一样,为什么综合出来的有如此差异?
作为输入和输出为两位位宽的综合出来实际电路对于D触发器,delay_cnt输入到的是D触发器本身内部的使能管脚ENA;但是当输入和输出位宽为1的时候,也就是一个典型的D触发器的时候,综合出来的结果delay_cnt却是和in经过一个二选一进入D触发器本身,而D触发器本身的使能ENA压根没有用到?对于这两段仅仅数据位宽不一样,但是结构完全一样的代码,综合器为什么综合结果采取两种不同的结果?
二者作为RTL综合出来的结果在结构上市完全一致的,那么为什么实际电路却有如此差异?
祝各位工作顺利