使用case语句有条件地调用模块

时间:2016-04-16 06:47:39

标签: verilog

我希望在select a.deptid, a.empid, a.salary, b.name from Table1 a, Table2 b where a.empid= b.empid and a.salary>( select avg(salary) from Table1 c where c.deptid = a.deptid ) 时实现模块加法器,在sel=0时实现模块减法器。我了解到generate可以用来有条件地调用另一个模块中的模块。

sel=1

提前致谢!

3 个答案:

答案 0 :(得分:2)

我们在这里设计硬件,而不是编写软件。 Verilog module是一堆硬件。你不能“召唤”Verilog module,而不能“称呼”PCB上的芯片。

您的addersubtractor模块是硬件块。你不能“称呼”他们。您需要的是一些硬件 - 可能是多路复用器 - 来选择两个输出并驱动o输出:

module checker(o,a,b,sel);
  output /* is this really 1 bit wide?   */ o;
  input  /* are these really 1 bit wide? */ a,b;
  input sel;

  wire   /* are these really 1 bit wide? */ sum, diff;;

  adder      a1(.sum(sum),   .a(a), .b(b));
  subtractor s1(.diff(diff), .a(a), .b(b));

  assign o = sel ? diff : sum;

endmodule

顺便说一句 - 您的输入和输出肯定超过1位宽?

答案 1 :(得分:1)

你不能这样做。由于generate块在模拟之前已经过了,case中的generate需要一个参数或宏。

您可以将sel作为两个模块的输入,并相应地进行操作。

以下是您的模块的外观:

module add_sub(input a,b,sel,output wire [1:0] s);

assign s = (sel) ? (a + b) : (a - b);

endmodule

根据sel,必须执行操作。

顶层模块只是实例化add_sub模块。

module checker(o,a,b,sel);

add_sub a1(.a(a), .b(b), .sel(sel), .s(o));

endmodule

答案 2 :(得分:0)

启动时,您无法动态生成硬件。因此,逻辑必须在那里。

如果你想保存在门上,你可以使用单个加法器而不是一个加法器和一个减法器。根据select将b或-b(2' s compliment)值传递给它。这样,您可以保存减法逻辑。 请使用以下作为示例并正确编码。

assign b_final = sel ? b : -b;
assign s = a+ b_final;