找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5702|回复: 2
打印 上一主题 下一主题
收起左侧

VHDL语言编写8位乘法器程序

[复制链接]
跳转到指定楼层
楼主
ID:255413 发表于 2017-11-29 21:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于booth算法的有符号数乘法VHDL源代码,这是8位二进制乘法的,关于十进制转2进制的程序很简单,可以自己设置下,乘法器部分如下:library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity mp is Port ( ai,bi : in std_logic_vector(7 downto 0);        done  : out std_logic;        clk   : in std_logic;       op    : out std_logic_vector(7 downto 0)); end mp; architecture Behavioral of mp is begin    process(ai,bi,clk)        variable a,b,m : std_logic_vector( 7 downto 0);        variable cp: std_logic_vector( 1 downto 0);        variable t: std_logic ;        variable counter: integer;        begin           if clk'event and clk='1' then            counter:=0;             t:='0';             a:=ai;             b:=bi;             m:="00000000";             cp:=b(0)&'0';             done<='0'; --是否完成计算            while counter<8 loop                  case cp is                  when "10"=> m:=m-a;                  when "01"=> m:=m+a;                  when others=>m:=m;             end case;             t:=b(0);             b:=m(0)&b(7 downto 1);            m:=m(7)&m(7 downto 1);             cp:=b(0)&t;             counter:=counter+1;             end loop;          op<= m&b;          done<='1';        end if;    end process; end Behavioral; 然后下面这个是加法器树乘法器的源代码,也是8位2进制乘法源码,如果这两种方法还不够就MMM我好了library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity ywxj_multipier isport(clk: in std_logic;       a: in std_logic_vector(7 downto 0);--乘数       b: in std_logic_vector(7 downto 0);--被乘数       y: out std_logic_vector(15 downto 0));--输出end ywxj_multipier;architecture rtl of ywxj_multipier isbeginp1: process(clk)    variable n0,n1,n2,n3,n4,n5,n6,n7: std_logic_vector(15 downto 0);    variable m: std_logic_vector(7 downto 0);    begin    m:="00000000";      if clk'event and clk='1' then         if a(0)<='0' then         n0:="0000000000000000";         else         n0:=m&b;         end if;         if a(1)<='0' then         n1:="0000000000000000";         else         n1:=m(7 downto 1)&b&m(0);         end if;         if a(2)<='0' then         n2:="0000000000000000";         else         n2:=m(7 downto 2)&b&m(1 downto 0);         end if;         if a(3)<='0' then         n3:="0000000000000000";         else         n3:=m(7 downto 3)&b&m(2 downto 0);         end if;         if a(4)<='0' then         n4:="0000000000000000";         else         n4:=m(7 downto 4)&b&m(3 downto 0);         end if;         if a(5)<='0' then         n5:="0000000000000000";         else         n5:=m(7 downto 5)&b&m(4 downto 0);         end if;         if a(6)<='0' then         n6:="0000000000000000";         else         n6:=m(7 downto 6)&b&m(5 downto 0);         end if;         if a(7)<='0' then         n7:="0000000000000000";         else         n7:=m(7)&b&m(6 downto 0);         end if;         y<=n0+n1+n2+n3+n4+n5+n6+n7;   end if; end process p1;end rtl;

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2017-12-6 11:44 | 只看该作者
给大家分享一个文件:
八位乘法器VHDL语言实现。使用的工具的ISE7.1.rar (2.18 KB, 下载次数: 15)

  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.STD_LOGIC_ARITH.ALL;
  4. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  5. --use work.module_line_one.all;
  6. --use work.module_column_eight.all;
  7. --use work.module_line_mid.all;
  8. --use work.module_line_last.all;
  9. use work.my_component.all;
  10. --  Uncomment the following lines to use the declarations that are
  11. --  provided for instantiating Xilinx primitive components.
  12. --  library UNISIM;
  13. --  use UNISIM.VComponents.all;

  14. entity MulPar is
  15. port(A:in  std_logic_vector(7 downto 0); --input 8 bits multiplier
  16.      B:in  std_logic_vector(7 downto 0); --input 8 bits multiplicand
  17.         P:out std_logic_vector(15 downto 0);--output 16 bits result
  18.         CLK:in std_logic);                                 --input clock signal
  19. end MulPar;

  20. architecture Behavioral of MulPar is
  21. --step two :componet define

  22.     signal a_in:std_logic_vector(7 downto 0);  --A  input get through D trigger
  23.     signal b_in:std_logic_vector(7 downto 0);  --B  input get through D trigger
  24.     signal p_in:std_logic_vector(15 downto 0);  --P output get through D trigger
  25.     signal c0:std_logic_vector(6 downto 0);    --carry  of line 0
  26.     signal o0:std_logic_vector(7 downto 1);    --result of line 0
  27.     signal c1:std_logic_vector(6 downto 0);    --carry  of line 1
  28.     signal o1:std_logic_vector(7 downto 1);    --result of line 1
  29.     signal c2:std_logic_vector(6 downto 0);    --carry  of line 2
  30.     signal o2:std_logic_vector(7 downto 1);    --result of line 2
  31.     signal c3:std_logic_vector(6 downto 0);    --carry  of line 3
  32.     signal o3:std_logic_vector(7 downto 1);    --result of line 3
  33.     signal c4:std_logic_vector(6 downto 0);    --carry  of line 4
  34.     signal o4:std_logic_vector(7 downto 1);    --result of line 4
  35.     signal c5:std_logic_vector(6 downto 0);    --carry  of line 5
  36.     signal o5:std_logic_vector(7 downto 1);    --result of line 5
  37.     signal c6:std_logic_vector(6 downto 0);    --carry  of line 6
  38.     signal o6:std_logic_vector(7 downto 1);    --result of line 6
  39.     signal c7:std_logic_vector(6 downto 0);    --carry  of line 7
  40.     signal o7:std_logic_vector(7 downto 1);    --result of line 7
  41.     signal c8:std_logic_vector(6 downto 0);    --carry  of line 8
  42. --------------------------------------------------------------------------------

  43. -------------------------------------------------------------------------------------------
  44. begin
  45. ---------------------------------------------------------------------------------
  46. --step one :tigger event input and output
  47. --input A
  48. D_EVENT_1: process(CLK)        is
  49. begin
  50.         if( CLK'event and CLK = '1') then             --up edge event and then input A
  51.             a_in <= A;
  52.         end if;
  53. end process D_EVENT_1;

  54. --input B
  55. D_EVENT_2: process(CLK)        is
  56. begin
  57.         if( CLK'event and CLK = '1') then             --up edge event and then input B
  58.             b_in <= B;--input
  59.         end if;
  60. end process D_EVENT_2;

  61. --output P
  62. D_EVENT_3: process(CLK)  is
  63. begin
  64.      if( CLK'event and CLK = '1') then                --up edge event and then output P
  65.             P <=p_in;
  66.         end if;
  67. end process D_EVENT_3;
  68. ------------------------------------------------------------------------------------------
  69. --step three: operate and get result
  70. --OPERATE_ROW_ZERO
  71. OPERATE_ROW_ZERO: process (b_in(0),b_in(1),b_in(2),b_in(3),b_in(4),b_in(5),b_in(6),b_in(7),
  72.                           a_in(0)) is
  73. begin   
  74.     U00:COMPONENT module_line_one PORT MAP(a_in(0),b_in(0),c0(0),p_in(0)); --MODULE ROW 0 COLUMN 0
  75.     u01:COMPONENT module_line_one port map(a_in(0),b_in(1),c0(1),o0(1));   --MODULE ROW 0 COLUMN 1   
  76.     u02:COMPONENT module_line_one port map(a_in(0),b_in(2),c0(2),o0(2));   --MODULE ROW 0 COLUMN 2  
  77.     u03:COMPONENT module_line_one port map(a_in(0),b_in(3),c0(3),o0(3));   --MODULE ROW 0 COLUMN 3   
  78.     u04:COMPONENT module_line_one port map(a_in(0),b_in(4),c0(4),o0(4));   --MODULE ROW 0 COLUMN 4
  79.     u05:COMPONENT module_line_one port map(a_in(0),b_in(5),c0(5),o0(5));   --MODULE ROW 0 COLUMN 5   
  80.     u06:COMPONENT module_line_one port map(a_in(0),b_in(6),c0(6),o0(6));   --MODULE ROW 0 COLUMN 6
  81.     u07:COMPONENT MODULE_COLUMN_EIGHT port map(a_in(0),b_in(7),o0(7));           --MODULE ROW 0 COLUMN 7
  82. end process OPERATE_ROW_ZERO;
  83. --OPERATE_ROW_ONE
  84. OPERATE_ROW_ONE: process (b_in(0),b_in(1),b_in(2),b_in(3),b_in(4),b_in(5),b_in(6),b_in(7),
  85.                           a_in(1),
  86.                                          c0(0),c0(1),c0(2),c0(3),c0(4),c0(5),c0(6),
  87.                                          o0(1),o0(2),o0(3),o0(4),o0(5),o0(6),o0(7)) is
  88. begin   
  89.     MODULE_LINE_MID(a_in(1),b_in(0),c0(0),o0(1),c1(0),p_in(1)); --MODULE ROW 1 COLUMN 0
  90.     MODULE_LINE_MID(a_in(1),b_in(1),c0(1),o0(2),c1(1),o1(1));   --MODULE ROW 1 COLUMN 1
  91.     MODULE_LINE_MID(a_in(1),b_in(2),c0(2),o0(3),c1(2),o1(2));   --MODULE ROW 1 COLUMN 2
  92.     MODULE_LINE_MID(a_in(1),b_in(3),c0(3),o0(4),c1(3),o1(3));   --MODULE ROW 1 COLUMN 3
  93.     MODULE_LINE_MID(a_in(1),b_in(4),c0(4),o0(5),c1(4),o1(4));   --MODULE ROW 1 COLUMN 4
  94.     MODULE_LINE_MID(a_in(1),b_in(5),c0(5),o0(6),c1(5),o1(5));   --MODULE ROW 1 COLUMN 5
  95.     MODULE_LINE_MID(a_in(1),b_in(6),c0(6),o0(7),c1(6),o1(6));   --MODULE ROW 1 COLUMN 6
  96.     MODULE_COLUMN_EIGHT(a_in(1),b_in(7),o1(7));                 --MODULE ROW 1 COLUMN 7
  97. end process OPERATE_ROW_ONE;   
  98. --OPERATE_ROW_TWO
  99. OPERATE_ROW_TWO: process (b_in(0),b_in(1),b_in(2),b_in(3),b_in(4),b_in(5),b_in(6),b_in(7),
  100.                           a_in(2),
  101.                                          c1(0),c1(1),c1(2),c1(3),c1(4),c1(5),c1(6),
  102.                                          o1(1),o1(2),o1(3),o1(4),o1(5),o1(6),o1(7)) is
  103. begin   
  104.     MODULE_LINE_MID(a_in(2),b_in(0),c1(0),o1(1),c2(0),p_in(2)); --MODULE ROW 2 COLUMN 0
  105.     MODULE_LINE_MID(a_in(2),b_in(1),c1(1),o1(2),c2(1),o2(1));   --MODULE ROW 2 COLUMN 1
  106.     MODULE_LINE_MID(a_in(2),b_in(2),c1(2),o1(3),c2(2),o2(2));   --MODULE ROW 2 COLUMN 2
  107.     MODULE_LINE_MID(a_in(2),b_in(3),c1(3),o1(4),c2(3),o2(3));   --MODULE ROW 2 COLUMN 3
  108.     MODULE_LINE_MID(a_in(2),b_in(4),c1(4),o1(5),c2(4),o2(4));   --MODULE ROW 2 COLUMN 4
  109.     MODULE_LINE_MID(a_in(2),b_in(5),c1(5),o1(6),c2(5),o2(5));   --MODULE ROW 2 COLUMN 5
  110.     MODULE_LINE_MID(a_in(2),b_in(6),c1(6),o1(7),c2(6),o2(6));   --MODULE ROW 2 COLUMN 6
  111.     MODULE_COLUMN_EIGHT(a_in(2),b_in(7),o2(7));                 --MODULE ROW 2 COLUMN 7
  112. end process OPERATE_ROW_TWO;  
  113. --OPERATE_ROW_THREE
  114. OPERATE_ROW_THREE: process (b_in(0),b_in(1),b_in(2),b_in(3),b_in(4),b_in(5),b_in(6),b_in(7),
  115.                           a_in(3),
  116.                                          c2(0),c2(1),c2(2),c2(3),c2(4),c2(5),c2(6),
  117.                                          o2(1),o2(2),o2(3),o2(4),o2(5),o2(6),o2(7)) is
  118. begin   
  119.     MODULE_LINE_MID(a_in(3),b_in(0),c2(0),o2(1),c3(0),p_in(3)); --MODULE ROW 3 COLUMN 0
  120.     MODULE_LINE_MID(a_in(3),b_in(1),c2(1),o2(2),c3(1),o3(1));   --MODULE ROW 3 COLUMN 1
  121.     MODULE_LINE_MID(a_in(3),b_in(2),c2(2),o2(3),c3(2),o3(2));   --MODULE ROW 3 COLUMN 2
  122.     MODULE_LINE_MID(a_in(3),b_in(3),c2(3),o2(4),c3(3),o3(3));   --MODULE ROW 3 COLUMN 3
  123.     MODULE_LINE_MID(a_in(3),b_in(4),c2(4),o2(5),c3(4),o3(4));   --MODULE ROW 3 COLUMN 4
  124.     MODULE_LINE_MID(a_in(3),b_in(5),c2(5),o2(6),c3(5),o3(5));   --MODULE ROW 3 COLUMN 5
  125.     MODULE_LINE_MID(a_in(3),b_in(6),c2(6),o2(7),c3(6),o3(6));   --MODULE ROW 3 COLUMN 6
  126.     MODULE_COLUMN_EIGHT(a_in(3),b_in(7),o3(7));                 --MODULE ROW 3 COLUMN 7
  127. end process OPERATE_ROW_THREE;
  128. --OPERATE_ROW_FOUR
  129. OPERATE_ROW_FOUR: process (b_in(0),b_in(1),b_in(2),b_in(3),b_in(4),b_in(5),b_in(6),b_in(7),
  130.                           a_in(4),
  131.                                          c3(0),c3(1),c3(2),c3(3),c3(4),c3(5),c3(6),
  132.                                          o3(1),o3(2),o3(3),o3(4),o3(5),o3(6),o3(7)) is
  133. begin   
  134.     MODULE_LINE_MID(a_in(4),b_in(0),c3(0),o3(1),c4(0),p_in(4)); --MODULE ROW 4 COLUMN 0
  135.     MODULE_LINE_MID(a_in(4),b_in(1),c3(1),o3(2),c4(1),o4(1));   --MODULE ROW 4 COLUMN 1
  136.     MODULE_LINE_MID(a_in(4),b_in(2),c3(2),o3(3),c4(2),o4(2));   --MODULE ROW 4 COLUMN 2
  137.     MODULE_LINE_MID(a_in(4),b_in(3),c3(3),o3(4),c4(3),o4(3));   --MODULE ROW 4 COLUMN 3
  138.     MODULE_LINE_MID(a_in(4),b_in(4),c3(4),o3(5),c4(4),o4(4));   --MODULE ROW 4 COLUMN 4
  139.     MODULE_LINE_MID(a_in(4),b_in(5),c3(5),o3(6),c4(5),o4(5));   --MODULE ROW 4 COLUMN 5
  140.     MODULE_LINE_MID(a_in(4),b_in(6),c3(6),o3(7),c4(6),o4(6));   --MODULE ROW 4 COLUMN 6
  141.     MODULE_COLUMN_EIGHT(a_in(4),b_in(7),o4(7));                 --MODULE ROW 4 COLUMN 7
  142. end process OPERATE_ROW_FOUR;
  143. --OPERATE_ROW_FIVE
  144. OPERATE_ROW_FIVE: process (b_in(0),b_in(1),b_in(2),b_in(3),b_in(4),b_in(5),b_in(6),b_in(7),
  145.                           a_in(5),
  146.                                          c4(0),c4(1),c4(2),c4(3),c4(4),c4(5),c4(6),
  147.                                          o4(1),o4(2),o4(3),o4(4),o4(5),o4(6),o4(7)) is
  148. begin   
  149.     MODULE_LINE_MID(a_in(5),b_in(0),c4(0),o4(1),c5(0),p_in(5)); --MODULE ROW 5 COLUMN 0
  150.     MODULE_LINE_MID(a_in(5),b_in(1),c4(1),o4(2),c5(1),o5(1));   --MODULE ROW 5 COLUMN 1
  151.     MODULE_LINE_MID(a_in(5),b_in(2),c4(2),o4(3),c5(2),o5(2));   --MODULE ROW 5 COLUMN 2
  152.     MODULE_LINE_MID(a_in(5),b_in(3),c4(3),o4(4),c5(3),o5(3));   --MODULE ROW 5 COLUMN 3
  153.     MODULE_LINE_MID(a_in(5),b_in(4),c4(4),o4(5),c5(4),o5(4));   --MODULE ROW 5 COLUMN 4
  154.     MODULE_LINE_MID(a_in(5),b_in(5),c4(5),o4(6),c5(5),o5(5));   --MODULE ROW 5 COLUMN 5
  155.     MODULE_LINE_MID(a_in(5),b_in(6),c4(6),o4(7),c5(6),o5(6));   --MODULE ROW 5 COLUMN 6
  156.     MODULE_COLUMN_EIGHT(a_in(5),b_in(7),o5(7));                 --MODULE ROW 5 COLUMN 7
  157. end process OPERATE_ROW_FIVE;
  158. --OPERATE_ROW_SIX
  159. OPERATE_ROW_SIX: process (b_in(0),b_in(1),b_in(2),b_in(3),b_in(4),b_in(5),b_in(6),b_in(7),
  160.                           a_in(6),
  161.                                          c5(0),c5(1),c5(2),c5(3),c5(4),c5(5),c5(6),
  162.                                          o5(1),o5(2),o5(3),o5(4),o5(5),o5(6),o5(7)) is
  163. begin   
  164.     MODULE_LINE_MID(a_in(6),b_in(0),c5(0),o5(1),c6(0),p_in(6)); --MODULE ROW 6 COLUMN 0
  165.     MODULE_LINE_MID(a_in(6),b_in(1),c5(1),o5(2),c6(1),o6(1));   --MODULE ROW 6 COLUMN 1
  166.     MODULE_LINE_MID(a_in(6),b_in(2),c5(2),o5(3),c6(2),o6(2));   --MODULE ROW 6 COLUMN 2
  167.     MODULE_LINE_MID(a_in(6),b_in(3),c5(3),o5(4),c6(3),o6(3));   --MODULE ROW 6 COLUMN 3
  168.     MODULE_LINE_MID(a_in(6),b_in(4),c5(4),o5(5),c6(4),o6(4));   --MODULE ROW 6 COLUMN 4
  169.     MODULE_LINE_MID(a_in(6),b_in(5),c5(5),o5(6),c6(5),o6(5));   --MODULE ROW 6 COLUMN 5
  170.     MODULE_LINE_MID(a_in(6),b_in(6),c5(6),o5(7),c6(6),o6(6));   --MODULE ROW 6 COLUMN 6
  171.     MODULE_COLUMN_EIGHT(a_in(6),b_in(7),o6(7));                 --MODULE ROW 6 COLUMN 7
  172. end process OPERATE_ROW_SIX;
  173. --OPERATE_ROW_SEVENT
  174. OPERATE_ROW_SEVENT: process (b_in(0),b_in(1),b_in(2),b_in(3),b_in(4),b_in(5),b_in(6),b_in(7),
  175.                              a_in(7),
  176.                                               c6(0),c6(1),c6(2),c6(3),c6(4),c6(5),c6(6),
  177.                                             o6(1),o6(2),o6(3),o6(4),o6(5),o6(6),o6(7)) is
  178. begin   
  179.     MODULE_LINE_MID(a_in(7),b_in(0),c6(0),o6(1),c7(0),p_in(7)); --MODULE ROW 7 COLUMN 0
  180.     MODULE_LINE_MID(a_in(7),b_in(1),c6(1),o6(2),c7(1),o7(1));   --MODULE ROW 7 COLUMN 1
  181.     MODULE_LINE_MID(a_in(7),b_in(2),c6(2),o6(3),c7(2),o7(2));   --MODULE ROW 7 COLUMN 2
  182.     MODULE_LINE_MID(a_in(7),b_in(3),c6(3),o6(4),c7(3),o7(3));   --MODULE ROW 7 COLUMN 3
  183.     MODULE_LINE_MID(a_in(7),b_in(4),c6(4),o6(5),c7(4),o7(4));   --MODULE ROW 7 COLUMN 4
  184.     MODULE_LINE_MID(a_in(7),b_in(5),c6(5),o6(6),c7(5),o7(5));   --MODULE ROW 7 COLUMN 5
  185.     MODULE_LINE_MID(a_in(7),b_in(6),c6(6),o6(7),c7(6),o7(6));   --MODULE ROW 7 COLUMN 6
  186.     MODULE_COLUMN_EIGHT(a_in(7),b_in(7),o6(7));                 --MODULE ROW 7 COLUMN 7
  187. end process OPERATE_ROW_SEVENT;
  188. --OPERATE_ROW_EIGHT
  189. OPERATE_ROW_EIGHT: process (c7(0),c7(1),c7(2),c7(3),c7(4),c7(5),c7(6),
  190.                                            o7(1),o7(2),o7(3),o7(4),o7(5),o7(6),o7(7)) is
  191. begin   
  192.     MODULE_LINE_LAST(c7(0),o7(1),0,c8(0),p_in(8));              --MODULE ROW 8 COLUMN 0
  193.     MODULE_LINE_LAST(c7(1),o7(2),c8(0),c8(1),p_in(9));          --MODULE ROW 8 COLUMN 1
  194.     MODULE_LINE_LAST(c7(2),o7(3),c8(1),c8(2),p_in(10));         --MODULE ROW 8 COLUMN 2
  195.     MODULE_LINE_LAST(c7(3),o7(4),c8(2),c8(3),p_in(11));         --MODULE ROW 8 COLUMN 3
  196.     MODULE_LINE_LAST(c7(4),o7(5),c8(3),c8(4),p_in(12));         --MODULE ROW 8 COLUMN 4
  197.     MODULE_LINE_LAST(c7(5),o7(6),c8(4),c8(5),p_in(13));         --MODULE ROW 8 COLUMN 5
  198.     MODULE_LINE_LAST(c7(6),o7(7),c8(5),p_in(15),p_in(14));      --MODULE ROW 8 COLUMN 6
  199. end process OPERATE_ROW_EIGHT;
  200. end Behavioral;
复制代码



回复

使用道具 举报

板凳
ID:388050 发表于 2018-8-20 11:11 | 只看该作者
module_line_one,MODULE_LINE_MID,MODULE_LINE_LAST这几个元件的代码在附件里吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表