[FPGA]VHDL语言初学笔记和小Tips

前言:本人使用Xilinx的FPGA,使用的语言是VHDL。在这将自己学习查的,自己遇到的关于VHDL问题都总结在这,都是很基础的东西,会不时的更新。

  1. 信号定义
      VHDL语句 signal cnt: integer range 0 to 10000:=0;
      信号cnt为整数类型,大小可为0到10000中的任意数,且初始值为0.

  2. VHDL提供了6种预定义的运算操作符,分别是:赋值运算符,逻辑运算符,算术运算符,关系运算符,移位运算符,并置运算符。

    • VHDL赋值运算符:
        在VHDL中,赋值运算符用来给信号、变量和常数赋值。赋值运算符包括以下3种:
        <=用于对SIGNAL赋值。
        :=用于对VARIABLE,CONSTANT和GENERIC赋值,也可用于赋初始值。
        =>给矢量中的某些位赋值,或对某些位之外的其他位(常用OTHERS表示)赋值。
    • VHDL逻辑运算符
        在VHDL中,逻辑运算符用来执行逻辑运算操作。操作数必须是BIT,STD_LOGIC或STD_ULOGIC类型的数据(或者是这些数据类型的扩展,即BIT_VECTOR,STD_LOGIC_VECTORSTD_ULOGIC_VECTOR)。
        VHDL的逻辑运算符有以下几种:
    符号NOTANDORNANDNORXORXNOR
    意义取反与非或非异或同或

    XNOR是"同或"运算符,它在VHDL87中没有定义,在VHDL93中被引入。注意,从左至右,这些运算符的优先级是递减的。

    1. VHDL算术运算符
        在VHDL中,算术运算符用来执行算术运算操作。操作数可以是INTEGER,SIGNED,UNSIGNED或REAL数据类型,其中REAL类型是不可综合的。如果声明了ieee库中的包集std_logic_signed和std_logic_unsigned,即可对STD_LOGIC_VECTOR类型的数据进行加法和减法运算。
        VHDL语言有以下8种算术运算符:
    符号+-*/MODREMABS
    意义取模取余绝对值

    上述运算符中,加法、减法和乘法运算符是可以综合成逻辑电路的,对于除法运算,只有在除数为2的n次幕时才有可能进行综合,此时除法操作对应的是将被除数向右进行n次移位。对于指数运算,只有当底数和指数都是静态数值(常量或GENERIC参数)时才是可综合的。在算术运算符的使用中,要注意MOD和REM的区别:y MOD x运算的结果是y除以x所得的余数,运算结果通过信号x返回;y REM x运算的结果是y除以x所得的余数,结果通过信号y返回。ABS运算返回操作数的绝对值。上述后3个运算符(MOD,REM和ABS)通常是不可综合的。

    1. VHDL关系运算符:
      在VHDL中,关系运算符用来对两个操作数进行比较运算。
    符号=/=<><=>=
    意义等于不等于小于大于小于等于大于等于

    这里需要注意的是:
      关系运算符左右两边操作数的数据类型必须相同,这些关系运算符适用于前面所讲的所有数据类型。

    1. VHDL移位运算符:
        在VHDL中,移位操作符用来对数据进行移位操作,它们是在VHDL93中引入的。其语法结构为:
           <左操作数><移位操作符><右操作数>
        其中,左操作数必须是BIT_VECTOR类型的,右操作数必须是INTEGER类型(前面可以加正负号)的。
      VHDL中的移位操作符有以下几种:
    符号名字解释
    sll逻辑左移数据左移,右端空出来的位置填充’0’
    srl逻辑右移数据右移,左端空出来的位置填充’0’
    sla算术左移数据左移,同时复制最右端的位,在数据左移操作后填充在右端空出的位置上
    sra算术右移数据右移,同时复制最左端的位,在数据右移操作后填充在左端空出的位置上
    rol循环逻辑左移数据左移,同时从左端移出的位依次填充到右端空出的位置上
    ror循环逻辑右移数据右移,同时从右端移出的位依次填充到左端空出的位置上
    1. VHDL 并置运算符
        在VHDL中,提供了一种并置操作符 , 它的符号如下所示 :
      & 或者(a,b,c,d)用来进行位和位矢量的连接运算
       例:
         SIGNAL a, b:std_logic;
         SIGNAL d, e: std_logic_vector (3 DOWNTO 0);
         SIGNAL g: std_logic_vector (7 DOWN TO 0);
         c<=a & b; 两个位连接
         f <= a & d; 位和一个位矢量连接
        采用并置操作符的过程中 , 设计人员常常采用一种称为聚合连接的方式。
        聚合连接就是 :将上面直接连接中的并置操作符换成逗号 , 然后再使用括号将连接的位括起来。
       例:
         SIGNAL a, b, c, d: std logic;
         SIGNAL q: std_logic
      vector (4 DOWNTO 0);
         q<=a&b&c&d&a;
        若采用聚合连接的方式 , 那么可以写成如下几种形式 :
         q <= (a, b, c, d, a);
         q <= (3 = > b, 2 = > c, 1 = > d, OTHERS = > a);
  3. 信号的拆解
       LED0 <= LED(0);
       LED1 <= LED(1);
       LED2 <= LED(2);
       LED3 <= LED(3);
       LED4 <= LED(4);

  4. others =>'0’
      如果cnt是std_logic_vector(7 downto 0)类型的,
       cnt <= (1=>‘1’ , others =>‘0’);表示给cnt第1位赋‘1’,给其它位赋‘0’。最后 cnt = “0000 0010”。

  5. 信号赋值问题
    一个信号或端口只能在一个process或只能在architecture里面被赋值
      在architecture里面被赋值的话,赋值语句只能有一句,在process里面可以有多句,但不会立刻赋值,而是在进程这一轮结束的时候选取最后一次赋值语句作赋值。
      如果对同一个信号多次赋值,就会报错,初始化赋值也一样。
      如果有多个赋值语句,如s <= a + b;a <= y + 1;前面两句的执行顺序和书写顺序无关,和赋值依赖关系有关。

  6. process列表的写法导致不同结果
     1.生成一个组合逻辑+锁存器
       process (clk, asy_rst, message_over) begin
         if asy_rst = ‘1’ then
        ……
        endif;
       end process;
     2.生成一个组合逻辑+触发器
       process (clk, asy_rst, message_over) begin
         if rising_edge(CLK) then
        ……
        endif;
       end process;

  7. process的信号列表
      对于process (clk, asy_rst, message_over)
      如果敏感信号列表中有多个信号,如果clk是时钟,是message_over的2倍频率,且message_over电平转换的时刻clk也在转换,则写在前面的clk一变换率先进入process中,则message_over信号变换相当于被忽略了。

  8. 找不到操作符“+”“-”等等运算符
      Q:found ‘0’ definitions of operator “+”, cannot determine exact overloaded matching definition for “+”
      第一:Start your VHDL with
       library IEEE;
       use IEEE.STD_LOGIC_1164.ALL;
       use ieee.std_logic_unsigned.all;
      第二:注意位数的问题,相加,‘1’还是“0001”

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值