waferhit 发表于 2019-5-8 15:02:24

verilog中always 和 if语句中的条件问题兼容的问题?

本人刚入手,写一个小的CPLD项目,以前主要是写C程序。CPLD用Verilog写的,但是调试经验比较少,在项目调试中,碰见一个奇怪的问题,请教下论坛里比较有经验的前辈。

测试条件如下:条件:quartus ii 12.0. CPLD/5M570系列,clk时钟40MHz。 count_r为 9位宽。

问题现象如附件图片及描述。

主要是想问,三个图片为什么会出现不同的结果?按逻辑来讲,应该都是一样的呀。

dukelec 发表于 2019-5-8 15:19:00

一个 always@ 不了那么多 posedge 和 negedge, 只能一个时钟,和一个可选的复位。
你写代码的时候,要联想到实际的硬件电路,一开始联想不到,可以多看软件综合之后的电路。

waferhit 发表于 2019-5-8 15:40:34

dukelec 发表于 2019-5-8 15:19
一个 always@ 不了那么多 posedge 和 negedge, 只能一个时钟,和一个可选的复位。
你写代码的时候,要联想 ...

非常感谢回答,但是如果@不了那么多条件,为什么编译时,不报错呢? 还是我理解的不对?

dukelec 发表于 2019-5-8 15:43:59

waferhit 发表于 2019-5-8 15:40
非常感谢回答,但是如果@不了那么多条件,为什么编译时,不报错呢? 还是我理解的不对? ...

估計有報警告吧,你對比下。

谭春林 发表于 2019-5-8 16:21:13

本帖最后由 谭春林 于 2019-5-8 16:37 编辑

你这么写很奇怪,为何不把另外两个always里的敏感信号作为使能信号呢

waferhit 发表于 2019-5-8 16:34:36

谭春林 发表于 2019-5-8 16:21
你这么写很奇怪,为何把另外两个always里的敏感信号作为使能信号呢

我这只是测试用的,后面两个其实是其他模块计算结果(这里为了说明问题,把后两个信号直接拉到一个固定电平)。
本意是 希望在后两个信号下降沿或上升沿的时候,在这里计算其他结果。 但不想再写一个边沿检测语句,直接借用always来检测沿,结果就出现这中现象了!

get500wan 发表于 2019-5-8 18:17:56

仔细看看综合报告,看看有没有其他警告提示信息。只有3的写法是对的。个人感受,学习使用hdl,最好是按照所期望电路的标准模版来写,综合工具才能生成期望的逻辑电路。

get500wan 发表于 2019-5-8 18:21:44

2的写法,猜测可能会把除复位在,其他三个信号组合逻辑做时钟,组合逻辑输出有毛刺,导致计数频率增加。

get500wan 发表于 2019-5-8 18:33:58

1的写法,会不会是因为portBTRIP_r的复位值为1,导致另外3个信号的组合逻辑时钟为常电平了,没有时钟沿,计数器就不会加1。

waferhit 发表于 2019-5-9 09:15:27

get500wan 发表于 2019-5-8 18:33
1的写法,会不会是因为portBTRIP_r的复位值为1,导致另外3个信号的组合逻辑时钟为常电平了,没有时钟沿,计 ...

感谢回答,还是似懂非懂!

kebaojun305 发表于 2019-5-9 10:38:40

waferhit 发表于 2019-5-8 15:40
非常感谢回答,但是如果@不了那么多条件,为什么编译时,不报错呢? 还是我理解的不对? ...

因为语法没错,综合的时候估计会有警告,D触发器 本身没有那么触发信号的,想要多个触发信号只能外部加逻辑运算,这个逻辑运算 最好自己在外部写,反而通俗易懂。(你可以看看你综合后的一个逻辑图,估计好明白点)

fakeCode 发表于 2019-5-9 11:16:40

本帖最后由 fakeCode 于 2019-5-9 11:19 编辑

你这个学习路数,跟学C着了谭大师的道一样,天天在那里搞优先级,学*p++, *(p++) 的差别,最后一个能用的程序都写不出来.先搞懂FPGA流程,明白各流程在干啥,然后搞懂什么语句会综合出什么电路(同一段代码不同的综合工具综合出来都有差异,综合工具本身也在进化),不要按你自己的想法去猜会综合成什么,而是要按综合工具的规则来,事实上可以说你是先有电路后有代码,只是把电路按综合工具的规则用代码表示出来,所以读一下综合工具的这方面的文档.最后按设计原则来写代码,可以避免无数没有意义的坑.有问题,欢迎到hifpga.com交流.

ackyee 发表于 2019-5-9 12:53:52

1-2的写法很可能触发的条件都进不去

minier 发表于 2019-5-9 13:12:59

硬件描述不是编程序,这个代码没有考虑实际电路的情况,即使编译通过也不会综合出电路

waferhit 发表于 2019-5-9 14:25:09

fakeCode 发表于 2019-5-9 11:16
你这个学习路数,跟学C着了谭大师的道一样,天天在那里搞优先级,学*p++, *(p++) 的差别,最后一个能用的 ...

是的,这个编程和C语言很不一样。 只是像这些现有电路,后有程序的,确实是经验不够,查了很多资料也没有明确。

虽然我也知道这个道理,但是没碰到问题以前,确实也没法预料到。

像这种弯路,也不知道从哪学习,能少走点,书上的例程都不会提到这些点!或者我看得资料都缺乏这方面的阐述。

jarodzz 发表于 2019-5-9 14:41:20

waferhit 发表于 2019-5-9 14:25
是的,这个编程和C语言很不一样。 只是像这些现有电路,后有程序的,确实是经验不够,查了很多资料也没有 ...

可以看一下這些,你可以用keyword: "Synthesizable RTL" 去找資料。
https://www.xilinx.com/support/documentation/sw_manuals/xilinx2018_3/ug901-vivado-synthesis.pdf
我記得以前xilinx還有一個 coding guide document,裡面講的就要什麼電路就怎麼寫的方式,連 synthesizeable memory rtl 都有。


waferhit 发表于 2019-5-9 14:54:42

jarodzz 发表于 2019-5-9 14:41
可以看一下這些,你可以用keyword: "Synthesizable RTL" 去找資料。
https://www.xilinx.com/support/doc ...

非常感谢,回头我去看看去!
页: [1]
查看完整版本: verilog中always 和 if语句中的条件问题兼容的问题?