我在ISE 14.7上创建了一个downcounter。 我设置了一个异步复位(rst_n),每当它变为0时,counter的值将被设置为init_value。
但是当我合成代码时, 出现警告:Xst3002
代码:
`timescale 1ns / 1ps
module downcounter(value, borrow, clk, rst_n, decrease, init_value, limit);
output reg [3:0]value; //value of counter
output reg borrow; //borrow indicator
input clk, rst_n, decrease; //clock; active low reset; to decrease
input [3:0]init_value, limit; //initial value; counter limit
reg [3:0]value_tmp, init_value_tmp; //for always block
//Combinational logic
always @(value or decrease or limit or borrow)begin
if(~decrease) begin value_tmp = value; borrow = 0; end //if decrease is 0, the counter stops counting down.
else begin
if(value == 0)begin value_tmp = limit; borrow = 1; end //if the value is 0, the next value would be the limit.
else begin value_tmp = value + 4'b1111; borrow = 0; end //Ex: limit = 9, so that value(now) = 0, then value(next) = 9 in decimal.
end
end
//Sequentical logic
always @(posedge clk or negedge rst_n) begin
if(~rst_n) value <= init_value_tmp; //asynchronous reset. set the value to initial value
else begin
value <= value_tmp;
end
end
endmodule
和警告信息:
警告:Xst:3002 - 此设计包含一个或多个寄存器/锁存器 与Spartan6架构直接不兼容。该 造成这种情况的两个主要原因是所描述的寄存器或锁存器 同时使用异步设置和异步复位,或者使用寄存器 或者用异步设置或复位描述的锁存器 具有相反极性的初始化值(即 异步复位,初始化值为1)。 虽然可以构建该电路,但它在面积,功率和性能方面创建了次优实现。更多 最佳实现Xilinx强烈推荐其中之一 以下内容:
1) Remove either the set or reset from all registers and latches if not needed for required functionality 2) Modify the code in order to produce a synchronous set and/or reset (both is preferred) 3) Ensure all registers have the same initialization value as the described asynchronous set or reset polarity 4) Use the -async_to_sync option to transform the asynchronous set/reset to synchronous operation (timing simulation highly recommended when using this option)
请参阅http://www.xilinx.com搜索字符串&#34; Spartan6 异步设置/重置&#34;了解更多详情。
具有异步设置和重置的寄存器实例列表: value_0单位 value_1单位 value_2 in unit value_3 in unit
似乎因为[3:0]值而出现警告。但我不知道。 我试图将异步重置更改为0,警告消失了。 但这不是我想要的。
答案 0 :(得分:0)
此设计存在一些问题。首先,init_value_tmp
似乎没有设置值。其次,由于它是非常数,Spartan-6架构可能无法使用内置的重置功能实际重置为该值。更改value <= init_value_tmp;
,以便为value
分配一些有意义的常量。
至于异步重置,它似乎是有效的,但由于我没有Spartan-6设备,你必须合成它并自己尝试。我担心的是,无论你使用什么恒定值,都可能会遇到你之前得到的极性警告。同步重置很可能只是工作&#34;因为它只是CLB进入数据输入的多路复用器。
编辑:关于使用非常量重置值的目标,您几乎一定需要同步重置(更多的是分配而不是重置):< / p>
always @(posedge clk) begin
if(~rst_n) value <= init_value_tmp;
else begin
value <= value_tmp;
end
end