当前位置:文档之家› 16位vhdl乘法器详解,加仿真图

16位vhdl乘法器详解,加仿真图

控制模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity cont_modu isport(Clk : in std_logic ;Start : in std_logic; //数据输入开始信号en_sig : out std_logic; //控制运算信号,为‘1’运算数据out_sig : out std_logic // 运算完成信号);end entity;architecture rlt_cont_modu of cont_modu issignal cnt :integer range 0 to 15 :=0;//定义从0到15type state is(S_idle,S_work,S_1d,S_2d);//运算状态信号,状态机signal st_ty : state :=S_idle;beginprocess(Clk)beginif rising_edge(Clk) thencase st_ty is 选择语句;S_idle为空闲状态,当输入数据后Start信号为1就开始工作when S_idle => if Start ='1' then 如果为1就跳转到S_work状态,并且使能信号置1st_ty <= S_work;en_sig <='1';else 不然继续在S_idle状态st_ty <= S_idle;en_sig <='0';end if;out_sig <='0';when S_work => if cnt =15 then 在S_work状态下,cnt信号一直加1,加满16个数就跳转到S_1d,然后使能信号en_sig 就为0。

st_ty <= S_1d;cnt <= 0;en_sig <='0';else 如果没到16个数继续加1st_ty <= S_work;cnt <= cnt +1;en_sig <='1';end if;out_sig <='0';when S_1d => st_ty <= S_2d; 这是S_1d状态,主要是用来延迟一个时钟en_sig <='0';out_sig <='0';when S_2d => st_ty <= S_idle; S_2d状态,信号结束,out_sig为1en_sig <='0';out_sig <='1';end case;end if;end process;end rlt_cont_modu;控制RLT图其状态图数据流移位信号模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity data_path isport(Clk : in std_logic;Data_a : in std_logic_vector(15 downto 0); //乘法A数据输入Start : in std_logic; //数据开始信号en_sig : in std_logic;//使能信号shift : out std_logic //输出信号,移位输出);end entity;architecture rlt_data_path of data_path issignal temp_data : std_logic_vector(15 downto 0);定义一个16bit的数beginprocess(Clk)beginif rising_edge(Clk)thenif Start ='1' then 当开始信号为1,即数据进来时,就把乘数A的数据放入temp_data temp_data <= Data_a; 把输入数据A放入temp_dataelsif en_sig ='1' then 上面代码产生的使能信号,en_sig为1时,temp_data就左移动一位,一直会移动16位,一再强调仿真图对照看temp_data <= '0' & temp_data(15 downto 1) ;//数据左移位一次end if;end if;end process;process(Clk)beginif rising_edge(Clk)thenif en_sig ='1' then 当使能信号为1时,把temp_data的最低位输出,因为temp_data一直在移位,所以说shift实际是第一次输出的乘数A的最低位,然后倒数第二、第三位。

shift <= temp_data(0); //移位信号输出elseshift <= '0'; 当没有工作的时候shift保持为0end if;end if;end process;end rlt_data_path;数据流RLT图加法器模块(移位信号为1是做加法)library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity add_path isport(Clk : in std_logic;Data_b : in std_logic_vector(15 downto 0);//数据B输入over_sig : in std_logic;//结束信号Start_sig : in std_logic;//开始信号en_sig : in std_logic;//运算有效信号shift : in std_logic;//移位信号tt_data : out std_logic_vector(31 downto 0);//数据B移位后的信号data_o : out std_logic_vector(31 downto 0)//乘法结果数据输出信号);end entity;architecture rlt_add_path of add_path issignal tmep_data : std_logic_vector(31 downto 0);定义32位的数,作为累计的数据signal tmep_da : std_logic_vector(31 downto 0);定义32位的数,作为数据B输入数据的移位signal tmep_da_1d : std_logic_vector(31 downto 0);定义32位的数,作为tmep_da延迟一个时钟后的数据,这里是时钟对齐处理,beginprocess(Clk)beginif rising_edge(Clk) thenif Start_sig ='1' then开始信号时,首先把累加值清零tmep_data <=(others =>'0');elsif shift ='1' then 然后数据A移位的数据为1时,就把数据B对应移位的数据相加tmep_data <= tmep_data + tmep_da_1d;//shift为1然后做加法elsetmep_data <= tmep_data;当数据A移位数据为0时不变end if;end if;end process;process(Clk)beginif rising_edge(Clk) thenif Start_sig ='1' then当开始信号时,把乘数B的数据赋值给tmep_da,高为补0 tmep_da <= x"0000" & Data_b;这个就是赋值,把高16位直接给0tmep_da_1d <= x"00000000";elsif en_sig ='1' then 当使能工作信号为1时,把数据tmep_da的值直接移位操作tmep_da <= tmep_da(30 downto 0) & tmep_da(31);//把数据左移动以位tmep_da_1d <= tmep_da;把数据tmep_da的数据给tmep_da_1d,end if;end if;end process;process(Clk)beginif rising_edge(Clk) thenif over_sig ='1' then 当工作完成后信号,就是乘法运算已经做完后,把数据tmep_data的值输出data_o <= tmep_data;//完成信号,数据输出end if;end if;end process;tt_data <= tmep_da_1d; 这个是测试信号,测试B数据的移位后的值end rlt_add_path;加法器的电路图library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity mult_top isport(Clk : in std_logic ;Start : in std_logic;Data_a : in std_logic_vector(15 downto 0);Data_b : in std_logic_vector(15 downto 0);t_shift : out std_logic;t_en_sig : out std_logic;t_out : out std_logic;tt_data : out std_logic_vector(31 downto 0);Data_o : out std_logic_vector(31 downto 0));end entity;architecture rlt_mult_top of mult_top is component cont_modu isport(Clk : in std_logic ;Start : in std_logic;en_sig : out std_logic;out_sig : out std_logic);end component;signal en_sig : std_logic;signal out_sig : std_logic;component data_path isport(Clk : in std_logic;Data_a : in std_logic_vector(15 downto 0);Start : in std_logic;en_sig : in std_logic;shift : out std_logic);end component;signal shift : std_logic;component add_path isport(Clk : in std_logic;Data_b : in std_logic_vector(15 downto 0);over_sig : in std_logic;Start_sig : in std_logic;en_sig : in std_logic;shift : in std_logic;tt_data : out std_logic_vector(31 downto 0);data_o : out std_logic_vector(31 downto 0));end component;begint_shift <= shift;t_en_sig <= en_sig;t_out <= out_sig;这里面全是顶层模块的调用,这个看不懂,就看书就是一个端口的例化过程cont_U : cont_moduport map (Clk => Clk,Start => Start,en_sig => en_sig,out_sig => out_sig);data_U : data_pathport map(Clk => Clk,Data_a => Data_a,Start => Start,en_sig => en_sig,shift => shift);add_U : add_pathport map (Clk => Clk,Data_b => Data_b,over_sig => out_sig,Start_sig => Start,en_sig => en_sig,shift => shift,tt_data => tt_data,data_o => Data_o);end rlt_mult_top;仿真图分析:当输入数据5,15时输出为75。

相关主题