Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2548225
  • 博文数量: 320
  • 博客积分: 9650
  • 博客等级: 中将
  • 技术积分: 3886
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-27 21:05
文章分类

全部博文(320)

文章存档

2024年(1)

2017年(5)

2016年(10)

2015年(3)

2014年(3)

2013年(10)

2012年(26)

2011年(67)

2010年(186)

2009年(9)

分类: IT业界

2010-06-19 17:28:29

verilog assign语句的用法未解之谜

 

 

下面是功能相同但写法不同的两段代码:

1module assign_test (

                       clk,

                       lhold,

                       lholda

                   );

 

input clk;

input lhold;

output lholda;

 

reg lholda;

      always @(posedge clk)

            if (lhold)

               lholda<=lhold;

            else

               lholda<=0;

 

endmodule

                          

 

   未加入assign的综合结果

 

2module assign_test (

                       clk,

                       lhold,

                       lholda

                   );

 

input clk;

input lhold;

output lholda;

 

reg lholda_r;

      always @(posedge clk)

            if (lhold)

               lholda_r<=lhold;

            else

               lholda_r<=0;

   assign  lholda=lholda_r;

 

endmodule

                                

                                                 加入assign风格的综合结果

           


结论:两相比较,几乎没有差别。可又为什么经常采用(2)的风格来编写类似代码?

一些verilog书上说assign用在连续型赋值的场合,摘自某书籍——

“连续赋值语句用来驱动线型变量,这一线型变量必须已经事先定义过。只要输入端操作数的值发生变化,该语句就重新计算并刷新赋值结果。我们可以使用连续赋值语句来描述组合逻辑而不需要用门电路和互连线。在前面一节中已经对连续赋值做了介绍,关键词assign用来区分连续赋值语句和过程赋值语句,下面一条语句将线型变量int1int2相与,并用这一结果去驱动out信号:

wire out

assign  out= int1 & int2 ;”

现在我不解的是,为什么在使用寄存器赋值的场合(过程赋值)也用到了

             assign 端口=寄存器 ;”

 

望飘过的神仙、大牛、小牛们帮小弟解解惑,不胜感激了!

 

第1楼

我也是新手,我的看法是,2中只是多引了一下。是不是为了方便端口的分配?这样做的话可以先写内部程序,最后再决定把哪些量作为输出引出来。

欢迎指正。
 
第2楼
 
完全是代码风格问题,第一个写法也没有错,只不过第二种更重在要把FPGA内部的每一条连线都表示出来,对设计者来说就是做到每一条连线都在你的代码掌控之中。
阅读(12951) | 评论(1) | 转发(1) |
0

上一篇: $strobe $monitor $display

下一篇:Modelsim快捷键

给主人留下些什么吧!~~

dene452012-03-07 16:15:49

谢谢