IC/FPGA笔试题分析(六)用16bit加法器IP核实现8bit乘法运算(文末彩蛋)

举报
李锐博恩 发表于 2021/07/15 02:15:51 2021/07/15
【摘要】 本来突发奇想,想建立一个群来召集各路同行加入,共同讨论数字IC以及FPGA方向的笔试,面试题目,效果比想象中的要好,大家气氛很好,踊跃发言,大胆讨论,解决了很多有意思的问题,这里挑出两个题目来记录一下,个人感觉写的很好: 题目是: 本身快被遗忘了的一个题目,被大家的讨论掩盖过去了,可是好题终究还是会被发现,这位大哥就单独告诉我并给出了自己的思路,十分感谢,领教了。 ...

本来突发奇想,想建立一个群来召集各路同行加入,共同讨论数字IC以及FPGA方向的笔试,面试题目,效果比想象中的要好,大家气氛很好,踊跃发言,大胆讨论,解决了很多有意思的问题,这里挑出两个题目来记录一下,个人感觉写的很好:

题目是:

本身快被遗忘了的一个题目,被大家的讨论掩盖过去了,可是好题终究还是会被发现,这位大哥就单独告诉我并给出了自己的思路,十分感谢,领教了。

 


  
  1. module mul8bits(
  2. input clk,
  3. input rst_n,
  4. input [7:0] a,
  5. input [7:0] b,
  6. output reg [15:0] result
  7. );
  8. reg [15:0] areg;
  9. reg [15:0] temp;
  10. reg [3:0] cnt;
  11. always@(posedge clk or negedge rst_n)begin
  12. if(~rst_n) begin
  13. areg <= {8{1'b0}, a};
  14. temp <= 16'd0;
  15. cnt <= 4'd0;
  16. result <= 16'd0;
  17. end
  18. else if(cnt <= 7) begin
  19. cnt <= cnt + 1;
  20. areg <= areg <<1;
  21. if(b[cnt]) begin
  22. temp <= temp + areg;
  23. else temp <= temp;
  24. end
  25. end
  26. else begin
  27. cnt <= cnt;
  28. areg <= {8{1'b0},a};
  29. result <= temp;
  30. end
  31. end
  32. endmodule

上面的Verilog设计中,没有用到IP核,加入有一个IP核的例化模板为:


  
  1. add16 inst_add16(
  2. .in1(), //16bit
  3. .in2(), //16bit
  4. .sout(), //16bit
  5. .cout() //1bit进位
  6. );

当然还必须要求这个IP核必须在一个时钟内完成,是一个组合逻辑,且组合逻辑延迟不能大于一个时钟周期。

那么我们可以更改设计为:


  
  1. module mul8bits(
  2. input clk,
  3. input rst_n,
  4. input [7:0] a,
  5. input [7:0] b,
  6. output reg [15:0] result
  7. );
  8. reg [15:0] areg;
  9. reg [15:0] temp;
  10. reg [3:0] cnt;
  11. always@(posedge clk or negedge rst_n)begin
  12. if(~rst_n) begin
  13. areg <= {8{1'b0}, a};
  14. temp <= 16'd0;
  15. cnt <= 4'd0;
  16. result <= 16'd0;
  17. end
  18. else if(cnt <= 7) begin
  19. cnt <= cnt + 1;
  20. areg <= areg <<1;
  21. if(b[cnt]) temp <= temp_w; //调用IP核
  22. else temp <= temp;
  23. end
  24. else begin
  25. cnt <= cnt;
  26. areg <= {8{1'b0},a};
  27. result <= temp;
  28. end
  29. end
  30. wire [15:0] temp_w;
  31. add16 inst_add16(
  32. .in1(temp),
  33. .in2(areg),
  34. .sout(temp_w),
  35. .cout()
  36. );
  37. endmodule

本想,自己写一个超前进位加法器来代替这个IP核的,后面再写吧,很晚了。

https://blog.csdn.net/Reborn_Lee/article/details/99634895


再给出一个仿真相关的题目:

题目翻译过来就是:

在Verilog中设计模块以满足以下要求。
(1)频率为100MHz的时钟
(2)对时钟敏感的4位宽信号,限制该信号在8到15的范围内随机化16次。

之后也是提问者自己给出的答案,真是提问能激发人的思考呀:

我给出完整代码:


  
  1. `timescale 1ns/1ps
  2. module random1();
  3. reg clk;
  4. reg [3:0] out_rand;
  5. initial begin
  6. clk = 0;
  7. forever
  8. #5 clk = ~clk;
  9. end
  10. //always begin
  11. // #5 clk = ~clk;
  12. //end
  13. integer i;
  14. initial begin
  15. for(i = 0;i < 16; i = i + 1) begin
  16. @(posedge clk) begin
  17. out_rand = 4'b1000+ {$random}%8;
  18. end
  19. end
  20. end
  21. endmodule

OK,谢谢各位。


最后还是要邀请更多的同行加入这个IC前端/FPGA笔试面试交流群,加我微信,拉你进群:ljs521615

见链接:

一年一度的校招又来了一段时间了,突然发现,一个人的力量是有限的,面对很多笔试,面试中的很多问题,也许会感到很无助,于是决定建立一个群,专门用来分享,讨论笔试面试题目。 现诚邀路过的同行加入,共同奋斗,互帮互助。

 

 

 

文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。

原文链接:reborn.blog.csdn.net/article/details/99998952

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。