平方根1

概要

(詳細記述予定)

動作確認

ツール バージョン 結果
ncverilog 未確認
VCS-MX 未確認
ModelSim 未確認

テストコード

(記述予定)

  1. initial begin
  2. wait(CHECK_START);
  3.  
  4. DAT <= #DLY 9;
  5. REQ <= #DLY 1; repeat( 1)@(posedge CLK);
  6. REQ <= #DLY 0; repeat(20)@(posedge CLK);
  7.  
  8. DAT <= #DLY 16;
  9. REQ <= #DLY 1; repeat( 1)@(posedge CLK);
  10. REQ <= #DLY 0; repeat(20)@(posedge CLK);
  11.  
  12. DAT <= #DLY 100;
  13. REQ <= #DLY 1; repeat( 1)@(posedge CLK);
  14. REQ <= #DLY 0; repeat(12)@(posedge CLK);
  15.  
  16. DAT <= #DLY 9;
  17. REQ <= #DLY 1; repeat( 1)@(posedge CLK);
  18. REQ <= #DLY 0; repeat(11)@(posedge CLK);
  19.  
  20. DAT <= #DLY 200;
  21. REQ <= #DLY 1; repeat( 1)@(posedge CLK);
  22. REQ <= #DLY 0; repeat(10)@(posedge CLK);
  23.  
  24. DAT <= #DLY 22'h3FFFFF;
  25. REQ <= #DLY 1; repeat( 1)@(posedge CLK);
  26. REQ <= #DLY 0; repeat(20)@(posedge CLK);
  27.  
  28. DAT <= #DLY 22'h3FFFFF;
  29. REQ <= #DLY 1; repeat(20)@(posedge CLK);
  30. REQ <= #DLY 0; repeat(20)@(posedge CLK);
  31.  
  32. $display("");
  33. $display("NOTE : [%m] Main Task is completed. -- %t", $time);
  34. TASKS[0] = 1'b1;
  35. end

ソースコード

(記述予定)

sqrt_mod2
  1. module sqrt_mod2 (
  2. CLK,
  3. RST_N,
  4. REQ,
  5. DAT,
  6. ACK,
  7. NAK,
  8. SQRT
  9. );
  10.  
  11. input CLK; // C :
  12. input RST_N; // R :
  13. input REQ; // I :
  14. input [21:0] DAT; // I :
  15. output ACK; // O :
  16. output NAK; // O :
  17. output [10:0] SQRT; // O :
  18.  
  19. // **** Wire,Reg **** //
  20. reg NAK;
  21. wire ACK;
  22.  
  23. reg [12:0] r_req_dly;
  24. reg [ 1:0] r_buf_dat;
  25. wire [10:0] rout;
  26. wire [10:0] delta_out;
  27. wire w_busy;
  28. integer cnt;
  29.  
  30. // **** assign **** //
  31.  
  32. assign ACK = r_req_dly[12];
  33. assign SQRT = rout;
  34. assign w_busy = | r_req_dly[11:0];
  35.  
  36. always @(posedge CLK or negedge RST_N)begin
  37. if(!RST_N)begin
  38. r_req_dly <= 0;
  39. cnt <= 0;
  40. end else begin
  41. r_req_dly <= {r_req_dly[11:0],REQ & ~w_busy};
  42.  
  43. if(REQ & w_busy)begin
  44. NAK <= REQ;
  45. end else begin
  46. NAK <= 0;
  47. end
  48.  
  49. if(w_busy)begin
  50. if(cnt==10)begin
  51. cnt <= 10;
  52. end else begin
  53. cnt <= cnt + 1;
  54. end
  55. case(cnt)
  56. 0 : r_buf_dat <= DAT[21:20];
  57. 1 : r_buf_dat <= DAT[19:18];
  58. 2 : r_buf_dat <= DAT[17:16];
  59. 3 : r_buf_dat <= DAT[15:14];
  60. 4 : r_buf_dat <= DAT[13:12];
  61. 5 : r_buf_dat <= DAT[11:10];
  62. 6 : r_buf_dat <= DAT[ 9: 8];
  63. 7 : r_buf_dat <= DAT[ 7: 6];
  64. 8 : r_buf_dat <= DAT[ 5: 4];
  65. 9 : r_buf_dat <= DAT[ 3: 2];
  66. 10 : r_buf_dat <= DAT[ 1: 0];
  67. default : r_buf_dat <= 'bx;
  68. endcase
  69. end else begin
  70. cnt <= 0;
  71. r_buf_dat <= 0;
  72. end
  73. end
  74. end
  75.  
  76. sqrt_calc sqrt_calc (
  77. .CLK (CLK ),
  78. .RST_N (RST_N ),
  79. .DIN_EN (w_busy ),
  80. .DIN (r_buf_dat),
  81. .RIN (rout ),
  82. .DELIN (delta_out),
  83. .ROUT (rout ),
  84. .DELOUT (delta_out)
  85. );
  86. endmodule

sqrt_calc
  1. module sqrt_calc (
  2. CLK,
  3. RST_N,
  4. DIN_EN,
  5. DIN,
  6. RIN,
  7. DELIN,
  8. ROUT,
  9. DELOUT
  10. );
  11.  
  12. input CLK; // C : Main Clock
  13. input RST_N; // R : Asynchronous Reset
  14. input DIN_EN; // I : Data Enable
  15. input [1:0] DIN; // I : Data Input
  16. input [10:0] RIN; // I : Result Input
  17. input [10:0] DELIN; // I : Delta Input
  18. output [10:0] ROUT; // O : Result Output
  19. output [10:0] DELOUT; // O : Delta Output
  20.  
  21. // **** Wire,Reg **** //
  22. reg [10:0] ROUT; // Result Output
  23. reg [12:0] r_delout; // Delta Output
  24. wire w_big_flg; // Data Judge Flag
  25.  
  26. assign w_big_flg = ({DELIN, DIN} >= {RIN, 2'b01});
  27. assign DELOUT = r_delout[10:0];
  28.  
  29. always @ (posedge CLK or negedge RST_N) begin
  30. if (!RST_N) begin
  31. ROUT <= 11'h000;
  32. r_delout <= 13'h000;
  33. end
  34. else if (!DIN_EN) begin
  35. ROUT <= 11'h000;
  36. r_delout <= 13'h000;
  37. end
  38. else begin
  39. if (w_big_flg) begin
  40. ROUT <= {RIN[9:0], 1'b1};
  41. r_delout <= ({DELIN, DIN} - {RIN, 2'b01});
  42. end
  43. else begin
  44. ROUT <= {RIN[9:0], 1'b0};
  45. r_delout <= {DELIN, DIN};
  46. end
  47. end
  48. end
  49. endmodule















最終更新:2008年11月21日 11:45