2015-02-19 3 views
0

В приведенном ниже коде показан конечный автомат, в котором контроллер представляет собой отдельный модуль данных, чтобы найти GCD двух 4-разрядных чисел. В настоящее время я получаю следующие ошибки, и я не уверен, почему, может быть, из-за некоторого синтаксиса, о котором я сейчас знаю:Контроллер Verilog FSM и датапат

ОШИБКА: HDLCompiler: 806 - "D:/Xilinx Stuff/GCD123/Controller.v" Строка 48: Синтаксическая ошибка около ";". ОШИБКА: HDLCompiler: 806 - «D:/Xilinx Stuff/GCD123/Controller.v» Строка 59: Синтаксическая ошибка рядом с «;». ОШИБКА: HDLCompiler: 806 - «D:/Xilinx Stuff/GCD123/Controller.v» Линия 62: Синтаксическая ошибка около «;».

код, где erros встречаются ниже:

module Controller(start,reset,x_sel,y_sel,xlty,xgty,xequaly,clk); 

    input start,clk, reset, xlty, xgty,xequaly; 
    output x_sel,y_sel; 


    // Declare state register 
    reg  [1:0]state; 

    // Declare states 
    parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3, S4 = 4; 


    debounce startd(.clock(clk),.noisy(start),.clean(clean_start)); 

    always @ (posedge clk or posedge reset) begin 
     if (reset) 
      state <= S0; 
     else 
      case (state) 
       S0: 
        if (clean_start) 
         state <= S1; 
        else 
         state <= S0; 
       S1: 
        x_sel <= 0; 
        y_sel <= 0; 
        state <= S2; 
       S2: 
        if (xlty) 
         state <= S3; 
        else if(xgty) 
         state <= S4; 
        else if(xequaly) 
         state <= S5; 
       S3: 
        y_sel <= 1; 
        state <= S2; 
       S4: 
        x_sel <= 1; 
        state <= S2; 
       S5: 
        state <= S0; 

      endcase 
    end 

endmodule 

линии, которые имеют ошибки являются y_sel <= 0; в состоянии S1, state <= S2; в состоянии S4 и state <= S2; в состоянии S3.

ответ

0

Вам нужно начать/конец вокруг последовательных операторов:

module Controller(start,reset,x_sel,y_sel,xlty,xgty,xequaly,clk); 
input start,clk, reset, xlty, xgty,xequaly; 
output x_sel,y_sel; 


// Declare state register 
reg  [1:0]state; 

// Declare states 
parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3, S4 = 4; 


debounce startd(.clock(clk),.noisy(start),.clean(clean_start)); 

always @ (posedge clk or posedge reset) begin 
    if (reset) 
     state <= S0; 
    else 
     case (state) 
      S0: 
       if (clean_start) 
        state <= S1; 
       else 
        state <= S0; 
      S1: 
       begin 
       x_sel <= 0; 
       y_sel <= 0; 
       state <= S2; 
       end 
      S2: 
       if (xlty) 
        state <= S3; 
       else if(xgty) 
        state <= S4; 
       else if(xequaly) 
        state <= S5; 
      S3: 
       begin 
       y_sel <= 1; 
       state <= S2; 
       end 
      S4: 
       begin 
       x_sel <= 1; 
       state <= S2; 
       end 
      S5: 
       state <= S0; 

     endcase 
end 

endmodule 
+1

В дополнение к 'начать/end' выходных портов' 'x_sel' и y_sel' должны быть объявлены как' reg' параметров. Также 'S5' должен находиться в списке' parameter'. – Amir

+0

Спасибо, это решило мою проблему. @Amir x_sel и y_sel в основном служат в качестве выделенных строк для 2 отдельных мультиплексоров, которые реализованы в отдельном модуле datapath. Контроллер здесь просто устанавливает их как высокие, так и низкие, в зависимости от того, что он хочет делать. Объявляли бы их как параметры reg, чтобы они могли выполнять эту функцию? – Antoninus

+0

Все параметры, которые назначены в блоке 'always', должны быть объявлены как параметр' reg'. Если он всегда чувствителен к 'clk', эти параметры синхронны с' clk'. Это означает, что линии выбора мультиплексоров синхронны с 'clk' и меняются на' clk', поднимающемся или падающем фронте. – Amir

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