微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > Verilog FPGA有条件调用模块的问题,奇怪!

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

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

网站地图

Top