FPGA|CPLD|ASIC论坛
直播中

李猛

7年用户 1535经验值
私信 关注
[经验]

如何在FPGA中实现半加器(Veilog和VHDL)

本帖最后由 Nancyfans 于 2019-8-12 16:20 编辑

FPGA周末培训课程推荐
课程名称:FPGA周六班,快速入门FPGA

1.png
VHDL代码
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;

  4. entity half_adder is
  5.   port (
  6.     i_bit1  : in std_logic;
  7.     i_bit2  : in std_logic;
  8.     --
  9.     o_sum   : out std_logic;
  10.     o_carry : out std_logic
  11.     );
  12. end half_adder;

  13. architecture rtl of half_adder is
  14. begin
  15.   o_sum   <= i_bit1 xor i_bit2;
  16.   o_carry <= i_bit1 and i_bit2;
  17. end rtl;
VHDL testbench代码
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;

  4. entity half_adder_tb is
  5. end half_adder_tb;

  6. architecture behave of half_adder_tb is
  7.   signal r_BIT1  : std_logic := '0';
  8.   signal r_BIT2  : std_logic := '0';
  9.   signal w_SUM   : std_logic;
  10.   signal w_CARRY : std_logic;
  11. begin
  12.    
  13.   UUT : entity work.half_adder  -- uses default binding
  14.     port map (
  15.       i_bit1  => r_BIT1,
  16.       i_bit2  => r_BIT2,
  17.       o_sum   => w_SUM,
  18.       o_carry => w_CARRY
  19.       );

  20.   process is
  21.   begin
  22.     r_BIT1 <= '0';
  23.     r_BIT2 <= '0';
  24.     wait for 10 ns;
  25.     r_BIT1 <= '0';
  26.     r_BIT2 <= '1';
  27.     wait for 10 ns;
  28.     r_BIT1 <= '1';
  29.     r_BIT2 <= '0';
  30.     wait for 10 ns;
  31.     r_BIT1 <= '1';
  32.     r_BIT2 <= '1';
  33.     wait for 10 ns;
  34.   end process;
  35. end behave;
Verilog代码
  1. module half_adder
  2.   (
  3.    i_bit1,
  4.    i_bit2,
  5.    o_sum,
  6.    o_carry
  7.    );

  8.   input  i_bit1;
  9.   input  i_bit2;
  10.   output o_sum;
  11.   output o_carry;

  12.   assign o_sum   = i_bit1 ^ i_bit2;  // bitwise xor
  13.   assign o_carry = i_bit1 & i_bit2;  // bitwise and

  14. endmodule // half_adder
Verilog Testbench代码
  1. module half_adder_tb;

  2.   reg r_BIT1 = 0;
  3.   reg r_BIT2 = 0;
  4.   wire w_SUM;
  5.   wire w_CARRY;
  6.    
  7.   half_adder half_adder_inst
  8.     (
  9.      .i_bit1(r_BIT1),
  10.      .i_bit2(r_BIT2),
  11.      .o_sum(w_SUM),
  12.      .o_carry(w_CARRY)
  13.      );

  14.   initial
  15.     begin
  16.       r_BIT1 = 1'b0;
  17.       r_BIT2 = 1'b0;
  18.       #10;
  19.       r_BIT1 = 1'b0;
  20.       r_BIT2 = 1'b1;
  21.       #10;
  22.       r_BIT1 = 1'b1;
  23.       r_BIT2 = 1'b0;
  24.       #10;
  25.       r_BIT1 = 1'b1;
  26.       r_BIT2 = 1'b1;
  27.       #10;
  28.     end

  29. endmodule // half_adder_tb
modelsim仿真结果
2.png

更多回帖

发帖
×
20
完善资料,
赚取积分