首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xst:3002在Verilog

Xst:3002在Verilog
EN

Stack Overflow用户
提问于 2016-03-27 09:03:13
回答 1查看 504关注 0票数 1

我在ISE 14.7上创建了一个计数器。我设置了异步重置(Rst_n),每当它变为0时,计数器的值将被设置为init_value。

但是当我合成代码时,会出现一个警告: Xst3002

代码:

代码语言:javascript
复制
`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)如果不需要从所有寄存器和锁存中删除set或reset (如果不需要的话) 2)修改代码以产生同步集和/或重置(两者都是首选) 3)确保所有寄存器的初始化值与所描述的异步集或复位极性4相同))使用-async_to_sync选项将异步集/复位转换为同步操作(使用此选项时强烈建议进行定时模拟) 有关详细信息,请参阅http://www.xilinx.com搜索字符串"Spartan6异步设置/重置“。 异步设置和重置的寄存器实例列表:单元中的value_0,单元中的value_1,单元中的value_2,单元中的value_3

似乎出现警告是因为3:0值。但我对此一无所知。我试图将异步重置更改为0,警告就消失了。但这不是我想要的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-27 13:10:44

这个设计有几个问题。首先,init_value_tmp似乎没有一个值集。其次,由于它是一个非常量,斯巴达-6体系结构可能无法使用内置重置功能实际重置到该值。更改value <= init_value_tmp;,以便为value分配一些有意义的常量。

至于异步复位,它似乎是有效的,但由于我没有一个斯巴达-6设备,你必须合成它,并尝试自己。我担心的是,无论您使用什么常量值,都可能会遇到以前得到的极性警告。很可能同步重置会“工作”,因为它只是一个进入数据输入的CLB中的mux。

编辑:关于使用非常量重置值的目标,您几乎必然需要同步重置(这更像是赋值而不是重置):

代码语言:javascript
复制
always @(posedge clk) begin
    if(~rst_n) value <= init_value_tmp;
    else begin
        value <= value_tmp;
    end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36245628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档