jjzjj

vivado 对高阻z和不定态x信号的处理

月落乌啼霜满天@3760 2024-07-29 原文

声明

实验较为简单,考虑到的情况不多。经验仅供参考。如果发现反例,欢迎评论一起探讨

文章目录

引言

最近在做关于FPGA原型验证,不清楚代码中的高阻z和不定态x会被映射成什么样的电路。会不会导致前仿真和综合后仿真的结果不一致。所以自己做了个验证。

1,高阻z

代码

先附上用来验证的源代码和仿真代码。
代码结构比较简单, e n _ z en\_z en_z信号就是我们要验证的信号。
源代码

module top(
input clk,
input rst_n,
input en,
output wire[2:0] led,
output wire[1:0] cnt  
);
chip rita(
    .clk(clk),
    .rst_n(rst_n),
    .en(en),
    .led(led)
);
endmodule

module chip(
input clk,
input rst_n,
input en,
inout pad,
output reg [2:0]led,
output reg [1:0]cnt
    );
    wire en_z;
    assign pad=1'bz;
    assign en_z=1'bz;

    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) led <= 0;
        else led <= {en_z, en, en_z & en};
    end 
    
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) cnt <= 0;
        else cnt <= cnt+~en_z;
    end
endmodule

仿真代码

module tb_top( );
reg clk = 0;
always #10 clk = ~clk;
reg rst_n;
reg en;
initial begin
    rst_n = 0;
    en = 0;
    #50 rst_n =1;
    #50 en = 1;
end
wire [2:0]led;
wire [1:0]cnt;
top u_top(
.clk(clk),
.rst_n(rst_n),
.en(en),
.led(led),
.cnt(cnt)
);
endmodule

综合后的原理图


电路内信号的状态只有0或1,看 l e d [ 2 ] _ I N S T _ 0 led[2]\_INST\_0 led[2]_INST_0 e n z _ 0 _ I N S T _ 0 enz\_0\_INST\_0 enz_0_INST_0 信号直接接地,此处信号被综合成0;但是后面, l e d _ O B U F [ 2 ] _ i n s t led\_OBUF[2]\_inst led_OBUF[2]_inst这是一个三态输出BUF。
至于 c n t cnt cnt寄存器因为忘了引出来则直接被优化掉了,通过输出BUF直接输出。

前仿真结果


注意 l e d [ 0 ] led[0] led[0]是不定态。后面要对比。

后仿真结果


对比两次仿真的结果,可以发现后仿真中不存在不定态。可以理解,毕竟要生成具体的电路所有的信号都要确定下来。
此时 l e d [ 0 ] led[0] led[0]变为1。结合代码,高组态和高电平想与,综合后的结果是高电平。
cnt寄存器因为被优化,默认高阻态。

结论

所有vivado 对于高阻态的优化是非常智能的。前仿真中确定是高阻态的输出的,会直接优化相关逻辑输出高阻态。前仿真时不定态的,会在综合后确定电路的状态,但是这个不定态如何确定请看第二节。

2,不定态

代码

和前面的代码相比,主要增加了与或非几个不同的操作。
源代码

module top(
input clk,
input rst_n,
input en,
output wire[6:0] led,
output wire[1:0] cnt  
);
chip rita(
    .clk(clk),
    .rst_n(rst_n),
    .en(en),
    .led(led)
);
endmodule

module chip(
input clk,
input rst_n,
input en,
inout pad,
output reg [6:0]led,
output reg [1:0]cnt
    );
    wire en_z;
    assign pad=1'bz;
    assign en_z=1'bx;

    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) led <= 0;
        else led <= {en_z,en, en_z&en,en_z|en, en_z & ~en, en_z|~en,~en_z};
    end 
    
    always@(posedge clk or negedge rst_n)begin
        if(!rst_n) cnt <= 0;
        else cnt <= cnt+~en_z;
    end
endmodule

仿真代码

module tb_top(

    );
reg clk = 0;
always #10 clk = ~clk;
reg rst_n;
reg en;
initial begin
    rst_n = 0;
    en = 0;
    #50 rst_n =1;
    #50 en = 1;
    #50 en = 0;
    #50 en = 1;
end
wire [6:0]led;
wire [1:0]cnt;
top u_top(
.clk(clk),
.rst_n(rst_n),
.en(en),
.led(led),
.cnt(cnt)
);

endmodule

综合后的原理图

前仿真结果


前仿真,含有大量的不定态,符合预期。

后仿真结果


后仿真不包含不定态,也符合预期。关键是不定态怎么消失的。
根据代码

可知,假定不定态和信号a进行逻辑操作。如果a不变化,结果为0保持不变。
当a变化后,结果发生变化。单独游逻辑X导致的,例如led[6]和led[0]会输出0;
x和信号a进行&和|操作,结果会和x信号a保持一致,就相当于没有进行&和|操作。

结论

不定态在后仿真中会被消除。单纯由不定态导致的输出,会变成0;和其他信号进行逻辑操作后的结果和其他信号保持一致。
后面又做了其他的实验,高阻态和其他逻辑操作的结果也是和其他信号保持一致。

3,cnt的情况说明

上面两个实验的代码中除了led外,还有cnt。cnt的行为似乎不符合我说的逻辑,其实是因为我代码写的时候。top里面例化chip的时候忘记把cnt引出来。。。。。。。大家无视它就好。

有关vivado 对高阻z和不定态x信号的处理的更多相关文章

  1. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  2. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  3. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

  4. ruby - 如何使用 Ruby HTTP::Net 处理 404 错误? - 2

    我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。

  5. ruby-on-rails - 使用 Ruby 正确处理 Stripe 错误和异常以实现一次性收费 - 2

    我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)

  6. ruby-on-rails - Rails 处理 .Erb 与 Nils - 2

    当profile为nil时,总是让我感到悲伤...我该怎么办? 最佳答案 在View中使用变量之前,始终检查变量是否为nil。我确信这个问题有更优雅的解决方案,但这应该能让您入门。 关于ruby-on-rails-Rails处理.Erb与Nils,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2709605/

  7. Verilog使用inout信号的方法 - 2

    目录一、inout在设计文件中的使用方法1.1、inout的第一种使用方法1.2、inout实现的第二种使用方法1.3、inout使用总结 二、inout在仿真测试中的使用方法一、inout在设计文件中的使用方法在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPIFlash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。1.1、inout的第一种使用方法  实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电

  8. ruby-on-rails - 如何在多个环境中处理 OmniAuth 回调? - 2

    我有一个应用程序专门使用Facebook作为身份验证提供程序,并正确设置了生产模式的回调。为了让它工作,您需要为您的Facebook应用程序提供一个站点URL和一个用于回调的站点域,在我的例子中是http://appname.heroku.com和appname。heroku.com分别。问题是我的Controller设置为只允许经过身份验证的session,所以我无法在开发模式下查看我的应用程序,因为Facebook应用程序的域显然没有设置为本地主机。如何在不更改Facebook设置的情况下解决这个问题? 最佳答案 创建另一个域l

  9. python - 请在 Perl 或 Ruby 中引入多处理库 - 2

    在python中,我们可以使用多处理模块。如果Perl和Ruby中有类似的库,你会教它吗?如果您能附上一个简短的示例,我将不胜感激。 最佳答案 ruby:WorkingwithmultipleprocessesinRubyConcurrencyisaMythinRubyPerl:HarnessingthepowerofmulticoreWhyPerlIsaGreatLanguageforConcurrentProgramming此外,Perl的线程是native操作系统线程,因此您可以使用它们来利用多核。

  10. ruby - 现代计算机的功能是否不足以处理字符串而无需使用符号(在 Ruby 中) - 2

    我读过的关于Ruby符号的每一篇文章都在谈论符号相对于字符串的效率。但是,这不是1970年代。我的电脑可以处理一些额外的垃圾收集。我错了吗?我拥有最新最好的奔腾双核处理器和4GBRAM。我认为这应该足以处理一些字符串。 最佳答案 您的计算机可能能够处理“一点点额外的垃圾收集”,但是当“一点点”发生在运行数百万次的内部循环中时呢?如果它在内存有限的嵌入式系统上运行呢?有很多地方你可以随意使用字符串,但在某些地方你不能。这完全取决于上下文。 关于ruby-现代计算机的功能是否不足以处理字符串

随机推荐