Я учусь 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