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

控制模块:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitycont_moduisport(Clk:instd_logic;Start:instd_logic;//数据输入开始信号en_sig:outstd_logic;//控制运算信号,为‘1’运算数据out_sig:outstd_logic//运算完成信号);endentity;architecturerlt_cont_moduofcont_moduissignalcnt:integerrange0to15:=0;//定义从0到15typestateis(S_idle,S_work,S_1d,S_2d);//运算状态信号,状态机signalst_ty:state:=S_idle;beginprocess(Clk)beginifrising_edge(Clk)thencasest_tyis选择语句;S_idle为空闲状态,当输入数据后Start信号为1就开始工作whenS_idle=>ifStart='1'then如果为1就跳转到S_work状态,并且使能信号置1st_ty<=S_work;en_sig<='1';else不然继续在S_idle状态st_ty<=S_idle;en_sig<='0';endif;out_sig<='0';whenS_work=>ifcnt=15then在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';endif;out_sig<='0';whenS_1d=>st_ty<=S_2d;这是S_1d状态,主要是用来延迟一个时钟en_sig<='0';out_sig<='0';whenS_2d=>st_ty<=S_idle;S_2d状态,信号结束,out_sig为1en_sig<='0';out_sig<='1';endcase;endif;endprocess;endrlt_cont_modu;控制RLT图其状态图数据流移位信号模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitydata_pathisport(Clk:instd_logic;Data_a:instd_logic_vector(15downto0);//乘法A数据输入Start:instd_logic;//数据开始信号en_sig:instd_logic;//使能信号shift:outstd_logic//输出信号,移位输出);endentity;architecturerlt_data_pathofdata_pathissignaltemp_data:std_logic_vector(15downto0);定义一个16bit的数beginprocess(Clk)beginifrising_edge(Clk)thenifStart='1'then当开始信号为1,即数据进来时,就把乘数A的数据放入temp_datatemp_data<=Data_a;把输入数据A放入temp_dataelsifen_sig='1'then上面代码产生的使能信号,en_sig为1时,temp_data就左移动一位,一直会移动16位,一再强调仿真图对照看temp_data<='0'&temp_data(15downto1);//数据左移位一次endif;endif;endprocess;process(Clk)beginifrising_edge(Clk)thenifen_sig='1'then当使能信号为1时,把temp_data的最低位输出,因为temp_data一直在移位,所以说shift实际是第一次输出的乘数A的最低位,然后倒数第二、第三位。。。。。shift<=temp_data(0);//移位信号输出elseshift<='0';当没有工作的时候shift保持为0endif;endif;endprocess;endrlt_data_path;数据流RLT图加法器模块(移位信号为1是做加法)libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityadd_pathisport(Clk:instd_logic;Data_b:instd_logic_vector(15downto0);//数据B输入over_sig:instd_logic;//结束信号Start_sig:instd_logic;//开始信号en_sig:instd_logic;//运算有效信号shift:instd_logic;//移位信号tt_data:outstd_logic_vector(31downto0);//数据B移位后的信号data_o:outstd_logic_vector(31downto0)//乘法结果数据输出信号);endentity;architecturerlt_add_pathofadd_pathissignaltmep_data:std_logic_vector(31downto0);定义32位的数,作为累计的数据signaltmep_da:std_logic_vector(31downto0);定义32位的数,作为数据B输入数据的移位signaltmep_da_1d:std_logic_vector(31downto0);定义32位的数,作为tmep_da延迟一个时钟后的数据,这里是时钟对齐处理,beginprocess(Clk)beginifrising_edge(Clk)thenifStart_sig='1'then开始信号时,首先把累加值清零tmep_data<=(others=>'0');elsifshift='1'then然后数据A移位的数据为1时,就把数据B对应移位的数据相加tmep_data<=tmep_data+tmep_da_1d;//shift为1然后做加法elsetmep_data<=tmep_data;当数据A移位数据为0时不变endif;endif;endproces...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

文秘专家
机构认证
内容提供者

1

确认删除?