我使用简单的加法器编写我的verilog代码(inbiult在xilinx本身),但我想用我已经编写的代码的RNS加法器替换它,它给出了 模块RNS(clk,rst,a,b,c) 其中a,b是rns加法器的输入,c是输出。
我使用简单加法器的代码如下所示。在我的代码中我使用启用,因为我必须使用始终阻止....但在结构建模(当我调用RNS加法器)时如何处理这个启用?
module output_adder_8(enable,s089,s318,s175,s250,s289,s118,s075,s350,s189,s218,s375,s050,s389,s018,s275,s150,r1,r3,r5,r7);
input enable;
input [13:0] s089,s175,s250,s318,s289,s118,s075,s350,s189,s218,s375,s050,s389,s018,s275,s150;
output reg[15:0] r1,r3,r5,r7;
reg [11:0] c,d,e,f,g,h,i,j;
//reg [3:0] countp=4'b0000;
always@*
begin
if (enable)
c<= s089+s318;
d<= s175+s250;
r1<= c+d;
e<= s289+s118;
f<= s075-s350;
r3<=f-e;
g<= s218-s189;
h<= s375+s050;
r5<=g+h;
i<= s018-s389;
j<= s275-s150;
r7<=i+j;
end
endmodule
module shift_adder_8a( clk, z0, s018, s050, s075, s089,enable0 );
input clk;
input [12:0] z0;
output reg [13:0] s018;
output reg [13:0] s050;
output reg [13:0] s075;
output reg [13:0] s089;
output reg enable0;
// temp reg declaration
reg [3:0] count0=4'b0000;
reg [13:0] d01,
d02,
d03,
d04,
d05,
e01,
e02,
e03,
e04;
always @(posedge clk )
begin
d01 <= z0<< 3;
d02 <= z0 << 4;
d03 <= z0 << 6;
if (count0==4'b0110)
d04 <= e01 << 1;
d05 <= e02 << 1;
e01 <= d01 + z0;
e02 <= d02 + e01;
e03 <= d03 + e02;
e04 <= e02 + d05;
s018 <= d04;
s050 <= d05;
s075 <= e04;
s089 <= e03;
enable0<=1'b1;
end
答案 0 :(得分:0)
如果您想使用自己的加法器设计而不是使用内置函数或者等效的合成+编译器工具,您只需要实例化模块而不是使用+
运算符。要保留您的启用线,您可以简单地拥有一个单独的组合块(always @*
或assign
),如果启用,则传递输出,如果启用关闭则输出为0。下面是一个例子:
module( enable, clk, rst, a, b, c );
input clk;
input rst;
input enable;
input [15:0] a;
input [15:0] b;
output [15:0] c;
wire [15:0] adder_out
// Your adder
RNS rns_adder( .clk(clk), .rst(rst), .a(a), .b(b), .c(adder_out) );
// Enable line
assign c = (enable) ? adder_out : 16'b0;
endmodule
注意:请勿在{{1}}块中使用非阻止分配(<=
),使用阻止分配(always @*
)