gerpayt 发表于 2014-3-14 22:04:52

小白问题,百思不得其解


为什么输出的b会和a一起变化,我觉得应该会在下一个上升沿才变化。
怎么解释呢?

sky5566 发表于 2014-3-14 22:22:29

下一個的方式
...............
else if (a) c<=1'b1'
else b<= c;

szghzhao 发表于 2014-3-14 22:35:05

小小白问楼主,这是c语言吗?51的,还是ARM的

Nuker 发表于 2014-3-14 22:51:15

你在激励里面将a置1的时间提前0.05us试试看,然后再试试其它时间看看

omityoung 发表于 2014-3-14 22:53:39

always 是并行的,同时执行两个if,不要用c来学verilog。想想电路一开通,所有部分都是同时运行。

cxhy 发表于 2014-3-15 09:13:50

szghzhao 发表于 2014-3-14 22:35
小小白问楼主,这是c语言吗?51的,还是ARM的

verilog                                          

lusson 发表于 2014-3-15 09:16:52

我猜:
因为你的a变化刚好在上升沿,所以b也跟着变了。
你试试在下降沿变化a

Luis_Li 发表于 2014-3-15 12:54:50

always 块里面没有见到有begin...end呢?你不加的话编译器就认为你的第二条语句不在这个always块里面啊。那么它就成了相当于一个组合逻辑。你加上begin...end就好了

RUANJI 发表于 2014-3-15 14:18:00

我也是小白。但是实际电路中,这个会出现亚稳态。

南孤雁2010 发表于 2014-3-17 20:43:23

<=是非阻塞赋值
=是阻塞赋值
这个你应该学习一下

sme 发表于 2014-3-18 10:01:23

你的理解没错,代码也没错。我猜出现这种情况的原因是,你的激励信号a没有使用clk同步。你试试将a和clk错开,就能看出你要的结果了。

zhangalex88 发表于 2014-3-18 12:43:07

楼上正解,把你的顶层module放上了看看就知道了。

gerpayt 发表于 2014-3-20 16:44:20

已解决
modelsim仿真的时候时序是不严格的,所以如果需要严格的时序,则激励需要严格按照先后来进行编写,比如a的变化是在clk之后的,则a变化之前要等待clk变化。
4楼说的也对。
激励更改一下

initial
begin
a = 1'b0;
#100
@(posedge clk);
a = 1'b1;
#20 $stop;
end

这样做就不会

Jach 发表于 2014-3-20 17:24:57

從模組看, a是一個非同步輸入. 把激勵改成同步來讓結果符合預期只是掩耳盜鈴的做法.

gerpayt 发表于 2014-3-20 21:14:37

Jach 发表于 2014-3-20 17:24
從模組看, a是一個非同步輸入. 把激勵改成同步來讓結果符合預期只是掩耳盜鈴的做法.
...

那正确的做法是什么呢

yuyu87 发表于 2014-3-20 21:22:13

if xx=xx
必须要加else,即不相等时,b的状态,

Jach 发表于 2014-3-21 13:57:17

gerpayt 发表于 2014-3-20 21:14
那正确的做法是什么呢

問題是: 你要的是甚麼? 一起變可以接受嗎? 下一個升緣再變嗎? 還是都可以?
页: [1]
查看完整版本: 小白问题,百思不得其解