안녕하십니까 Quartus2를 사용해서
Verilog 코딩으로 곱셈기를 설계하고 있습니다.
저만 질문 드리는 것 같아서 많이 민망하지만 ㅠ
그런데 아래와 같이 product라는 2*N-1 size의 Vector에 앞에서 N개는 0을 넣고
뒤에는 word2 (Size N) 를 넣는 구문을 선언하고자 합니다.;;
그런데 2개 방법 모두 에러가 발생하고 있는 상황입니다.
이렇게 N개의 0을 정의하기 위해서는 어떻게 하는 게 좋을지 조언을 구해 봅니다.
product <= {N'b0, word2[N-1:0]};
product <= {N'b0, word2};
음 자꾸 에러가 나서 검증은 못했지만 원코드도 올려 봅니다.
module Multiplier3(product, Ready, word1, word2, clock, reset, Start);
parameter N = 4;
output[2*N-1:0] product;
output Ready;
reg [2*N-1:0] product;
input word1, word2;
input clock, reset, Start;
wire m0, Load, Shift, Add_Shift, Enable, End;
wire [3:0] count;
Datapath u1 (prodcut, m0, word1, word2, reset, clk, Load, Shift, Add_Shift);
Controller u2 (Load, Shift, Add_Shift, Enable, Ready, m0, Start, reset, clk, End);
Counter u3 (count, Enable, reset, clk);
assign End = (count == N-1);
endmodule
module Datapath (product, m0, word1, word2, reset, clk, Load, Shift, Add_Shift);
parameter N = 4;
output [2*N-1:0] product;
output m0;
input [N-1:0] word1, word2;
input reset, clk, Load, Shift, Add_Shift;
reg [2*N-1:0] product;
reg [N-1:0] multiplier, multiplicand;
wire [N:0] sum;
assign m0 = product[0];
assign sum = product[2*N-1:N] + multiplicand;
always@(posedge clk or posedge reset) begin
if (reset) begin
multiplicand <= 0; multiplier <= 0; multiplicand <= 0;
end else if (Load) begin
multiplicand <= word1;
product <= {N'b0, word2};
end else if (Shift) begin
product <= product >> 1;
end else if (Add_Shift) begin
product[2*N-1:N-1] <= sum;
product[N-2:0] <= product[N-1:1];
end
end
endmodule
module Controller (Load, Shift, Add_Shift, Enable, Ready, m0, Start, reset, clk, End);
output Load, Shift, Add_Shift, Enable, Ready;
input m0, Start, reset, clk, End;
reg state, next_state;
wire Load, Shift, Add_Shift, Enable;
parameter S0 = 0, S1 = 1;
always @ (posedge clk or posedge reset) begin
if (reset) state <= S0;
else state <= next_state;
end
always @ (Start or state or m0) begin
case (state)
S0: if (Start) next_state <= S1;
else next_state <= S0;
S1: if (End) next_state <= S0;
else next_state <= S1;
default : next_state <= S0;
endcase
end
assign Add_Shift = (state == S1) && m0;
assign Shift = (state == S1) && ~m0;
assign Load = (state == S0) && Start;
assign Enable = (state == S1);
assign Ready = (state == S0) && ~reset;
endmodule
module Counter(count, Enable, reset, clk);
output [3:0] count;
reg [3:0] count;
input reset, clk, Enable;
always@(posedge clk) begin
if (reset) count <= 0;
else if (Enable) count <= count + 1;
end
endmodule
첫댓글 음 너무 자주 여쭤 보는 것 같아서 정말 죄송합니다
하루 왠 종일 Verilog만 바라 보고 있으니 질문이 넘쳐나는 것 같습니다
앞으로는 좀 자중할겠습니다 ^^
좀만 더 실력이 오른다면요 ㅎㅎㅎ ^^;;;;
다이어트킹님 질문 많이 해주세요....많이 배우고 갑니다...전 정말 초보라 질문하고 싶어도 할줄 몰라요..ㅠㅠ