用VHDL语言设计一个4位二进制数据比较器,应该怎么设计?
LIBRARY IEEE
USE IEEE.STD_LOGIC_1164.ALL
USE IEEE.STD_LOGIC_UNSIGNED.ALL
ENTITY COMPARE4 IS ——四位比较器
PORT(IA_MORE_THAN_B:IN STD_LOGIC ——高位比较的标志位的输入
IB_MORE_THAN_A:IN STD_LOGIC
IA_EQUAL_B:IN STD_LOGIC
A:IN STD_LOGIC_VECTOR(3 DOWNTO 0)——两个输入
B:IN STD_LOGIC_VECTOR(3 DOWNTO 0)
OA_MORE_THAN_B:OUT STD_LOGIC
OB_MORE_THAN_A:OUT STD_LOGIC
OA_EQUAL_B:OUT STD_LOGIC)
END COMPARE4
ARCHITECTURE BEHAV OF COMPARE4 IS
BEGIN
PROCESS(IB_MORE_THAN_A, IA_EQUAL_B,IA_EQUAL_B)
BEGIN
IF(IA_EQUAL_B='1')THEN
——从最高位比较,如果高位大则停止比较输出结果,否则进行下一位比较
IF(A(3)>B(3))THEN
OA_MORE_THAN_B<='1'OB_MORE_THAN_A<='0'OA_EQUAL_B<='0'
ELSIF(A(3)<B(3))THEN
OA_MORE_THAN_B<='0'OB_MORE_THAN_A<='1'OA_EQUAL_B<='0'
ELSIF(A(2)>B(2))THEN
OA_MORE_THAN_B<='1'OB_MORE_THAN_A<='0'OA_EQUAL_B<='0'
ELSIF(A(2)<B(2))THEN
OA_MORE_THAN_B<='0'OB_MORE_THAN_A<='1'OA_EQUAL_B<='0'
ELSIF(A(1)>B(1))THEN
OA_MORE_THAN_B<='1'OB_MORE_THAN_A<='0'OA_EQUAL_B<='0'
ELSIF(A(1)<B(1))THEN
OA_MORE_THAN_B<='0'OB_MORE_THAN_A<='1'OA_EQUAL_B<='0'
ELSIF(A(0)>B(0))THEN
OA_MORE_THAN_B<='1'OB_MORE_THAN_A<='0'OA_EQUAL_B<='0'
ELSIF(A(0)<B(0))THEN
OA_MORE_THAN_B<='0'OB_MORE_THAN_A<='1'OA_EQUAL_B<='0'
ELSE
——如果输入中两个数相等的标志位为0,则表明高位不相等,停止比较,输出结果。
OA_MORE_THAN_B<='0'OB_MORE_THAN_A<='0'OA_EQUAL_B<='1'
END IF
ELSE
OA_MORE_THAN_B<=IA_MORE_THAN_BOB_MORE_THAN_A<=IB_MORE_THAN_A
OA_EQUAL_B<=IA_EQUAL_B
END IF
END PROCESS
END BEHAV
VHDL 的英文全名是VHSIC Hardware Description Language(VHSIC硬件描述语言)。VHSIC是Very High Speed Integrated Circuit的缩写,是20世纪80年代在美国国防部的资助下始创的,并最终导致了VHDL语言的出现。1987 年底,VHDL被 IEEE 和美国国防部确认为标准硬件描述语言。VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
LIBRARY ieee
USE ieee.std_logic_1164.ALL
ENTITY half_adder IS
PORT(a : IN std_logic
b : IN std_logic
s : OUT std_logic --sum
co : OUT std_logic) --carry out
END half_adder
ARCHITECTURE half_adder OF half_adder IS
SIGNAL c,d:std_logic
BEGIN
co<=a AND b s<=a XOR b
--logic relation due to truth table
END half_adder
LIBRARY ieee
USE ieee.std_logic_1164.ALL
ENTITY full_adder IS
PORT(a,b,cin : IN std_logic
--cin represents carry in from low bit
co,s : OUT std_logic)
END full_adder
ARCHITECTURE full_adder OF full_adder IS
COMPONENT half_adder
--component declaration of half adder
PORT(a,b : IN std_logic
s,co : OUT std_logic)
END COMPONENT
SIGNAL u0_co,u0_s,u1_co:std_logic
--define two signals,represent component inner connection
BEGIN
--connection of half adder component
u0:half_adder PORT MAP(a,b,u0_s,u0_co)
u1:half_adder PORT MAP(u0_s,cin,s,u1_co)
co<=u0_co OR u1_co
END full_adder
USE IEEE.STD_LOGIC_1164.ALL
USE IEEE.STD_LOGIC_UNSIGNED.ALL
USE IEEE.STD_LOGIC_ARITH.ALL
ENTITY B2G IS
GENERIC(n:INTEGER :=4)
PORT(
norm : IN STD_LOGIC_VECTOR(n-1 DOWNTO 0)
grey : OUT STD_LOGIC_VECTOR(n-1 DOWNTO 0)
)
END B2G
ARCHITECTURE behave OF B2G IS
SIGNAL temp_normal : STD_LOGIC_VECTOR(n-1 DOWNTO 0)
SIGNAL temp_grey : STD_LOGIC_VECTOR(n-1 DOWNTO 0)
BEGIN
PROCESS(norm)
BEGIN
temp_normal <= norm
temp_grey(n-1) <= temp_normal(n-1)
FOR i IN n-2 DOWNTO 0 LOOP
temp_grey(i) <= temp_normal(i+1) xor temp_normal(i)
END LOOP
grey <= temp_grey
END PROCESS
END behave
library IEEE
use IEEE.Std_logic_1164.ALL
entity pro1 is
port(A1,B1,G1BAR,A0,B0,G0BAR:in std_logic
Y20,Y21,Y22,Y23,Y10,Y11,Y12,Y13:out std_logic)
end pro1
architecture pro1_arch of pro1 is
begin
Y10<='0' when(B0='0') and ((A0='0') and (G0BAR='0')) else '1'
Y11<='0' when(B0='0') and ((A0='1') and (G0BAR='0')) else '1'
Y12<='0' when(B0='1') and ((A0='0') and (G0BAR='0')) else '1'
Y13<='0' when(B0='1') and ((A0='1') and (G0BAR='0')) else '1'
Y20<='0' when(B1='0') and ((A1='0') and (G1BAR='0')) else '1'
Y21<='0' when(B1='0') and ((A1='1') and (G1BAR='0')) else '1'
Y22<='0' when(B1='1') and ((A1='0') and (G1BAR='0')) else '1'
Y23<='0' when(B1='1') and ((A1='1') and (G1BAR='0')) else '1'
end pro1_arch
能实现四位二进制数全加的数字电路模块,称之为四位全加器。
http://baike.baidu.com/link?url=GaCnz6D-_GQfu1rs_YfE_cZKiwRMcRtEpeLDS2Nn-0UlA39xIq_E2Vw8ttNptjB-kaKIblYblcLCXucw3cbaIK
还有一个使电路复杂化的原因是逻辑电路的输入项太多以致需占用过多的面积。我们从图3和图4两个相同功能的逻辑电路和他们对应的VHDL描述来分析。
比较两图可知,图3是二级逻辑门,每个输入信号与不只一个逻辑门相连,图4是三级的逻辑门,每个输入信号只与一逻辑门相连。由于级数少,延时也较少,因此图3的速度要比图4快。然而,由于图3的输入项要比图4大的多(10:5),因此,占用的面积必然也比图3大。图4是图3通过提取公因数(例中是B和C)得来的,这是把附加的中间项加到结构描述中去的一种过程,它使输入到输出中的逻辑级数增加,牺牲速度换来电路占用面积的减少。对于对延时要求不高的情况下采用这种方法分解逻辑电路以达到减少电路复杂度的目的。
通过以上简单、初步的探讨,我们可以知道,用VHDL进行集成电路的设计,牵涉到对VHDL语言的使用方法和对设计的理解程度。本文讨论了以下几个简化和优化电路设计的3个值得注意的方面:
(1)在用VHDL进行设计中要注意避免不必要的寄存器描述。
(2)在编写程序前要先对整个设计进行较深入的了解�科学的划分设计,多设想几种方案�再进行比较�用多个较少位数的单元取代较多位数的单元。
(3)在延时要求不高的情况下,可提取逻辑电路公因子�把它分解成含有中间变量的多级电路。
信号可以在PACKAGE、ENTITY和ARCHITECTURE中声明,而变量只能在一段顺序描述代码的内部声明。因此,信号是全局的,而变量通常是局部的。
变量的值通常是无法直接传递到PROCESS外部的。如果需要进行变量值的传递,则必须把这个值赋给一个信号,然后由信号将变量值传递到PROCESS外
部。另一方面,赋予变量的值使即刻生效的,在此后的代码中,此变量将使用新的变量值。这个一点和PROCESS中使用的信号不同,新的信号值通常只有在整
个PROCESS运行完毕后才开始生效。
VHDL中的信号代表的是逻辑电路中的“硬”连线,既可以用于电路单元的输入/输出端口,也可以用于电路内部各单元之间的连接。实体的所有端口都默认为信号。信号定义的格式如下:
SIGNAL
name:type [range] [:= initial_value];
有关信号的最重要一点是,当信号用在顺序描述语句(如PROCESS内部)中时,它并不是立即更新的,信号值是在相应的进程、函数或过程完成后才进行更新的。当对信号进行赋初始值的操作是不可综合的,只能用来进行仿真。
变量仅用于局部的电路描述。它只能在PROCESS,FUNCTION和PROCEDURE内部使用,而且对它的赋值是立刻生效的,所以新的值可以再下一行中立即使用。仅用于顺序描述代码中。
如下
LIBRARY IEEE
USE IEEE.STD_LOGIC_1164.ALL
USE IEEE.STD_LOGIC_UNSIGNED.ALL
ENTITY counter IS
PORT( RST,EN,CLK:IN STD_LOGIC
OC:OUT STD_LOGIC
Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0))
END counter
ARCHITECTURE bhv OF counter IS
BEGIN
PROCESS(RST,EN,CLK)
VARIABLE TMP:STD_LOGIC_VECTOR(3 DOWNTO 0)
BEGIN
IF RST='1' THEN TMP:="0000"OC<='0'
ELSIF EN='0' THEN NULL
ELSIF CLK'EVENT AND CLK='1' THEN
IF TMP=9 THEN OC<='1'TMP:="0000"
ELSE TMP:=TMP+1OC<='0'
END IF
END IF
Q<=TMP
END PROCESS
END bhv
这个是顶层例化语句,可以使用生成语句,但这里使用了简单的例化语句
另外再给你一个仿真波形图
LIBRARY IEEE
USE IEEE.STD_LOGIC_1164.all
USE IEEE.STD_LOGIC_UNSIGNED.all
ENTITY jsq10 IS
PORT(RST,EN,CLK:IN STD_LOGIC
Q1,Q2,Q3,Q4,Q5,Q6:OUT STD_LOGIC_VECTOR(3 DOWNTO 0))
end jsq10
ARCHITECTURE BHV of jsq10 is
SIGNAL OC2,OC3,OC4,OC5,OC6,OC7:STD_LOGIC
component counter
PORT( RST,EN,CLK:IN STD_LOGIC
OC:OUT STD_LOGIC
Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0))
END component
begin
u1:counter PORT MAP(RST=>RST,EN=>EN,CLK=>CLK,Q=>Q1,OC=>OC2)
u2:counter PORT MAP(RST=>RST,EN=>EN,CLK=>OC2,Q=>Q2,OC=>OC3)
u3:counter PORT MAP(RST=>RST,EN=>EN,CLK=>OC3,Q=>Q3,OC=>OC4)
u4:counter PORT MAP(RST=>RST,EN=>EN,CLK=>OC4,Q=>Q4,OC=>OC5)
u5:counter PORT MAP(RST=>RST,EN=>EN,CLK=>OC5,Q=>Q5,OC=>OC6)
u6:counter PORT MAP(RST=>RST,EN=>EN,CLK=>OC6,Q=>Q6,OC=>OC7)
END BHV