2015-04-07 99 views
0
module booth(num1,num2,prod); 

input [22:0] num1,num2; 
output [45:0] prod; 
reg [22:0]num1_bar; 
reg [46:0]sub_1; 
reg [22:0]temp; 
reg [22:0]result; 
reg [1:0]sel; 
reg [22:0]add; 
reg [22:0]zeros; 

assign temp = ~ num1; 
assign num1_bar = temp + "00000000000000000000001"; 
assign sub_1 = {zeros[22:0], num2, "0"}; 

integer i; 
always @* begin 
    for(i = 0; i < 22; i = i+1) begin 
     assign sel = sub_1[1:0]; 
     if(sel == "10") begin 
      assign add = sub_1[46:24] + num1_bar; 
      assign sub_1 ={add[22],add,sub_1[23:1]}; 
     end 
     elseif(sel == "01") begin 
      assign add = sub_1[46:24] + num1 ; 
      assign sub_1 ={add[22],add,sub_1[23:1]}; 
     end 
     else begin 
      assign sub_1= {sub_1[46] ,sub_1[46:1]}; 
     end 
    end 

endmodule 

我正在嘗試使用進位向前加法器和展位乘數來實現浮點乘法器。在運行上述代碼後,僅出現了乘數乘數的錯誤。 請幫我一把。語法錯誤:匹配開始/結束

錯誤:

Summary Tue Apr 7 15:25:28 2015


Summary New ERROR ProjectMgmt:806 - "D:/XILINX PROGRAM/bth/booth.v" Line 45. Syntax error near "begin". ERROR ProjectMgmt:806 - "D:/XILINX PROGRAM/bth/booth.v" Line 49. Syntax error near "else". ERROR ProjectMgmt:806 - "D:/XILINX PROGRAM/bth/booth.v" Line 54. Syntax error near "endmodule". INFO ProjectMgmt:1845 - Analyzing Verilog file "D:/XILINX PROGRAM/bth/booth.v" into library work

回答

0

你缺少一個end匹配的alwaysbegin

(一旦你有固定的,你會看到有其他錯誤的,太見mcleod_ideafix的答案。)

+0

請告訴我在哪裏以及如何在代碼中使用'always'塊? – Learner

+0

你已經有一個always塊:'always @ * begin ...',缺少的是'endmodule'之前的'end'。 – mkrieger1

0

你似乎有VHDL和Verilog之間的混淆。以Verilog

  • 矢量常數在以下形式:Y'zXXXXXXX其中Y是向量的比特的數量,z是基(b二進制,d爲小數,h爲十六進制),並且XXXX是在指定的基礎中的constante值。

  • elseif必須分

例如,行:

if(sel == "10") begin 

必須被重寫爲:

if(sel == 2'b10) begin 

對於大的載體,可以ommit大小說明符,並將常量寫爲:

assign num1_bar = temp + 'b00000000000000000000001; 
+0

大型矢量應該具有指定的大小,如果不明確,許多模擬器將推斷32作爲寬度。對於這些大的矢量,編寫'23'b01'更容易,也更精確。 'assign'不應該用在'always'塊中;該功能正在計劃折舊。 – Greg

+0

我已經重寫了展位乘數的代碼,但是在最後的阻塞賦值(prod = result)中又出現了一些錯誤。請幫助我先生。 – Learner