VHDL学习笔记

IF clk’Event AND clk =‘1’ THEN

1.if clk'EVENT AND clk = '1' THEN 这样的语句通常用于描述时钟边缘触发的逻辑,特别是在同步数字电路设计中。这种语句的目的是在时钟信号(clk)的上升沿执行某些操作。这部分检测clk信号上的任何事件,即clk信号的任何变化,无论是从低到高(上升沿)还是从高到低(下降沿)。在VHDL中,EVENT属性用于检测信号的变化。

 2.别名是指向一个数据对象的部分可替代标识符,对这个标识符的操作相当于被替换数据对象的操作。别名的声明格式如下:

ALIAS 别名名称:别名的数据类型 IS 数据对象;

对别名的应用举列如下:

VARIABLE addr:STD_LOGIC_VECTOR(7 downto 0);
VARIABLE data:STD_LOGIC_VECTOR(15 downto 0);
ALIAS myaddr STD_LOGIC_VECTOR (7 downto 0) IS addr; --声明一个别名myaddr指向addr
ALIAS udata:STD_LOGOC_VECTOR (7 downto 0) IS data(15 downto 8);
                                                --声明一个别名udata指向data的高8位
ALIAS ldata:STD_LOGOC_VECTOR (7 downto 0) IS data(7 downto 8);
                                                --声明一个别名udata指向data的低8位
myaddr:="01010111"; --相当于对addr赋值
udata:="11112222"; --相当于对data的高8位赋值
ldata:="22222333"; --相当于对data的低8位赋值

3.数据类型:

标量(Scalar):标量类型的数据只有一个存储单元,有具体的数值大小,主要包括枚举类型(Eumeration)、整数类型(INTEGER)、物理类型(Physical)和浮点类型(Real)。枚举型又包括字符(Character)、位(BIT)和布尔型(BOOLEAN)等,物理型常用的有时间型(TIME)。

枚举型的元素有大小之分,枚举型值的大小通过声明时的顺序确定,例如下所示的OP的add>sub>mul>div.

TYPE OP IS(add,sub,mul,div);
TYPE logic IS('0','1','Z','X');

3.1约束性数组:

TYPE data IS ARRAY(7 downto 0)  OF BIT;
TYPE bus IS ARRAY(0 to 7) OF BIT;
--使用
SIGNAL data_in :data ;
SIGNAL addr_bus :bus :="11110000";

3.2非约束性数组:定义时不指定索引下标的范围,而是用<>来代替,定义格式如下:

TYPE 数组名 IS ARRAY(索引下标子类型 RANGE <>)OF 数据类型;
--举例
TYPE data IS ARRAY (INTEGER <>)OF BIT;
--声明一个data类型的datain信号时需要加上具体的范围约束条件:
SIGANL data_in : data(7 downto 0);

常用的非约束数组类型有:STRING是字符元素的集合,BIT_VECTOR是BIT的集合;STD_LOGIC_VECTOR是STD_LOGIC的集合。它们的声明如下: 

TYPE STRING IS ARRAY(POSITIVE RANGE <>) OF CHARACTER;
                   --positive range <>:是integer的一个子集,表示从1开始的正整数序列
TYPE BIT_VECTOR IS ARRAY(NATURAL RANGE<>) OF BIT;
                --natural range <>:也是integer的一个子集,表示从0开始的非负整数序列 
TYPE STD_LOGIC_VECTOR IS ARRAY(NATURAL RANGE<>) OF STD_LOGIC;
SIGNAL str:STRING(1 TO 12) :="I LOVE FPGA!";
SIGNAL data :BIT_VECTOR(7 DOWNTO 0);
SIGNAL address:BIT_VECTOR(7 DOWNTO 0);

 3.3二维数组在硬件中一般对应一块存储块,其定义非约束方和约束方式举例如下:

TYPE readdata IS ARRAY(POSITIVE RANGE<>,NATURAL<>) OF BIT;
TYPE writedata IS ARRAY(7 downto 0) OF BIT_VECTOR(7 DOWNTO 0);
声名:
--声明的第一个数组类型类型的rdata信号时需要加上具体的范围约束条件:
SIGANL rdata : readdata(7 downto 0,7 downto 0);
--声明的第二个数组类型类型的wdata信号时不需要加上具体的范围约束条件:
SIGNAL wdata : writedata;

 3.4数据类型转换to_unsigned函数用于将整数转换为无符号数(unsigned类型),然后std_logic_vector函数(实际上是类型转换,因为to_unsigned的结果可以直接赋值给std_logic_vector类型的信号)用于将这个无符号数转换为std_logic_vector。不过,在大多数情况下,由于to_unsigned的结果已经可以直接赋值给std_logic_vector类型的信号,所以直接使用std_logic_vector(to_unsigned(0, 8))即可。

signal d_out : std_logic_vector(7 downto 0); --声明一个8位的std_logic_vector信号  
signal cnt : integer range 0 to 255;
begin  
    d_out <= std_logic_vector(to_unsigned(0, 8)); --将整数0转换为8位的无符号数,然后转换为std_logic_vector  
    d_out <= std_logic_vector(cnt,8);--将cnt转换为8位的无符号数

4.子类型(subtype):子类型是数据类型的一个子集,它提供了对原始数据类型的进一步约束或限制。子类型通过定义范围、索引约束或元素约束来限制原始数据类型的值或结构。子类型在VHDL编程中非常有用,因为它们允许程序员为特定的信号或变量指定更精确的类型,从而提高代码的可读性和可维护性。子类型定义的基本格式如下:

SUBTYPE 子类型名 IS 数据类型 RANGE <约束范围>;
--举例如下:
--定义一个子类型smallnum,他是整数的子集,取值范围为0-255
SUBTYPE smallnum IS INTEGER RANGE 0 TO 255;
--用子类型smallnum声明一个变量,这样cnt的取值范围就是0-255
VARIABLE cnt:smallnum := 0;

5.并行信号赋值:

6.WAIT UNTIL boolean_expression

如果WAIT UNTIL后面的布尔表达式为TRUE,则启动执行WAIT后面的语句。

PROCESS
    BEGIN
        WAIT UNTIL clock = '1' AND clock'EVENT;
        IF(reset = ‘1’)THEN
            q <= '0';
        ELSE
            q <= d;
        END IF;
END PROCESS;

或者:

wait for 10ns;

7.函数定义和调用

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值