实验较为简单,考虑到的情况不多。经验仅供参考。如果发现反例,欢迎评论一起探讨
最近在做关于FPGA原型验证,不清楚代码中的高阻z和不定态x会被映射成什么样的电路。会不会导致前仿真和综合后仿真的结果不一致。所以自己做了个验证。
先附上用来验证的源代码和仿真代码。
代码结构比较简单,
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 对于高阻态的优化是非常智能的。前仿真中确定是高阻态的输出的,会直接优化相关逻辑输出高阻态。前仿真时不定态的,会在综合后确定电路的状态,但是这个不定态如何确定请看第二节。
和前面的代码相比,主要增加了与或非几个不同的操作。
源代码
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;和其他信号进行逻辑操作后的结果和其他信号保持一致。
后面又做了其他的实验,高阻态和其他逻辑操作的结果也是和其他信号保持一致。
上面两个实验的代码中除了led外,还有cnt。cnt的行为似乎不符合我说的逻辑,其实是因为我代码写的时候。top里面例化chip的时候忘记把cnt引出来。。。。。。。大家无视它就好。
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
我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby-vips的github页面上的链接,我们将不胜感激!如果有ruby-
我有一个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
我正在尝试解析网页,但有时会收到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这将打印状态码和正文。
我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)
当profile为nil时,总是让我感到悲伤...我该怎么办? 最佳答案 在View中使用变量之前,始终检查变量是否为nil。我确信这个问题有更优雅的解决方案,但这应该能让您入门。 关于ruby-on-rails-Rails处理.Erb与Nils,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2709605/
目录一、inout在设计文件中的使用方法1.1、inout的第一种使用方法1.2、inout实现的第二种使用方法1.3、inout使用总结 二、inout在仿真测试中的使用方法一、inout在设计文件中的使用方法在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPIFlash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。1.1、inout的第一种使用方法 实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电
我有一个应用程序专门使用Facebook作为身份验证提供程序,并正确设置了生产模式的回调。为了让它工作,您需要为您的Facebook应用程序提供一个站点URL和一个用于回调的站点域,在我的例子中是http://appname.heroku.com和appname。heroku.com分别。问题是我的Controller设置为只允许经过身份验证的session,所以我无法在开发模式下查看我的应用程序,因为Facebook应用程序的域显然没有设置为本地主机。如何在不更改Facebook设置的情况下解决这个问题? 最佳答案 创建另一个域l
在python中,我们可以使用多处理模块。如果Perl和Ruby中有类似的库,你会教它吗?如果您能附上一个简短的示例,我将不胜感激。 最佳答案 ruby:WorkingwithmultipleprocessesinRubyConcurrencyisaMythinRubyPerl:HarnessingthepowerofmulticoreWhyPerlIsaGreatLanguageforConcurrentProgramming此外,Perl的线程是native操作系统线程,因此您可以使用它们来利用多核。
我读过的关于Ruby符号的每一篇文章都在谈论符号相对于字符串的效率。但是,这不是1970年代。我的电脑可以处理一些额外的垃圾收集。我错了吗?我拥有最新最好的奔腾双核处理器和4GBRAM。我认为这应该足以处理一些字符串。 最佳答案 您的计算机可能能够处理“一点点额外的垃圾收集”,但是当“一点点”发生在运行数百万次的内部循环中时呢?如果它在内存有限的嵌入式系统上运行呢?有很多地方你可以随意使用字符串,但在某些地方你不能。这完全取决于上下文。 关于ruby-现代计算机的功能是否不足以处理字符串