2013-03-26 8 views
2

Я учусь Verilog, и я думаю, что есть что-то, что я не должен понять, о всегда @ * и всегда (@posedge CLK, ...)Verilog всегда @ (posedge) при отсутствии в УАПП

Вот кусок кода, который должен отправлять биты через uart. Это не удается при синтезе. Ошибка «Логика для не соответствует известному шаблону FF или Latch. Стиль описания, который вы используете для описания регистра или защелки, не поддерживается в текущем выпуске программного обеспечения». (и еще 3 ошибки для, и) Если я всегда меняю @ (...) всегда @ *, на следующем шаге все «не выполняется», потому что вещи не связаны.

В книге, которую у меня есть, они реализуют fsmd с всегда (posedge clk) для состояния и всегда @ * для другой логики, но я не понимаю, почему это не работает.

На другом форуме я читал, что ошибка может исходить из слишком сложных условий. Но я тоже упростил (не кодирую код здесь, но в основном я удалил случай (состояние) и ifs, чтобы иметь однострочные задания с?: Или двоичные условия, но он тоже не работал)

У меня есть видел эту ошибку раньше в других фрагментах кода, которые я написал, но я не дошел до конца, поэтому, если бы вы могли помочь мне понять общую проблему (с этой uart-вещью в качестве поддержки конкретного примера), я бы будьте очень счастливы. Благодаря Томас

PS: Im использованием Xilinx Spartan комплект 3e стартера и Xilinx ISE 14.4

module UART_out #(parameter [3:0] NUM_BITS = 8) 
(
input wire baud_clk, 
input wire send_tick, 
input wire[NUM_BITS-1:0] data_in, 
output wire tx, 
output wire debug_done 
); 
localparam 
     IDLE = 0, 
     TRANSMIT = 1; 
reg[NUM_BITS:0] bits_to_send; 
reg state; 
reg out_bit; 
reg[4:0] cnt; 

always @(posedge baud_clk, posedge send_tick) 
begin 
    case (state) 
    IDLE: 
     if (send_tick) 
     begin 
      bits_to_send <= {data_in, 0}; 
      state <= TRANSMIT; 
      cnt <= 0; 
     end 
    TRANSMIT: 
     begin 
      if (cnt < NUM_BITS) 
       cnt <= cnt + 1; 
      else 
       state <= IDLE; 
      bits_to_send <= {1, bits_to_send[NUM_BITS:1]}; 
      out_bit <= bits_to_send[0]; 
     end 
    endcase 
end 

assign tx = (state == IDLE ? 1 : out_bit); 
assign debug_done = (state == IDLE);  
endmodule 

ответ

4

Ошибка:

The logic for does not match a known FF or Latch template. The description style you are using to describe a register or latch is not supported in the current software release. 

имеет в виду тот факт, что инструмент синтеза не имеет любые аппаратные ячейки для использования, которые соответствуют вашему описанию.

Какое оборудование вы хотите от:

always @(posedge baud_clk, posedge send_tick) 

Это выглядит, как вы хотите, флип-флоп с разрешающим сигналом. Сигнал включения (send_tick) должен быть шириной 1 такт. Затем он используется для выбора пути логики на краю тактового генератора. а не как альтернативный триггер.

Я думаю, что это все, что вам действительно нужно:

always @(posedge baud_clk) begin 
    case (state) 
    IDLE: 
     if (send_tick) begin 
     //... 
     end 
    //... 
    endcase 
end 

Если send_tick из другого домена часы, то вам нужно будет сделать некоторые часы домена пересечения, чтобы превратить это его широкий импульс синхронизации на baud_clk ,

Возможно, вас путают с блоками, которые имеют несколько триггеров, они обычно являются clk и сбрасываются. A negedge reset_n или posedge reset часто добавляются для условий сброса (инициализации).

При добавлении сброса:

always @(posedge baud_clk or negedge reset_n) begin 
    if (~reset_n) begin 
    //reset conditions 
    state <= IDLE; 
    //... 
    end 
    else begin 
    // Standard logic 
    end 
end 

Вы заметите, что есть очень определенная структура здесь, если сбросить еще ... Инструменты синтеза признают это как триггер с асинхронным сбросом. Данные в состоянии сброса также являются статическими, обычно устанавливая все в ноль.