VHDL的几个语法结构分析记录

1、--GENERIC可以用来指定一些全局的变量,它要放在entity之后,port口映射之前

entity ethernet is

generic(--GENERIC语句指定的参数是全局的
MIIM_PHY_ADDRESS      : t_phy_address := (others => '0');
MIIM_RESET_WAIT_TICKS : natural       := 0;
MIIM_POLL_WAIT_TICKS  : natural       := DEFAULT_POLL_WAIT_TICKS;
MIIM_CLOCK_DIVIDER    : positive      := 50;
-- You need to supply the current speed via speed_override when MIIM is disabled
MIIM_DISABLE          : boolean       := FALSE

);

port(

a :input std_logic;

b:output std_logic

 

 

);

end entity;

GENERIC:此处的GENERIC什么的参数相当于.C文件声明的全局变量,可以在本.c文件中任何位置使用,如果需要定义所有文件都使用的全局变量,则需要在package中定义

如,

package const_def is

constant OCXO1PPS_DelayCounter:std_logic_vector(27 downto 0) := X"4C4B3FF";

constant OCXODelay1PPS_Counter:std_logic_vector(27 downto 0) := OCXO1PPS_DelayCounter+X"00C3500";

end const_def;

generic定义变量的作用,可以将定义的变量作为entity模块的一些配置参数的入口,比如定义一个timeperiod,默认=1000,当需要修改为2000时,可通过外部传递参数进来

传递方式格式:

C2:i2cs_rx

   generic map(

timeperiod=>2000

)

     port map(

      CLB => CLB,

      SCL => SCL,

      SDA => SDA

           );

这样就能更好的将.vhd程序模块化,重复利用率变高。

natural:自然数>=0;是integer的子类型

postive:正整数>0;   是interger的子类型

 

二、关于数据类型转换

1、关于CONV_INTEGER

定义:

signal s_rtcfoutNo        :integer range 1 to 200:=1;
       signal testnumber        :std_logic_vector(7 downto 0);

代码

process(rst)
begin
if(rst='1') then
    testnumber<=X"C8";
else  
    s_rtcfoutNo<=CONV_INTEGER(testnumber);
end if;
end process;    

测试1:按上面代码测试

 testnumber =X"64";     s_rtcfoutNo =100;

testnumber =X"81";     s_rtcfoutNo =129; 

testnumber =X"C8";     s_rtcfoutNo =200;

 testnumber =X"00";     s_rtcfoutNo无结果,modesim仿真卡死,致命错误;

testnumber =X"CA";     s_rtcfoutNo无结果,modesim仿真卡死,致命错误;

 

补充:conv_std_logic_vector

转换后的数据是原数据的二进制补码形式

VHDL中的数据转换函数conv_std_logic_vector的用法
std_logic_arith程序包里定义的数据转换函数:conv_std_logic_vector(A,位长)--INTEGER,SINGER,UNSIGNED转换成std_logic_vector。

由于参考书上都没有具体说明,本以为是将原来的数据类型按位矢量输出,结果按这种用法编写的滤波器在接实际信号时,却使用输出图像全部反色,经modelsim波形仿真之后,才发现滤波器结构是正确的,可是调用了转换函数之后,结果非预期效果。

对该转换函数做了测试之后,才发现:该函数的转换结果是将被转换的数据先转换成2进制补码形式,然后取其低“位长”,作为输出。

如:a<=conv_std_logic_vector(-79,6)----(-79)2c=(10110001)

b<=conv_std_logic_vector(-2,6)-----(-2)2c=(11111110)

c<=conv_std_logic_vector(100,6)-----(100)2c=(01100100)

输出结果:a=110001,b=111110,c=100100

 

结论

a=CONV_INTEGER<b>在转换时,

     1、b的值一定要在a的定义范围内,否则可能出现隐藏bug

     2、integer有正有负,但是在定义时,没定义负数,转换结果没有负数,不会将81转换为-127,而是129。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值