2015-04-07 3 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 Сопрягать begin из always блока.

(После того, как вы зафиксировали, что вы увидите, что есть и другие ошибки, также см. Ответ mcleod_ideafix в.)

+0

Можете ли рассказать мне, где и как использовать блок «всегда» в моем коде? – Learner

+0

У вас уже есть блок: 'always @ * begin ...', то, что отсутствует, - это еще один «конец», прямо перед «endmodule». – 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

Смежные вопросы