FPGA|CPLD|ASIC论坛
直播中

清水河

14年用户 180经验值
擅长:8707
私信 关注
[经验]

【FPGA经典试题】FPGA的乘法运算Verilog 模块、DPRAM 的设计模块

FPGA经典试题】FPGA的乘法运算Verilog 模块、DPRAM 的设计模块
⑴ 请参看如下文章,写出文中的关键点;
⑵ 写出当外部同时输入了时钟和reset 信号,两个8bit 补码数的乘法运算的
Verilog 模块;
⑶ 写出当外部同时输入了时钟和reset 信号,DPRAM 的设计代码;
1.文中重要讲的事复位方式的选择会影响设计性能。乘法器和RAMs 的寄存器只
能使用同步复位。
【FPGA经典试题】FPGA的乘法运算Verilog 模块、DPRAM 的设计模块

⑵ 写出当外部同时输入了时钟和reset 信号,两个8bit 补码数的乘法运算的
Verilog 模块;


  1. 2.
  2. module mul_8bit(clk,reset,multiplicand,multiplier,ValOut); //start
  3. parameter width = 8;
  4. input clk;
  5. input reset;
  6. //input start;
  7. input [7:0] multiplicand;
  8. input [7:0] multiplier;
  9. output [15:0] ValOut;
  10. reg [15:0] ValOut;
  11. wire [7:0] mulD;
  12. wire [7:0] mulR;

  13. wire sign1,sign2,sign3,sign4;
  14. wire one1,one2,one3,one4;
  15. wire two1,two2,two3,two4;
  16. //·ûºÅsign=~A[2n+1] & (A[2n]|
  17. A[2n-1])£»sign±íʾ·ûºÅλ£¬μ±ÆäΪ1ʱ£¬Ôò²¼Ë¹±àÂëÈ¡Õý£»·´Ö®£¬È¡¸º¡£
  18. A[-1] ²¹Áã¼´A[-1]=0
  19. assign sign1 = ~mulR[1] & (mulR[0] | 0);
  20. assign sign2 = ~mulR[3] & (mulR[2] | mulR[1]);
  21. assign sign3 = ~mulR[5] & (mulR[4] | mulR[3]);
  22. assign sign4 = ~mulR[7] & (mulR[6] | mulR[5]);
  23. //one; one=A[2n]^A[2n-1]£»Èôone=1,Ôò²¿·Ö»ýΪb£»·ñÔòΪ0¡£
  24. assign one1 = mulR[0]^0;
  25. assign one2 = mulR[2]^mulR[1];
  26. assign one3 = mulR[4]^mulR[3];
  27. assign one4 = mulR[6]^mulR[5];
  28. //two=(¡«A[2n+1]&A[2n]&A[2n-1])|(A[2n+1]&¡«A[2n]&¡«A[2n-1])£»ÈôtwoΪ1£¬Ô
  29. ò²¿·Ö»ýΪ2b£»·ñÔòΪ0¡£
  30. assign two1 = (~mulR[1] & mulR[0] & 0)|(mulR[1] & ~mulR[0] & 1);
  31. assign two2 = (~mulR[3] & mulR[2] & mulR[1])|(mulR[3] & ~mulR[2] &
  32. ~mulR[1]);
  33. assign two3 = (~mulR[5] & mulR[4] & mulR[3])|(mulR[5] & ~mulR[4] &
  34. ~mulR[3]);
  35. assign two4 = (~mulR[7] & mulR[6] & mulR[5])|(mulR[7] & ~mulR[6] &
  36. ~mulR[5]);
  37. //·ûºÅÀ©Õ¹
  38. wire [15:0] temp;
  39. assign temp = {{8{mulD[7]}},mulD[7:0]};
  40. // ¼ÆËãÊä³ö

  41. wire [15:0] dat_w1,dat_w2,dat_w3,dat_w4;
  42. //- 2 * B = = (~ (B << 1)) + 1 ;2B= (B<<1);
  43. assign dat_w1 = (two1) ? ((sign1) ? {temp[14:0],1'b0}:(~{temp[14:0],1'b0} + 1'b1 ) ) :
  44. ((one1) ? ((sign1) ? temp :{~temp+1'b1} ) : 0);
  45. assign dat_w2 = (two2) ? ((sign2) ? {temp[14:0],1'b0}: (~{temp[14:0],1'b0} + 1'b1 )) :
  46. ((one2) ? ((sign2) ? temp :{~temp+1'b1} ) : 0);
  47. assign dat_w3 = (two3) ? ((sign3) ? {temp[14:0],1'b0}:(~{temp[14:0],1'b0} + 1'b1 ) ) :
  48. ((one3) ? ((sign3) ? temp :{~temp+1'b1} ) : 0);
  49. assign dat_w4 = (two4) ? ((sign4) ? {temp[14:0],1'b0}:(~{temp[14:0],1'b0} + 1'b1 ) ) :
  50. ((one4) ? ((sign4) ? temp :{~temp+1'b1}) : 0);
  51. //assign ValOut = dat_w1 + {dat_w2[13:0],2'b00} + {dat_w3[11:0],4'b0000} +
  52. {dat_w4[9:0],6'b000000};
  53. assign mulD = multiplicand;
  54. assign mulR = multiplier;
  55. always @(posedge clk) begin
  56. if(!reset) begin
  57. ValOut <= 0;
  58. end
  59. else begin
  60. ValOut <= dat_w1 + {dat_w2[13:0],2'b00} + {dat_w3[11:0],4'b0000}
  61. + {dat_w4[9:0],6'b000000};
  62. end
  63. end
  64. endmodule


⑶ 写出当外部同时输入了时钟和reset 信号,DPRAM 的设计代码;


  1. 3.
  2. module reg_dpram(Data,Q,clk,reset,WE,RE,Waddress,Raddress);
  3. parameter width = 8;
  4. parameter depth = 8;
  5. parameter addr = 3;
  6. input clk,WE,RE;
  7. input reset;
  8. input [addr-1:0] Waddress,Raddress;
  9. input [width-1:0] data;
  10. output [width-1:0] Q;
  11. reg [width-1:0] Q;
  12. reg [width-1:0] in_reg;
  13. reg [width-1:0] mem_data [depth-1:0];
  14. //写RAM
  15. Always @(posedge clk) begin
  16. if(~reset) begin
  17. in_reg <= 0;
  18. end
  19. else begin
  20. in_reg <= Data;
  21. end
  22. end
  23. always @(posedge clk) begin
  24. if(WE) begin
  25. mem_data[Waddress] <= in_reg;
  26. end
  27. emd
  28. //读数据
  29. always @(posedge clk) begin
  30. if(~reset) begin
  31. Q <= 0;
  32. end
  33. else begin
  34. Q <= mem_data[Raddress];
  35. end
  36. end

回帖(1)

柯有哲

2013-12-12 00:02:04
不错,好东东蛮好
举报

更多回帖

发帖
×
20
完善资料,
赚取积分