두 개의 53 비트 숫자를 곱하기위한 코드가 있습니다 (아래에 쓰여 있습니다). 두 개의 다른 106 비트 레지스터를 사용하여 shift-add 전략을 사용하고 있습니다. 이 코드는 정상적으로 작동합니다. 이제 나는 또 다른 53 비트 고도로 최적화 된 hans carlson 덧셈기 모듈을 형식으로 작성했습니다 :Verilog 항상 블록 내부의 모듈 인스턴스화. 곱하기에 대한 덧셈기 사용
모듈 hans_carlson_adder (입력 [52 : 0] a, b, 입력 c_in, 출력 [52 : 0] 합, 출력 c_out);
이 덧셈기를 for 루프 (코드에서 언급)에서 합계 줄을 수행하려면 사용하고 싶습니다. 항상 블록 내부에서 덧셈기를 인스턴스화하는 데 문제가 있습니다. 게다가 나는이 가산기의 106 인스턴스 (for 루프 때문에)를 갖고 싶지 않습니다. 당신은
module mul1(
output reg [105:0] c,
input [52:0] x,
input [52:0] y,
input clk,
input state
);
reg [105:0] p;
reg [105:0]a;
integer i;
always @(posedge clk) begin
if (state==1) begin
a={53'b0,x[52:0]};
p=106'b0; // needs to zeroed
for(i=0;i<106;i=i+1) begin
if(y[i]) begin
p=p+a; //THIS LINE NEEDS TO BE REPLACED WITH HANS CARLSONADDER
end
a=a<<1;
end
c<=p;
end else begin
c=0;
end
end
endmodule
두 가지 선택이 있습니다. 1) 한 사이클에서 곱셈을 수행하는 52 개의 덧셈기 2) 52 사이클에서 곱하기를 수행하는 하나의 덧셈기. 어느 쪽을하고 싶습니까. 참고 : 원래 코드는 y에 많은 비트가 없으므로 106 번 반복 할 필요가 없습니다. always 블록에서 모듈을 인스턴스화 할 수 없으므로 항상 외부에 인스턴스를 작성하거나 대신 함수 구현을 얻으십시오. –
@Brad Budlong 나는 52 사이클에서 하나의 덧셈기 구현을 원한다. (피연산자는 106 비트가 될 것이므로 두 개를 사용해야 할 것입니다.) 내가 밖에서 모듈을 인스턴스화 할 수있는 방법을 이해하지 못하는 내가 루프에 대한 추가 작업을하고있는 것처럼 여전히 함수를 사용합니다. –