VHDL的数据对象(学习笔记1)

VHDL语言数据对象

VHDL语言学习笔记(一):数据对象
内容:本文主要介绍VHDL语言的三种主要数据对象,即常量(constant)、变量(variable)和信号(signal)。



一、 常量

在VHDL程序中,一经定义数值就不再发生变化的量就是常量。在硬件物理意义上,其表示为硬件电路中的电源或地线。
常量可以在程序包、实体声明、结构体声明和语句的声明部分中进行声明,常量定义语句所允许的设计单元有实体、结构体、程序包、块、进程和子程序。不同部分声明的常量具有不同的作用范围。

常量声明的语言结构:

CONSTANT  常量名 [,  常量名...]  :  数据类型  :=  表达式;
  • “CONSTANT”是用来表示常量的保留字,用来声明一个常量;
  • “[]”中的内容表示可选项,即多个相同数据类型的常量可以一起声明;
  • 数据类型是对象所具有的类型;
  • 表达式用来对常量进行赋值,其赋值符号为“:=”。

常量声明示例:

CONSTANT    PI   :  REAL     := 3.14;
CONSTANT    NUM  :  INTEGER  := 6;
CONSTANT    DELAY  :  TIME   := 7ns;

注意:

  • 常量定以后不允许修改;
  • 使用时要注意常量的作用范围。

二、变量

变量是指在设计实体中值会发生变化的量。变量主要是对临时数据进行局部存储,只能在进程语句、过程语句和函数语句的声明部分中使用。变量的赋值是理想化的数据传输,是立即发生、不存在任何延时的行为。

变量声明结构:

VARIABLE    变量名 [, 变量名...]    : 数据类型  [:= 初始值]
  • “VARIABLE”是用来表示变量的保留字,用来声明一个变量;
  • “[:= 初始值]”用来对变量进行初始赋值操作,其中“:=”为赋值符号。

变量声明示例:

VARIABLE  vA : INTEGER  0 TO 15 ;  --声明了一个取值范围为0~15的整数类型变量
VARIABLE  vB, vC  : INTEGER :=2 ;  --声明了两个初始值为2的整数类型变量
VARIABLE  vC  : STD_LOGIC  := '1' ;  --声明了一个初始值为1的标准位逻辑类型变量

变量注意事项:

  • 变量为局部量,仅限于在定义了变量的进程、过程或子程序的顺序语句中使用;
  • 如果变量没有赋予初始值,那么它将取默认值,即指定的数据类型的最左值或最小值。

变量的赋值结构:

目标变量名 := 表达式;
  • 赋值语句右侧的“表达式”与目标变量必须为同一数据类型;
  • 表达式可以为运算表达式,也可以是一个数值;
  • 新变量值的获得是直接的、立即发生的;
  • 目标变量可以是单值变量,也可以是变量集合,如位矢量类型的变量。

变量赋值示例:

VARIABLE  vA, vB  : REAL ;  --定义了实数类型变量
VARIABLE  vC, vD  : STD_LOGIC_VECTOR (7 DOWNTO 0);  --定义了位矢量类型变量

vA := 10.0 ;
vB := vA + 6 ;
vC := "11010101" ;
vD (0 TO 6) := vC (1 TO 7) ;  --段赋值

三、信号

信号时设计实体之间动态交换数据的一种手段,其物理意义类似于电路内部的连接线。信号可以看做是数值的容器,它不但可以容纳当前值,也可以保持历史值。

信号声明结构:

SIGNAL  信号名 [, 信号名...]  :  数据类型 [:= 初始值] ;

信号声明示例:

SIGNAL  sA : STD_LOGIC := '1' ;  --声明一个初始值为‘1’的标准逻辑信号
SIGNAL  sB : BIT ;  --声明了一个位信号
SIGNAL  sC : STD_LOGIC_VECTOR ( 15 DOWNTO 0 ) ;  --声明了一个标准位矢量信号

信号初始值的设置不是必需的,而且初始值仅在VHDL的行为仿真中有效。与变量相比,信号的硬件特性更明显,它具有全局性特性。比如,在程序包中定义的信号,对于所有调用此程序包的设计实体都是可见的;在实体中定义的信号,在其对应的结构体中都可见。
注意,在进程和子程序的顺序语句中不允许定义信号。

信号的赋值结构:

目标信号名 <= 表达式 ;

数据信号的传入可以设置延时,即便延时设置为0,目标信号的数据传入也不是零延时的。因此,符号"<="两边的数值并不一定总是一致的。
在进程中,允许同一个信号有不同驱动源,即同一个目标信号可以被多个表达式赋值,但是只有最后一个赋值语句会被执行。


总结

本文信息源自数据和网络。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
小数分频器是一种常见的电路,能够将输入时钟信号分频为一个小于1的分数。VHDL是硬件描述语言,可以用于设计数字电路。下面是一个小数分频器的VHDL实现。 ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Fractional_Divider is Port ( CLK_IN : in STD_LOGIC; CLK_OUT : out STD_LOGIC; EN : in STD_LOGIC; RST : in STD_LOGIC; N : in UNSIGNED(9 downto 0); D : in UNSIGNED(9 downto 0)); end Fractional_Divider; architecture Behavioral of Fractional_Divider is signal counter : UNSIGNED(9 downto 0) := (others => '0'); signal div : UNSIGNED(19 downto 0) := (others => '0'); signal clk_div : STD_LOGIC := '0'; begin process (CLK_IN, RST) begin if (RST = '1') then counter <= (others => '0'); div <= (others => '0'); clk_div <= '0'; elsif rising_edge(CLK_IN) then if (EN = '1') then counter <= counter + 1; if (counter = (D - 1)) then counter <= (others => '0'); div <= div + N; clk_div <= not clk_div; end if; end if; end if; end process; CLK_OUT <= clk_div; end Behavioral; ``` 这个小数分频器的输入是一个时钟信号`CLK_IN`,还有一个使能信号`EN`和复位信号`RST`。输出是分频后的时钟信号`CLK_OUT`。`N`和`D`分别是分子和分母,用于计算分数。 在`process`中,首先根据复位信号清空计数器和除数寄存器以及分频后的时钟信号。然后在时钟上升沿触发时,如果使能信号为1,则将计数器加1。当计数器计数到D-1时,说明经过了D个时钟周期,需要对除数寄存器加上分数N,并将计数器清零。同时,分频后的时钟信号取反。 最后将分频后的时钟信号赋值给输出端口`CLK_OUT`即可。 这是一个简单的小数分频器的VHDL实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值