VHDL 程序 注释

VHDL 程序 注释,第1张

LIBRARY IEEE;

USE IEEESTD_LOGIC_1164ALL;

USE IEEEstd_logic_arithall;

USE IEEEstd_logic_unsignedall; ---调用常用的库

ENTITY add8b IS

PORT(

clk:IN STD_LOGIC; ---时钟信号

cin: IN STD_LOGIC; ---相加进位信号

a,b:IN STD_LOGIC_VECTOR(7 DOWNTO 0);-----两个8位的二进制数

s:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); ----输出

cout:OUT STD_LOGIC);

END;

ARCHITECTURE cheng OF add8b IS

SIGNAL adda1,adda2,addb1,addb2,reg1a,reg1b,add1,add2:STD_LOGIC_VECTOR(4 DOWNTO 0);

SIGNAL reg2:STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL cin1:STD_LOGIC;

BEGIN

PROCESS(clk)

BEGIN

IF clk'EVENT AND clk='1' THEN

adda1<='0'&a(3 DOWNTO 0); ----adda1是a的低4位

addb1<='0'&b(3 DOWNTO 0);-----addb1是b的低4位

adda2<='0'&a(7 DOWNTO 4);------adda2是a的高4位

addb2<='0'&b(7 DOWNTO 4);------addb2是b的高4位

cin1<=cin;

END IF;

END PROCESS;

PROCESS(CLK)

BEGIN

IF clk'EVENT AND clk='1' THEN

add1<=adda1+addb1+cin1; ---低4位相加放入add1 注意考虑是否有进位

reg1a<=adda2;

reg1b<=addb2;

END IF;

END PROCESS;

PROCESS(CLK)

BEGIN

IF clk'EVENT AND clk='1' THEN----高4位相加,考虑低4位相加的进位

add2<=reg1a+reg1b+add1(4);

reg2<=add1(3 DOWNTO 0);

END IF;

END PROCESS;

s<=add2(3 DOWNTO 0)&add1(3 DOWNTO 0);----结果是高四位与低四位并置

cout<=add2(4); ---是否有进位

END cheng ;

第二个 只需要搞清 二进制数的乘法原理就可以了 两个4位二进制数相乘,如a=1010,b=1111 那么可以看成是1010(1000+0100+0010+0001),结果等于 将1010左移三位加上1010左移两位,加上1010左移1位加上1010不移位

就是结果

y<=("0000"& c0)+("000"& c1&'0')+("00"& c2&"00")+('0'&c3&"000");

第一个是不移动 第二个是b低二位与a相乘左移1位 第三是b低3位 与a相乘左移两位,第四是b最高位与a相乘左移三位 结果相加

LIBRARY ieee;

USE ieeestd_logic_1164all;

USE ieeestd_logic_arithall;

USE ieeestd_logic_unsignedall;

跟C类似,把这些库象头文件一样加到程序前面

1std_logic_1164 IEEE的标准库,仅定义了std_ulogic, std_ulogic_vector, std_logic, std_logic_vector等类型以及他们的逻辑 *** 作(and, or, xor, not, nand, nxor, nor)

2numeric_std IEEE的标准库,定义了unsigend/signed以及他们的算术运算(包括与integer),+,-,,/, rem, mod, abs ,to_integer/to_signed/to_unsigned也都在这个库里面定义。

3std_logic_arith 是synopsys的一个扩展,定义了unsigned, signed与integer, std_ulogic之间的算术运算、关系运算(>, <, >=, <=, =, /=)算术运算返回类型可以是signed, unsigned或std_logic_vector还定义了unsigned, signed, integer, std_logic_vector机种类型之间的转换函数CONV_STD_LOGIC_VECTOR, CONV_INTEGER, CONV_SIGNED, CONV_UNSIGNED

4std_logic_unsigned 是synopsys的一个扩展,定义了基于std_logic_vector与std_logic_vector、std_logic_vector与integer之间的算术运算, >, <, >=, <=, =, /=返回类型是std_logic_vector或boolean注意这里面的function的运算都是基于unsigned,就是说std_logic_vector和integer都变成unsigned之后再用std_logic_arith库中的function完成

  std_logic_signed跟std_logic_unsigned类似,唯一的差别是,这里面的function都是先把 *** 作数(std_logic_vector或integer类型)都转换成signed之后再用std_logic_arith库中的function完成

在用这些库的时候,基本原则是要知道你想要EDA软件实现什么样的运算。大部分情况下,std_logic_vector应该作为unsigned参与运算。如果一定要std_logic_vector作为signed参与运算,最好用显示的to_integer来做。

Tips: 看到有人说, std_ulogic比std_logic好的地方在于,simulator能报告多个driver shorted together的bug。其他方面,std_ulogic与std_logic完全兼容。

VHDL的程序包是放在设计库当中的,在引用程序包中的资源之前,首先用“LIBRARY”子句声明程序包所在的设计库:“LIBRARY 设计库名称;”,然后用“USE”子句声明所要引用的程序包:“USE 设计库名称程序包名称ALL;”。

这样就可以在VHDL描述中引用程序包当中的资源了,如类型、常量、元件声明、过程、函数、属性等等。

例如要引用“std_logic”类型,就需要如下子句:

LIBRARY IEEE;

USE IEEEstd_logic_1164ALL;

我用quartusⅡ已编译并且仿真都对的,我写的是0亮1灭,如果实际情况与这相反,你自己倒一下。

LIBRARY IEEE;

USE IEEESTD_LOGIC_1164ALL;

USE IEEESTD_LOGIC_SIGNEDALL;

USE IEEEnumeric_stdall;

ENTITY test IS

PORT (clock: in std_logic; -----clock1加48MHz的信号

row: out std_logic_vector(0 to 7));

END test;

ARCHITECTURE behave OF test IS

CONSTANT fp_clka:INTEGER:=12000000; ---扫描信号频率为2Hz

SIGNAL a: INTEGER RANGE 0 TO 12000001;

signal saomiao :integer range 0 to 9;

SIGNAL clka: std_logic;

BEGIN

PROCESS (clock)

BEGIN

IF rising_edge(clock) THEN

IF a<fp_clka then --clka

a<=a+1;

clka<=clka;

ELSE

a<=0;

clka<= NOT clka;

end if;

end if;

end process;

process(clka)

BEGIN

IF rising_edge(clka) THEN

saomiao<=saomiao+1;

if saomiao=9 then

saomiao<=0;

end if;

case saomiao is ---'1'代表不亮,'0'代表亮

when 0 =>row<="01111111";

when 1 =>row<="10111111";

when 2 =>row<="11011111";

when 3 =>row<="11101111";

when 4 =>row<="11110111";

when 5 =>row<="11111011";

when 6 =>row<="11111101";

when 7 =>row<="11111110";

when 8 =>row<="00000000";

when others =>row<="11111111";

END CASE;

END IF;

end process;

END behave;

process里面的信号是敏感信号一变就跑,process之外的语句是并行同时有效的,我觉得在学习VHDL时不要拿它和高级语言类比,它是一种硬件描述语言,应该理解为那些语句会生成怎样的硬件电路,或者生成组合逻辑电路,或者生成时序电路,在电路在跑的时候,不好拿执行多少次去描述它,例如在进程外的赋值语句,很有可能就生成了几根传输信号的线了,怎么好用执行几次去描述呢?

不知道你学过数字电路与逻辑设计没,最好先学了这门课在去学VHDL,这样才能有深刻的理解

以上就是关于VHDL 程序 注释全部的内容,包括:VHDL 程序 注释、在VHDL中常用的 预定义程序包有哪几个,怎样使用这些程序包、vhdl怎么调用程序包等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10090929.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存