搜索
bottom↓
回复: 15

新手提问,关于综合的Verilog语法问题

[复制链接]

出0入42汤圆

发表于 2012-1-18 00:46:26 | 显示全部楼层 |阅读模式
网上几乎都流传着,要在always的敏感量写该always包含的全所有有值,否则,你会发现综合器会帮你写.
那么,假如我要在clk边沿对多个输入采样,那岂不是搞成异步的咯? 那要实现我原本的逻辑该怎么搞呢?
目前只放了clk进去
        always @ (negedge rst_n or posedge clk) begin
....blabla....

                else begin
                        sig <= ~sig;
                        cnt <= cnt + 9'd1;
                        if (puls_p) begin
                                if (!last_p) begin
                                        num_puls = num_puls + 8'sd1;
                                        shift_out = shift_out + 16'sd1;
                                end
                        end
...

仿真(门级)显示仅仅当clk的时候才进入该always, 和理论吻合,但和网上流传的经验不吻合. 实际和门级仿真吻合.
使用always* 后仿真显示快速反复进入always,而不像传说的自动添加敏感量.
======看起来Quartus并没有偷偷为我添加敏感量.========


流传还说,== != 不可以综合, 那么要做一个计数器分频该怎么搞呢?
可是我使用了==比如 计数器溢出到0的时候: if (xxx == x'd0) blablabla
看起来也工作得很好呢?!


到底哪些不可以综合?
我知道多过程对同一个变量赋值不可以, 对敏感量做非边沿的(比如敏感量上升沿,但在内部判断下降沿会出错) 判断不可以
分支对非敏感量做if的时候,如果让该if为true的敏感量有多个(走到if分支前没有限定死),似乎就会出错。 感觉综合器实现了一个触发器,如果该锁存器需要不止一个个时钟,就会报错。


等高手解答, 感觉Verilog语法不难,综合不简单啊。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入42汤圆

 楼主| 发表于 2012-1-18 01:12:53 | 显示全部楼层
最想要的是进入always以后,如何知道是哪个敏感量干的? 里面的if只能判断点评,不太够用。
假设我同时两个异步触发,A做加法计数,B做减法计数。
通过always @ (posedge A or posedge B) begin
进来以后不知道该怎么办了...

出0入0汤圆

发表于 2012-1-18 09:12:51 | 显示全部楼层
不懂Verilog
以下是借用ISE里的范例


--同步复位
   reg [<upper>:0] <reg_name>;
   
   always @(posedge <clock>)
      if (!<reset>)
         <reg_name> <= 0;
      else if (<clock_enable>)
         if (<load_enable>)
            <reg_name> <= <load_signal_or_value>;
         else if (<up_down>)
            <reg_name> <= <reg_name> + 1;
         else
            <reg_name> <= <reg_name> - 1;
                                       
  --异步复位
   reg [<upper>:0] <reg_name>;
   
   always @(posedge <clock> or negedge <reset>)
      if (!<reset>)
         <reg_name> <= 0;
      else if (<clock_enable>)
         if (<load_enable>)
            <reg_name> <= <load_signal_or_value>;
         else if (<up_down>)
            <reg_name> <= <reg_name> + 1;
         else
            <reg_name> <= <reg_name> - 1;

出0入0汤圆

发表于 2012-1-18 09:19:02 | 显示全部楼层
LZ听到的“流传”还真是多,还真是离谱.
首先,写硬件代码的要清楚写的代码到底会生成怎么样的逻辑电路。
根本上来说,如果写的代码不能生成逻辑电路,那么就不可综合。
比如 a <= #10 b; 延时就是不可综合的,只是方便仿真用的。
再比如 initial 用来初始化,但实际电路的寄存器初始值往往是无法确定的,只能用复位(预置位)的方式保证初始值。

什么信号要写入always敏感信号列表里,首先要弄清楚什么是敏感信号。
一般来说,时序的敏感信号是时钟和复位;组合逻辑的敏感信号是所有输入信号。

出0入0汤圆

发表于 2012-1-18 10:17:10 | 显示全部楼层
不懂,一直是VHDL的。

出0入42汤圆

 楼主| 发表于 2012-1-18 13:32:14 | 显示全部楼层
回复【3楼】usingavr  
lz听到的“流传”还真是多,还真是离谱.
首先,写硬件代码的要清楚写的代码到底会生成怎么样的逻辑电路。
根本上来说,如果写的代码不能生成逻辑电路,那么就不可综合。
比如 a &lt;= #10 b; 延时就是不可综合的,只是方便仿真用的。
再比如 initial 用来初始化,但实际电路的寄存器初始值往往是无法确定的,只能用复位(预置位)的方式保证初始值。
什么信号要写入always敏感信号列表里,首先要弄清楚什么是敏感信号。
一般来说,时序的敏感信号是时钟和复位;组合逻辑的敏感信号是所有输入信号。
-----------------------------------------------------------------------
网上有一篇所谓的能综合的RTL子集... 看完渗得慌.

一般来说,时序的敏感信号是时钟和复位;
这句话让我放心不少.

不过话说处理多个异步信号是不是本身就比较棘手? 他们控制的reg又相互牵扯,不能做到两个always里面. 昨晚试了试,还是没法判断出谁的边沿到了,而且always反复触发了.

新手,一小段代码就花掉100个LE,感觉一片240也不经用呢...

出0入0汤圆

发表于 2012-1-18 13:45:38 | 显示全部楼层
回复【楼主位】albert_w  
-----------------------------------------------------------------------

LZ在一个always块里混用阻塞和非阻塞赋值,看不懂想干啥
先描述下你想实现个什么样的功能吧

出0入17汤圆

发表于 2012-1-18 16:15:22 | 显示全部楼层
LZ还是先看看官方的Coding指南吧,虽然花时间,但是还是值得的。

点击此处下载 ourdev_713734LBNHZW.pdf(文件大小:2.04M) (原文件名:Altera的代码规范Verilog Coding Style Proposal.pdf)

点击此处下载 ourdev_713736RTNSZB.pdf(文件大小:536K) (原文件名:Qts_QII51007.pdf)

出0入42汤圆

 楼主| 发表于 2012-1-18 17:22:51 | 显示全部楼层
非常感谢楼上各位的帮助!

回无机酸
这是我写的第三个模块,大学写了一个,再写了个hello quartus.
这个模块想用来计数. 两个脉冲输入,p脉冲计数器+1, n脉冲-1, 同时计算出最后一个脉冲的频率(不好搞,弄成100个clk内计算脉冲的代数和了),以及最后的脉冲总数代数和. 其实就是计算速度和位移的.
本来都想非阻塞的,但部分代码之间有先后关系(比如+1,然后送到端口),无奈只得把这部分改成阻塞,于是弄出楼顶的四不像了.!

谢谢Nuker  下载来,找时间学习学习.

出0入0汤圆

发表于 2012-1-18 22:42:18 | 显示全部楼层
回复【8楼】albert_w  
-----------------------------------------------------------------------

东西不多却涉及三个时钟域,有点小麻烦
比较严谨的方法是,写三个always块,分别对p、n和clk敏感
在p和n的块里各自进行格雷码计数
在clk的块里对p和n的计数值同步后解码求差
另外要注意溢出和亚稳态等细节问题

如果clk频率比p和n高四倍以上,可以用clk对p和n采样后同步计数,结构会简单一些。

出0入42汤圆

 楼主| 发表于 2012-1-18 23:41:41 | 显示全部楼层
回复【9楼】h2feo4  无机酸
回复【8楼】albert_w  
-----------------------------------------------------------------------
东西不多却涉及三个时钟域,有点小麻烦
比较严谨的方法是,写三个always块,分别对p、n和clk敏感
在p和n的块里各自进行格雷码计数
在clk的块里对p和n的计数值同步后解码求差
另外要注意溢出和亚稳态等细节问题
如果clk频率比p和n高四倍以上,可以用clk对p和n采样后同步计数,结构会简单一些。
-----------------------------------------------------------------------
现在就是提高clk快速采样来实现的,总感觉有点别扭哈哈. 本意是想分开来做成异步的,clk只拿来提供一个计时基准,做起来不太容易. 回头用你说的方法写写看.

出0入0汤圆

发表于 2012-1-18 23:56:39 | 显示全部楼层
记号

出0入17汤圆

发表于 2012-1-19 01:25:24 | 显示全部楼层
回复【1楼】albert_w
最想要的是进入always以后,如何知道是哪个敏感量干的? 里面的if只能判断点评,不太够用。
假设我同时两个异步触发,a做加法计数,b做减法计数。
通过always @ (posedge a or posedge b) begin
进来以后不知道该怎么办了...
-----------------------------------------------------------------------

假如A和B的升沿以及clk的升沿同时来到,是否违反时序要求?实际应用中这种情况是否会发生?

出0入42汤圆

 楼主| 发表于 2012-1-19 02:10:18 | 显示全部楼层
回复【12楼】Nuker  
回复【1楼】albert_w
最想要的是进入always以后,如何知道是哪个敏感量干的? 里面的if只能判断点评,不太够用。
假设我同时两个异步触发,a做加法计数,b做减法计数。
通过always @ (posedge a or posedge b) begin
进来以后不知道该怎么办了...
-----------------------------------------------------------------------
假如a和b的升沿以及clk的升沿同时来到,是否违反时序要求?实际应用中这种情况是否会发生?

-----------------------------------------------------------------------
a或b和时钟很有可能同时,ab一般不会同时出现。这个双时钟域异步还没想好怎么做

出0入0汤圆

发表于 2012-1-19 14:19:40 | 显示全部楼层
先想好你的功能用什么样的电路能实现,再考虑怎么用代码描述你的电路。
对两个时钟敏感的always块在绝大部分情况下都是非法的,如果不是时钟而是异步set、reset或load倒是可以

出0入0汤圆

发表于 2014-5-4 21:24:41 | 显示全部楼层
你好,你给我留言了,可是我没有权限回复你,只能在这里给你留言,我的qq 41747523
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表