明德扬论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫一扫,快捷登录!

查看: 5979|回复: 0

【FPGA至简设计原理与应用】第一篇 第三章硬件描述语言Verilog第4节信号类型

[复制链接]
发表于 2020-9-7 18:36:48 | 显示全部楼层 |阅读模式

马上注册,看完整文章,学更多FPGA知识。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本案例的编号为:001500000156,如果有疑问,请按编号在下面贴子查找答案:MDY案例交流【汇总贴】_FPGA-明德扬科教 (mdy-edu.com)
本文为明德扬原创及录用文章,转载请注明出处

大家好,近期我们会连载《FPGA至简设计原理与应用》一书,有兴趣的同学可以学习,也希望大家可以对我们的书提出宝贵的意见和建议。


FPGA至简设计原理与应用》书籍连载索引目录

http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=989


读过的朋友可积极在贴后留言,书籍正式出版时,我们会从留言者中挑选20位幸运读者,幸运读者可获潘老师亲笔签名书籍一本。

注:手机浏览可能格式会乱,建议用电脑端进行浏览。






第4节 信号类型

本文档编号:001100000037
需要看对应的视频,请点击视频编号:001100000052
1. 本节主要介绍,Verilog HDL的信号类型,主要包括两种数据类型:线网类型(net type)和寄存器类型(reg type),在进行工程设计中也只会使用到这两个类型的信号;信号位宽,定义信号类型的同时,必须定义好信号的位宽,取决于该信号要表示的最大值,例如a信号的最大值为1000,那么信号a的位宽必须大于或等于10位;线网类型wire,用于对结构化器件之间的物理连接的建模,代表的是物理连接线,不存储其逻辑值,通常用assign进行赋值;寄存器类型reg,通常用于对存储单元的描述,如D型触发器、ROM等。必须注意的是:reg类型的变量不一定是存储单元,如在always语句中进行描述的必须是用reg类型的变量;wire和reg的区别,本书总结出一套解决方法:在本模块中使用always设计的信号都定义为reg型,其他都定义为wire型。   
2. ALTERA和VIVADO文档



Verilog HDL的信号类型有很多种,主要包括两种数据类型:线网类型(net type) 和寄存器类型(reg type)。笔者在进行工程设计过程中,也是只会使用到这两个类型的信号。

4.1 信号位宽

    定义信号类型的同时,必须定义好信号的位宽。默认信号的位宽是1位,当信号的位宽为1时可不表述,如定义位宽为1wire型信号a可直接用“wire  a;”来表示。但信号的位宽大于1位时就一定要表示出来,如用“wire [7:0]”来表示该wire型信号的位宽为8位。
信号的位宽取决于要该信号要表示的最大值。该信号能表示的无符号数最大值是:2n-1,其中n
表示该信号的位宽。例如,信号a的最大值为1000,那么信号a的位宽必须大于或等于10位。
下面向读者分享一个位宽计算技巧:打开电脑的“计算器”后选用程序员模式,在在10进制下
输入信号值,如1000,随后可以查看信号位宽。

4.2 线网类型wire
    线网类型用于对结构化器件之间的物理连线的建模,如器件的管脚,芯片内部器件如与门的输出
等。由于线网类型代表的是物理连接线,因此其不存储逻辑值,必须由器件驱动。通常用assign 进行赋值,如 assign  A =  B ^ C。
wire 类型定义语法如下:
wire [msb: lsb] wire1, wire2, . . .,wireN;
  • msb和lsb定义了范围,表示了位宽。例如[7:0]是8位位宽,也就是可以表示成8’b0至8’b1111_1111;
  • msb和lsb必须为常数值;
  • 如果没有定义范围,缺省值为1位;
  • 没有定义信号数据类型时,缺省为wire 类型。
  • 注意数组类型按照降序方式,如[7:0] ,不要写成[0:7]。

下面对上述情况进行举例说明:
wire [3:0]   Sat; // Sat4 位线型信号
wire Cnt; //1 位线型信号
wire [31:0]   Kisp, Pisp, Lisp ;// Kisp, Pisp, Lisp 都是32位的线型信号。

4.3 寄存器类型reg
    reg 是最常用的寄存器类型,寄存器类型通常用于对存储单元的描述,如D型触发器、ROM 等。寄存器类型信号的特点是在某种触发机制下分配了一个值,在下一触发机制到来之前保留原值。但必须注意的是:reg 类型的变量不一定是存储单元,如在always语句中进行描述的必须是用reg 类型的变量。
reg 类型定义语法如下:
reg  [msb: lsb] reg1, reg2, . . . reg N;
  • msb和lsb定义了范围,表示了位宽。例如[7:0]是8位位宽,也就是可以表示成8’b0至8’b1111_1111;
  • msb和lsb必须为常数值;
  • 如果没有定义范围,缺省值为1位;
  • 没有定义信号数据类型时,缺省为wire 类型,不是reg型。
  • 对数组类型按照降序方式,如[7:0] ;不要写成[0:7]。
例如:
reg [3:0]   Sat; // Sat4 位寄存器。
reg Cnt; //1 位寄存器。
reg [32:1]  Kisp, Pisp, Lisp ; //不建议这样定义。

4.4 wirereg的区别
    reg型信号并不一定生成寄存器。针对什么时候使用wire类型,什么时候用reg类型这一问题,笔者总结出一套方法:在本模块中使用always设计的信号都定义为reg型,其他信号都定义为wire型。
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
always @(posedge clk or negedge rst_n)  begin
  
     if (rst_n==0) begin
  
         cnt1 <= 0;
  
     end
  
     else if(add_cnt1) begin
  
         if(end_cnt1)
  
            cnt1 <= 0;
  
         else
  
            cnt1 <= cnt1+1 ;
  
    end
  
end
  
assign add_cnt1 = end_cnt0;
  
assign end_cnt1 = add_cnt1  && cnt1 == 8-1 ;
   
    上述代码中,cnt1是用always设计的,所以定义为reg型。add_cnt1end_cnt不是由always产生的,所以定义为wire型。

1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
always   @(*)begin
  
     if(cnt2==0)
  
         x = 475_000;
  
     else if(cnt2==1)
  
         x = 425_000;
  
     else if(cnt2==2)
  
         x = 350_000;
  
     else if(cnt2==3)
  
         x = 250_000;
  
     else if(cnt2==4)
  
         x = 100_000;
  
     else if(cnt2==5)
  
         x = 100_000;
  
     else if(cnt2==6)
  
         x = 250_000;
  
     else if(cnt2==7)
  
         x = 350_000;
  
     else if(cnt2==8)
  
         x = 425_000;
  
     else
  
         x = 475_000;
  
end

    上述代码中,信号x是用always设计的,所以要定义为reg型。注意:实际的电路中信号x不是寄存器类型,但仍然定义为reg型。

1
  
2
  
3
  
4
  
5
  
6
  
7
QamCarrierQAM_Sync_inst(
  
.clk       ( clk_8            ),
  
.rst_n     ( rst_n            ),
  
.din       ( data_buff        ),
  
.di        ( Sync_Thre_real_i ),
  
.dq       ( Sync_Thre_imag_q ),
  
.df        ( df               ));

以上是例化的代码,其中df是例化模块的输出。由于df不是由always产生的,而是例化产生的,因此要定义成wire型。



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|MDYBBS ( 粤ICP备16061416号 )

GMT+8, 2024-4-20 23:08 , Processed in 0.072686 second(s), 31 queries .

Powered by Discuz! X3.4

本论坛由广州健飞通信有限公司所有

© 2001-2019 Comsenz Inc.

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