原创 verilog assign语句的用法

2010-7-15 11:12 22083 17 20 分类: FPGA/CPLD

 


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


第一段A


module assign_test_a (
                       clk,
                       lhold,
                       lholda
);


input clk;
input lhold;
output lholda;


reg lholda;


always @(posedge clk)
if (lhold)
 lholda<=lhold;
else
 lholda<=0;


endmodule



第二段B
module assign_test_b (
                       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


 


 



第一段A分析


 


40dab907-613a-45c4-99cf-494ee4d29432.jpg


 



第二段B的分析


Quartus RTL图


0183797d-d87f-4288-a311-4ce6bcadfb22.jpg


  加入assign风格的综合结果



Xillinx RTL图


558b86c0-e9bc-4e6c-854d-57b394c67153.jpg


 


分析:


1. 从代码角度来看。 A是直接把内部reg信号做为输出,因此相对外部来说,外部信号引脚lholda没有选择的连接到reg输出信号。 这里其实暗含了用根导线直接把reg的输出与lholda连接起来。因此B代码就是把这个暗含的明显化。因此他们的RTL没有多大区别。
2. 从实用角度来说,这里的意义比较大。当内部有多个信号需要输出,可是输出引脚只有一个,那么这时就可以进行选择。如下:
assign  lholda= (条件)? (lholda_ra): lholda_rb;  可以嵌套使用。
   或者在这种情况下也非常有用。
     Lholda 与 内部的reg输出lholda_ra, lholda_rb,…., 存在逻辑函数关系。


 


58b5f967-8765-4494-82a5-5c29110d3409.jpg


 


df951d5b-5b63-4dcd-afc6-edf0edc68eea.jpg


 



附录:


两相比较,几乎没有差别。可又为什么经常采用(2)的风格来编写类似代码?
一些verilog书上说assign用在连续型赋值的场合,摘自某书籍——
“连续赋值语句用来驱动线型变量,这一线型变量必须已经事先定义过。只要输入端操作数的值发生变化,该语句就重新计算并刷新赋值结果。我们可以使用连续赋值语句来描述组合逻辑而不需要用门电路和互连线。在前面一节中已经对连续赋值做了介绍,关键词assign用来区分连续赋值语句和过程赋值语句,下面一条语句将线型变量int1和int2相与,并用这一结果去驱动out信号:
wire out ;
assign  out= int1 & int2 ;”
现在我不解的是,为什么在使用寄存器赋值的场合(过程赋值)也用到了
             “assign 端口=寄存器 ;”



module assign_test_c (
                       clk,
                       lholda,
        lholdb,
        select,
                       lhold
);



input clk;
input lholda;
input lholdb;
input select;


output lhold;



wire lhold_ra;
wire lhold_rb;


assign_test_a  uu1 (
                       .clk(clk),
                      . lhold(lholda),
                       .lholda(lhold_ra));


assign_test_a  uu2 (
                       .clk(clk),
                      . lhold(lholdb),
                       .lholda(lhold_rb));



 assign  lhold=(select)?lhold_rb:lhold_ra;



endmodule



 

文章评论3条评论)

登录后参与讨论

用户382800 2011-10-12 16:05

不错,收藏了!

用户1324552 2010-7-17 10:52

您说的正确,附录是我看了网友一篇文章,把他问的问题附在后面。

jlx_cuc 2010-7-16 21:39

你说的寄存器赋值是不准确的吧? 这里应该也只是叫做端口赋值啊,是将寄存器中的值赋予端口罢了,在电路中相当于把寄存器的输出直接连在了端口上。而前面所讲的连续赋值,便是将寄存器的输出经过某个组合逻辑运算后再连接到端口上。所以,寄存器的值始终是被操作数,并没有被赋值。
相关推荐阅读
用户1324552 2011-08-25 17:14
方波的傅立叶级数构成
  按照傅立叶级数分解方波, 从图可以看出,以后做仿真时,可以产生真实信号的时钟方波的信号.     1       2    3       附录源码 %周期信号(方波)的展开,fb_jin...
用户1324552 2010-12-20 16:10
采用 SMU200A 数字信号源实现极化调制
一、概述    在无线通信系统的发射机中,对于功率放大器的要求是高线性度和高功率转换效率。而传统类型的功率放大器,线性度和功率转换效率需折衷选择。对应于这样的需求,采用极化调制方式实现发射机得到了比较...
用户1324552 2010-12-20 15:43
IQ 调制小文
                   IQ 调制小文    在通信系统中,(语音信号)就是调制和解调所要传送的信息。而在数字通信系统中,传送的信息是数据。数字调制是将数据数据载在射频载波的过程,而解调...
用户1324552 2010-07-20 11:01
IIC总线ABC
IIC总线ABC      I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初...
用户1324552 2010-07-15 14:46
信号的IQ分解和信号差分传输
信号的IQ分解和信号差分传输  I/Q信号   I/Q信号是调制输入端为了提高频带利用率而设计的相位正交得两路信号。   在信号分析中,我们常把信号进行矢量分解,也就是将信号分解为频率相同、峰值幅度相...
我要评论
3
17
关闭 站长推荐上一条 /2 下一条