
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怎么调用程序包等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)