用VHDL语言设计一个4位二进制数据比较器,应该怎么设计?

用VHDL语言设计一个4位二进制数据比较器,应该怎么设计?,第1张

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系统设计的基本点。

八选一须具选择器:用CASE语句。

LIBRARY    IEEE

USE      IEEE.STD_LOGIC_1164.ALL

ENTITY      mux_8_1      IS

  PORT (A,B,C,D,E,F,G,H,En:IN STD_LOGIC

         S:in STD_LOGIC_vector(2 downto 0)

         Y: out STD_LOGIC)

end     mux_8_1

ARCHITECTURE     mux   OF     mux_8_1     IS

begin

  process( S,A,B,C,D,E,F,G,H,En)

     begin

       if En='0' then

          case  S   is

           when "000" => Y<=A

           when "001" => Y<=B

          弯衫 when "010"埋则腔 => Y<=C

           when "011" => Y<=D

           when "100" => Y<=E

           when "101" => Y<=F

           when "110" => Y<=G

           when "111" => Y<=H

    盯含      end case

       end if

    end process 

  end  mux

用vhdl设计秒表全功略!

根据要求, 秒表的设计要有三个输入端:runstop,rst和clk. runstop是开关, 按一下开始计时, 再按一下停止计时, 显示时间. 可以使用一个T触发器来实现. 当我们把T触发器的T端接高电平时, 它将实现翻转功能. 然后用输入端口runstop 来控制, 当runstop 被按一下, 一个时钟到来, T触发器就进行一次翻转. 我们也可以用D触发器来代替T触发器, 需要用一个反馈信号, 将输出的信号反馈到D端口. Rst 是复位, 当按下rst 时, 秒表的显示变为0. Clk是时钟, 实验中的时钟信号是250KHZ,为了实现秒表的正确计时功能, 需要进行2500分频. 所以clk首先就应该接到一个分频器, 然后再为其他模块提供时钟. 接着我们把秒表划分为以下几个模块:分频器, 计数器, T触发器, 扫描器, 八选一选择器旁知, 七段译码器, 另外还有一个模块要在分, 秒和毫秒之间做一个划分(BAR). 计数器的功能是要实现毫秒,秒,分的计数,比较麻烦.我们再将它分成几个模块, 可以是六进制的计数器和十进制的计数器进行级联来实现.也可以是用100进制的计数器和60进制的计数器进行级联. 我两种方法都尝试了一下.发现后一种方法编程要复杂的多, 级联的时候可以稍微简单一些. 因为D触发器,八选一选择器是程序包里有的,所以可以不编. 把这些模块都编好了以后要做的就是把他运姿消们连在一起. 有两种方法. 一是用画图的方法, 二是用编程的方法, 用port map语句. 同样, 这两种方法我也都尝试了. 我觉得用画图的方法要简单一些.

1程序如下:分频器: library ieeeuse ieee.std_logic_1164.alluse ieee.std_logic_unsigned.allentity df is port(clkin:in std_logicdout:out std_logic)

endarchitecture behavioral of df is begin process(clkin) variable df: std_logic_vector(7 downto 0):="00000000"begin if (clkin'event and clkin='1')then if df/="11111010" then df:=df+1else df:="00000001"end ifend ifdout<=df(7)end processend behavioral扫描器: library ieeeuse ieee.std_logic_1164.alluse ieee.std_logic_unsigned.all

entity scan is port(clk:in std_logics:out std_logic_vector(2 downto 0))end scan

architecture behavioral of scan is variable scan:std_logic_vector(2 downto 0)begin process(clk) begin if(clk'event and clk='1')then scan:=scan+1end ifs<=scanend processend behavioral七段译码器: library ieeeuse ieee.std_logic_1164.all

entity bcd is port(o:in std_logic_vector(3 downto 0)q:out std_logic_vector(6 downto 0))end bcd

architecture behavioral of bcd is begin process(o) begin case o is when"0000"=>q<="0111111"when"0001"=>册肆q<="0000110"when"0010"=>q<="1011011"when"0011"=>q<="1001111"when"0100"=>q<="1100110"when"0101"=>q<="1101101"when"0110"=>q<="1111101"when"0111"=>q<="0100111"when"1000"=>q<="1111111"when"1001"=>q<="1101111"when others=>q<="0000000"end caseend processend behavioral当然,以上的100进制和60进制计数器的设计过于复杂,可以由六进制和十进制的计数器级联代替,程序如下:六进制: library ieeeuse ieee.std_logic_1164.alluse ieee.std_logic_unsigned.allentity c6 is port(count:out std_logic_vector(3 downto 0)cout:out std_logiccin,rst,clk:in std_logic)end c6architecture behavioral of c6 is signal counter:std_logic_vector(2 downto 0)begin process(clk,rst) begin if rst='1'then counter<="000"cout<='0'elsif clk'event and clk='1' then if cin='1' then if counter="101"then counter<="000"cout<='1'else counter<=counter+"001"cout<='0'end ifend ifend ifend processcount(2 downto 0)<=countercount(3)<='0'end behavioral

十进制: library ieeeuse ieee.std_logic_1164.alluse ieee.std_logic_unsigned.all

entity c10 is port(count:out std_logic_vector(3 downto 0)cout:out std_logiccin,rst,clk:in std_logic)end c10

architecture behavioral of c10 is signal counter:std_logic_vector(3 downto 0)begin process(clk,rst) begin if rst='1'then counter<="0000"cout<='0'elsif clk'event and clk='1' then if cin='1' then if counter="1001"then counter<="0000"cout<='1'else counter<=counter+"0001"cout<='0'end ifend ifend ifend processcount<=counterend behavioral

最后用画图讲这些模块连接起来.


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

原文地址: http://outofmemory.cn/yw/12233237.html

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

发表评论

登录后才能评论

评论列表(0条)

保存