帶進位加法器之VHDL描述

admin @ 2014-03-26 , reply:0

概述
       學過VHDL的人都知道,VHDL是提供了操作符“+”,而且在很多情況下,我們是可以直接用這個……

        學過VHDL的人都知道,VHDL是提供了操作符“+”,而且在很多情況下,我們是可以直接用這個加操作符的。但是,VHDL提供的加法操作只能給出 “和”,卻無法給出“進位”。例如我們在設計計數器的時候經常用到的加1操作,對於一個8位的計數器,當計數器的結果為0xff時,如果在加1就為 0x00。實際上,結果應該時0x100,而最高位的1就是進位,我們無法利用。而我們的實際設計中,不僅要用“和”,有時還要用到兩個數相加的進位。所以有必要用VHDL來描述一個帶進位的加法器,下面的代碼可以完成這樣的功能。加法器實際上完全可以由組合邏輯實現,但在頻率較高的場合下工作時,容易產生毛刺。所以整個加法器設計成時序電路的形式,所有的加操作都是時鐘的上升沿觸發的。
--------------------------------------------------------------------------------
-- Engineer: skycanny
-- Module Name: fulladder - Behavioral
-- Tool versions: ISE 7.1
-- Description: This module is designed to discribe a full adder with carry
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity fulladder is
port(
reset : in std_logic;
clk : in std_logic;
operand1: in std_logic_vector(7 downto 0);
operand2: in std_logic_vector(7 downto 0);
carry : out std_logic;
sum : out std_logic_vector(7 downto 0)
);
end fulladder;
architecture Behavioral of fulladder is
begin
process(reset,clk)
variable sum_t : std_logic_vector(7 downto 0);
variable carry_t: std_logic;
begin
if(reset = '0') then
carry <= '0';
sum <= (others => '0');
elsif(rising_edge(clk)) then
carry_t := '0';
for i in 0 to 7 loop
sum_t(i) := operand1(i) xor operand2(i) xor carry_t;
carry_t := (operand1(i) and operand2(i)) or (carry_t and (operand1(i) or operand2(i)));
end loop;
carry <= carry_t;
sum <= sum_t;
end if;
end process;
end Behavioral;

       通過對上述代碼的綜合(XST),布局布線和后模擬,可以發現整個加法器是可以正常工作的。也沒有毛刺的現象,避免了邏輯電路設計中最忌諱的一點。模擬時鐘是100mhz。
       整個設計過程是這樣的:首先寫出一位全加器的真值表,根據真值表畫出卡諾圖,化簡卡諾圖,寫出了sum和carry的邏輯表達式。然後根據邏輯表達式寫出上面的RTL級的代碼。可見基礎的數電知識還是很重要的。估計現在很少有人卡諾圖了吧。




[admin via 研發互助社區 ] 帶進位加法器之VHDL描述已經有2798次圍觀

http://cocdig.com/docs/show-post-43324.html