[经验] 【FPGA经典试题】采用一个乘法器实现下面代码相同的功能

[复制链接]

助理工程师

发表于 2012-3-12 14:32:27   1054 查看 0 回复 显示全部楼层 倒序浏览
分享
FPGA 资源共享:查看下面代码,画出对应框图?能否从资源共享角度,重
新编写代码,采用一个乘法器实现下面代码相同的功能?请写出相关代码



  1. module resour_share(i_data,o_square);
  2. parameter DATA_WIDTH = 8;

  3. parameter PRO_WIDTH = 16;
  4. input [DATA_WIDTH-1:0] i_data;
  5. output [PRO_WIDTH-1:0] o_square;
  6. wire [DATA_WIDTH-1:0] data_bar;
  7. assign data_bar = ~ i_data + 1'b1;
  8. wire [DATA_WIDTH-1:0] multi,multi_d;
  9. assign multi = (i_data[DATA_WIDTH-1]) ? data_bar : i_data;
  10. assign multi_d = (i_data[DATA_WIDTH-1]) ? data_bar : i_data;
  11. mul_8bit mul(.multiplicand(multi_d),
  12. .multiplier(multi),
  13. .ValOut(o_square));
  14. endmodule
  15. module mul_8bit(multiplicand,multiplier,ValOut); //start
  16. parameter width = 8;
  17. //input clk;
  18. //input reset;
  19. //input start;
  20. input [7:0] multiplicand;
  21. input [7:0] multiplier;
  22. output [15:0] ValOut;
  23. wire [7:0] mulD;
  24. wire [7:0] mulR;
  25. wire sign1,sign2,sign3,sign4;
  26. wire one1,one2,one3,one4;
  27. wire two1,two2,two3,two4;
  28. //·ûºÅsign=~A[2n+1] & (A[2n]|
  29. A[2n-1])£»sign±íʾ·ûºÅ룬μ±ÆäΪ1ʱ£¬Ôò²¼Ë¹±àÂëÈ¡Õý£»·´Ö®£¬È¡¸º¡£
  30. A[-1] ²¹Áã¼´A[-1]=0
  31. assign sign1 = ~mulR[1] & (mulR[0] | 0);

  32. assign sign2 = ~mulR[3] & (mulR[2] | mulR[1]);
  33. assign sign3 = ~mulR[5] & (mulR[4] | mulR[3]);
  34. assign sign4 = ~mulR[7] & (mulR[6] | mulR[5]);
  35. //one; one=A[2n]^A[2n-1]£»Èôone=1,Ôò²¿·Ö»ýΪb£»·ñÔòΪ0¡£
  36. assign one1 = mulR[0]^0;
  37. assign one2 = mulR[2]^mulR[1];
  38. assign one3 = mulR[4]^mulR[3];
  39. assign one4 = mulR[6]^mulR[5];
  40. //two=(¡«A[2n+1]&A[2n]&A[2n-1])|(A[2n+1]&¡«A[2n]&¡«A[2n-1])£»ÈôtwoΪ1£¬Ô
  41. ò²¿·Ö»ýΪ2b£»·ñÔòΪ0¡£
  42. assign two1 = (~mulR[1] & mulR[0] & 0)|(mulR[1] & ~mulR[0] & 1);
  43. assign two2 = (~mulR[3] & mulR[2] & mulR[1])|(mulR[3] & ~mulR[2] &
  44. ~mulR[1]);
  45. assign two3 = (~mulR[5] & mulR[4] & mulR[3])|(mulR[5] & ~mulR[4] &
  46. ~mulR[3]);
  47. assign two4 = (~mulR[7] & mulR[6] & mulR[5])|(mulR[7] & ~mulR[6] &
  48. ~mulR[5]);
  49. //·ûºÅÀ©Õ¹
  50. wire [15:0] temp;
  51. assign temp = {{8{mulD[7]}},mulD[7:0]};
  52. // ¼ÆËãÊä³ö
  53. wire [15:0] dat_w1,dat_w2,dat_w3,dat_w4;
  54. //- 2 * B = = (~ (B << 1)) + 1 ;2B= (B<<1);
  55. assign dat_w1 = (two1) ? ((sign1) ? {temp[14:0],1'b0}:(~{temp[14:0],1'b0} + 1'b1 ) ) :
  56. ((one1) ? ((sign1) ? temp :{~temp+1'b1} ) : 0);
  57. assign dat_w2 = (two2) ? ((sign2) ? {temp[14:0],1'b0}: (~{temp[14:0],1'b0} + 1'b1 )) :
  58. ((one2) ? ((sign2) ? temp :{~temp+1'b1} ) : 0);
  59. assign dat_w3 = (two3) ? ((sign3) ? {temp[14:0],1'b0}:(~{temp[14:0],1'b0} + 1'b1 ) ) :

  60. ((one3) ? ((sign3) ? temp :{~temp+1'b1} ) : 0);
  61. assign dat_w4 = (two4) ? ((sign4) ? {temp[14:0],1'b0}:(~{temp[14:0],1'b0} + 1'b1 ) ) :
  62. ((one4) ? ((sign4) ? temp :{~temp+1'b1}) : 0);
  63. assign ValOut = dat_w1 + {dat_w2[13:0],2'b00} + {dat_w3[11:0],4'b0000} +
  64. {dat_w4[9:0],6'b000000};
  65. assign mulD = multiplicand;
  66. assign mulR = multiplier;
  67. endmodule
复制代码





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
标签:乘法器 FPGA
高级模式
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐 上一条 /9 下一条

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

推荐专区

技术干货集中营

专家问答

方案交易

用户帮助┃咨询与建议┃版主议事

工程师杂谈

项目|工程师创意

招聘|求职}工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

MSP430技术论坛

FPGA|CPLD|ASIC论坛

STM32/STM8技术论坛

NXP MCU 技术论坛

PIC单片机论坛

DSP论坛

瑞萨单片机论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

工程资源中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

电子展览展会专区

芯片求购|供应发布区