Verilog FPGA有条件调用模块的问题,奇怪!
时间:10-02
整理:3721RD
点击:
写了一个简单的ALU,实现了加法和移位两个功能。加法(Adder)和移位(shifter)都是单独的小模块,然后 在ALU中调用。ALU的输出是data_out,输出标志寄存器是flags,内部还有adder和shifter各自的使能信号enable1, enable2。ALU的选择信号是input select,用于选择data_out输出adder还是shifter的计算结果。
问题来了,第一:在仿真波形里面,可以看到选择了select为000时, adder子模块的add_out(加法结果)有正确输出,但data_out就是没有输出!百思不得其解啊。然而这样的话:#1 data_out<=add_out或者assign data_out=add_out(有人说不能在always里面用assign,但仿真结果证明,assign不会对其他case产生影响)data_out就有正确结果!
第二:我延时一段时间后把select改成了110,按理说enable1就该为0(adder不使能),enable2就该为1(shifter使能),adder内部就不应该再运算了,但仿真显示adder内部还是取了新输入的值并做了运算,shifter也做了运算。不知道怎么回事。
入手verilog还没多久,可能还有些细节东西没有掌握。也许是由于编程的思维惯性,对这种同时赋值、并行发生什么的感觉太不可思议了——总还是得有个先后的顺序吧。求大虾赐教啊!
reg[15:0] data_out;
reg[15:0] out;
output[3:0] flags;
reg[3:0] flags=3'b000;
reg enable1,enable2,direction, NP;
wire[15:0] add_out, shift_out;
wire[3:0] add_flag;
wire VF;
Adder adder(enable1, NP, data1_in, data2_in, add_out, add_flag);
shifter shift(enable2, direction, data1_in, shift_out, VF)
always @(select, data1_in, data2_in)
case(select)
3'b000:
begin
enable1<=1;
enable2<=0;
NP<=1; //指示加法还是减法
data_out<=add_out;
flags<=add_flag;
end
3'b110:
begin
enable1<=0;
enable2<=1;
direction<=1;
data_out<=shift_out;
flags[3]<=VF;
end
endcase
end
问题来了,第一:在仿真波形里面,可以看到选择了select为000时, adder子模块的add_out(加法结果)有正确输出,但data_out就是没有输出!百思不得其解啊。然而这样的话:#1 data_out<=add_out或者assign data_out=add_out(有人说不能在always里面用assign,但仿真结果证明,assign不会对其他case产生影响)data_out就有正确结果!
第二:我延时一段时间后把select改成了110,按理说enable1就该为0(adder不使能),enable2就该为1(shifter使能),adder内部就不应该再运算了,但仿真显示adder内部还是取了新输入的值并做了运算,shifter也做了运算。不知道怎么回事。
入手verilog还没多久,可能还有些细节东西没有掌握。也许是由于编程的思维惯性,对这种同时赋值、并行发生什么的感觉太不可思议了——总还是得有个先后的顺序吧。求大虾赐教啊!
reg[15:0] data_out;
reg[15:0] out;
output[3:0] flags;
reg[3:0] flags=3'b000;
reg enable1,enable2,direction, NP;
wire[15:0] add_out, shift_out;
wire[3:0] add_flag;
wire VF;
Adder adder(enable1, NP, data1_in, data2_in, add_out, add_flag);
shifter shift(enable2, direction, data1_in, shift_out, VF)
always @(select, data1_in, data2_in)
case(select)
3'b000:
begin
enable1<=1;
enable2<=0;
NP<=1; //指示加法还是减法
data_out<=add_out;
flags<=add_flag;
end
3'b110:
begin
enable1<=0;
enable2<=1;
direction<=1;
data_out<=shift_out;
flags[3]<=VF;
end
endcase
end