2013-03-26 46 views
2

我学习Verilog的失败,我觉得有东西,我不能明白关于总是@ *始终(@posedge CLK,...)的Verilog总是@(posedge)在UART

这里是一个一段代码应该通过uart发送位。它在合成时失败。 错误是 “逻辑与已知的FF或Latch模板不匹配,当前软件版本不支持描述样式来描述寄存器或锁存器。” (以及其他3个错误) 如果我总是通过@ *更改always @(...),则在下一步(“实现设计”)中事情失败,因为事情没有连接。

在我的书中,他们实现了一个fsmd,其状态为always(posedge clk),而其他逻辑始终为@ *,但我不明白为什么这不起作用。

在另一个论坛上,我读到错误可能来自过于复杂的条件。但我也简化了一些东西(不是在这里编写代码,但基本上我删除了case(状态)和ifs以单行分配?:或二进制条件,但它也没有工作)

我有在我写的其他代码片段中看到过这个错误,但是我没有深入到底部,所以如果你能帮助我理解一般问题(用这个例子作为对具体例子的支持),我会非常高兴。 感谢 托马斯

PS:使用im赛灵思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并重置。通常会添加negedge reset_nposedge 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 

你会发现,这里有一个非常明确的结构,如果重置否则......综合工具认识到这是一个触发器具有异步复位。复位条件中的数据也是静态的,通常将所有内容设置为零。