always@下面begin... end 里面不一定是顺序执行吧 ?
本帖最后由 atom100 于 2018-1-22 15:31 编辑看到一个资料,
说 begin.........end
是一个顺序语句块,
然后always@(触发条件)
begin
........
end
在 非阻塞条件下,beginend里的语句一定不是顺序执行吧 ?
如果这种 beginend内的语句不是顺序执行,为何 又将beginend统称未顺序语句块 ? 这是阻塞赋值条件下相对fork……join而言。
阻塞赋值条件下,begin……end是顺序执行,所以叫顺序语句块;
fork……join是并行执行,所以叫并行语句块。 Verilog标准规定,begin - end之间的表达式是按照书写顺序求值的。 我的理解是在:always@(触发条件)
begin
........
end
的非阻塞语句中,分前半段和后半段。在前半段是顺序执行的,后半段里面也是顺序执行的。
望高手纠正。。。。 切记:HDL是“硬件描述语言”, 不是程序, 没有执行的概念
HDL与电路图等效的。你能说“电路图”能执行么。 楼主VERILOG 分可综合和不可综合之分。可综合得代码生成到FPGA里 就是生成一个电路图, 电路图在同一个时钟得驱动下, 在不考虑信号线长短等问题时 你说是顺序执行还是并行执行 roasn 发表于 2018-1-22 15:45
这是阻塞赋值条件下相对fork……join而言。
阻塞赋值条件下,begin……end是顺序执行,所以叫顺序语句块;
...
这么理解好理解一点,也可以想成always下begin..end是(),执行顺序看是阻塞语句还是非阻塞语句 就是个()具体看里面写了啥不能一概而论 本帖最后由 atom100 于 2018-2-2 14:48 编辑
ackyee 发表于 2018-1-23 22:46
楼主VERILOG 分可综合和不可综合之分。可综合得代码生成到FPGA里 就是生成一个电路图, 电路图在同一个 ...
begin。。。end之间的 代码
如果被理解为并行执行的 电路, 是可以用门电路搭建出一个电路与该代码对应的,
如果被理解为串行执行的 电路,也是可以用门电路搭建出一个电路与该代码对应的,这个没问题吧?
假如代码的赋值方式是非阻塞赋值的情况下, 被一个人(而不是综合器) 错误的理解为串行执行的,那也可以搭出一个对应的串行电路吧?
不太明确的地方是:为何verilog,在非阻塞的情况下,要用begin。。。end (教科书中已经写明了 之间的是顺序执行的)类型的代码来表示一个并行的电路 ? atom100 发表于 2018-2-2 14:45
begin。。。end之间的 代码
如果被理解为并行执行的 电路, 是可以用门电路搭建出一个电路与该代码 ...
楼上有个人说的很对,在用VERILOG写FPGA代码的时候,你就直接当begin end 是()实际使用的时候 确实只要当它是括号就行了。 你现在看到的很多VERILOG都是刚进入中国时候 几个学者写的,那个时候 甚至他们连FPGA都没怎么摸过吧 然后几个少数的教材就被慢慢当作经典教材然后新教材又不断的参考老教材。
其实很好理解呀, 楼主有用过74hc164么 还有74hc595 这两颗都是 串转并的转换芯片, 一个带锁存器一个不带锁存器。 其实阻塞赋值和非阻塞赋值就可以当作 带锁存跟不带锁存的区别。带锁存并且锁存由时钟驱动, 和不带锁存进来信号直接输出就这么简单 英文 原版 里 begin。。。end 之间的代码也被 写成是串行了吗 ? 一般来说,begin...end之间的代码描述了一个D触发器。阻塞/非阻塞并不是并行/串行的意思。
简单的说,非阻塞逻辑,取的值来自D触发器的输入侧,是纯粹的组合逻辑。
阻塞逻辑,取的值来自D触发器的输出端。是时序逻辑。 putty 与ackyee 我觉得说的都挺好的 解释清楚了,就是要看内部的语句。 {:smile:}受教了 受教了,我一直当luoh
页:
[1]