非同期乗換え:バス1

概要

バスの乗り換え
(詳細記述予定)

動作確認

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

テストコード

(記述予定)

  1. // ----------------------------------------------------------------------------
  2. // main Operation Setting
  3. // ----------------------------------------------------------------------------
  4. reg [7:0] value;
  5. initial begin
  6. wait(CHECK_START);
  7. @(posedge CLKIN);
  8.  
  9. for(i=0;i<1000;i=i+1)begin
  10. wait(READY);
  11. value = $random;
  12. DIEN <= #DLY 1;
  13. DI <= #DLY value;
  14. @(posedge CLKIN);
  15. DIEN <= #DLY 0;
  16. DI <= #DLY 'bx;
  17.  
  18. while(!READY) @(posedge CLKIN);
  19.  
  20. end
  21.  
  22. $display("");
  23. $display("NOTE : [%m] Main Task is completed. -- %t", $time);
  24. TASKS[0] = 1'b1;
  25. end
  26.  
  27. // -------------------------------------------------------------------------------
  28. // Output Compare Operation Setting
  29. // -------------------------------------------------------------------------------
  30. initial begin
  31. wait(CHECK_START);
  32. ref_DOEN = 0;
  33. for(j=0;j<1000;j=j+1)begin
  34. wait(DOEN);
  35. ref_DOEN = 1;
  36. ref_DO = value;
  37. @(posedge CLKOT);
  38. ref_DOEN = 0;
  39. ref_DO = 0;
  40. @(posedge CLKOT);
  41. end
  42.  
  43.  
  44. $display("");
  45. $display("NOTE : [%m] Output Compare Task is completed. -- %t", $time);
  46. TASKS[1] = 1'b1;
  47. end

ソースコード

(記述予定)

ASYNC_BUS
  1. module ASYNC_BUS(
  2. CLKIN ,
  3. CLKOT ,
  4. RST_X ,
  5. DIEN ,
  6. DI ,
  7. READY ,
  8. DOEN ,
  9. DO
  10. );
  11. // Parameter //
  12. parameter P_WIDTH = 8; // P : data bus width
  13. // Port //
  14. input CLKIN; // C : Clock
  15. input CLKOT; // C : Clock
  16. input RST_X; // R : Reset
  17. input DIEN; // I : Data in enable
  18. input [P_WIDTH-1:0] DI; // I : Data in
  19. output READY; // O : ready
  20. output DOEN; // O : Data out enable
  21. output [P_WIDTH-1:0] DO; // O : Data out
  22.  
  23. //////////////////////////////////////////////////////////////////////////////////
  24. // net //
  25. //////////////////////////////////////////////////////////////////////////////////
  26.  
  27. // Input port //
  28. wire [P_WIDTH-1:0] w_dat; //
  29. wire w_ack; //
  30.  
  31. //******************************************************************************//
  32. // RTL //
  33. //******************************************************************************//
  34.  
  35. // Parameter //
  36.  
  37. // simulation Parameter //
  38. parameter DLY = 1; // cell delay
  39.  
  40. //////////////////////////////////////////////////////////////////////////////////
  41. // Instance //
  42. //////////////////////////////////////////////////////////////////////////////////
  43.  
  44. ASYNC_BUS_TRN #(
  45. P_WIDTH // WIDTH
  46. )
  47. u_async_bus_trn (
  48. .CLK (CLKIN ),
  49. .RST_X (RST_X ),
  50. .DEN (DIEN ),
  51. .DI (DI ),
  52. .ACK (w_ack ),
  53. .REQ (w_req ),
  54. .READY (READY ),
  55. .DO (w_dat )
  56. );
  57.  
  58. ASYNC_BUS_RCV #(
  59. P_WIDTH // WIDTH
  60. )
  61. u_async_bus_rcv (
  62. .CLK (CLKOT ),
  63. .RST_X (RST_X ),
  64. .REQ (w_req ),
  65. .DI (w_dat ),
  66. .DEN (DOEN ),
  67. .DO (DO ),
  68. .ACK (w_ack )
  69. );
  70.  
  71. endmodule

ASYNC_BUS_RCV
  1. module ASYNC_BUS_RCV(
  2. CLK ,
  3. RST_X ,
  4. REQ ,
  5. DI ,
  6. DEN ,
  7. DO ,
  8. ACK
  9. );
  10. // parameter //
  11. parameter P_WIDTH = 8; // P : data bus width
  12. // Port //
  13. input CLK; // C : Clock
  14. input RST_X; // R : Reset
  15. input REQ; // I : Request
  16. input [P_WIDTH-1:0] DI; // I : Data in
  17. output DEN; // O : Data enable
  18. output [P_WIDTH-1:0] DO; // O : Data out
  19. output ACK; // O : Ack
  20.  
  21. //////////////////////////////////////////////////////////////////////////////////
  22. // Register //
  23. //////////////////////////////////////////////////////////////////////////////////
  24.  
  25. // Async Buffer //
  26. reg r_req_1d; //
  27. reg r_req_2d; //
  28. // Output Port //
  29. reg r_den; //
  30. reg [P_WIDTH-1:0] r_do; //
  31. reg r_ack; //
  32.  
  33. // state machine //
  34. reg [1:0] r_async_st; //
  35.  
  36. //////////////////////////////////////////////////////////////////////////////////
  37. // net //
  38. //////////////////////////////////////////////////////////////////////////////////
  39.  
  40. // Input Port //
  41. wire w_req; //
  42. wire [P_WIDTH-1:0] w_di; //
  43. // state machine //
  44. reg [1:0] w_async_st; //
  45.  
  46. //******************************************************************************//
  47. // RTL //
  48. //******************************************************************************//
  49.  
  50. // Parameter //
  51.  
  52. // simulation Parameter //
  53. parameter DLY = 1; // cell delay
  54. // parameter //
  55. // state machine //
  56. parameter ST_IDLE = 2'b00; //
  57. parameter ST_ACK = 2'b01; //
  58. parameter ST_OUT = 2'b10; //
  59.  
  60. // connect Input Port //
  61. assign w_req = REQ; //
  62. assign w_di = DI; //
  63.  
  64. // connect Output Port //
  65. assign DEN = r_den; //
  66. assign DO = r_do; //
  67. assign ACK = r_ack; //
  68.  
  69.  
  70. //----------------------------------------------------------------------------//
  71. // State machine //
  72. //----------------------------------------------------------------------------//
  73.  
  74. // DFF //
  75. always @ (posedge CLK or negedge RST_X) begin
  76. if (~RST_X) begin
  77. r_async_st <= #DLY ST_IDLE;
  78. end else begin
  79. r_async_st <= #DLY w_async_st;
  80. end
  81. end
  82.  
  83. // Gate //
  84. always @ (r_async_st or r_req_2d) begin
  85. case(r_async_st)
  86. // idle //
  87. ST_IDLE : begin
  88. if(r_req_2d)begin
  89. w_async_st <= ST_ACK;
  90. end else begin
  91. w_async_st <= ST_IDLE;
  92. end
  93. end
  94. // send ack //
  95. ST_ACK : begin
  96. if(~r_req_2d)begin
  97. w_async_st <= ST_OUT;
  98. end else begin
  99. w_async_st <= ST_ACK;
  100. end
  101. end
  102. // request //
  103. ST_OUT : begin
  104. w_async_st <= ST_IDLE;
  105. end
  106. // illigal state. //
  107. default : begin
  108. w_async_st <= ST_IDLE;
  109. end
  110. endcase
  111. end
  112.  
  113. // ACK //
  114. always @ (posedge CLK or negedge RST_X) begin
  115. if (~RST_X) begin
  116. r_ack <= #DLY 1'b0;
  117. end else begin
  118. if(w_async_st==ST_ACK)begin
  119. r_ack <= #DLY 1'b1;
  120. end else begin
  121. r_ack <= #DLY 1'b0;
  122. end
  123. end
  124. end
  125.  
  126. // Data & Enable //
  127. always @ (posedge CLK or negedge RST_X) begin
  128. if (~RST_X) begin
  129. r_den <= #DLY 1'd0;
  130. r_do <= #DLY {P_WIDTH{1'b0}};
  131. end else begin
  132. if(w_async_st==ST_OUT)begin
  133. r_den <= #DLY 1'b1;
  134. r_do <= #DLY w_di;
  135. end else begin
  136. r_den <= #DLY 1'b0;
  137. r_do <= #DLY {P_WIDTH{1'b0}};
  138. end
  139. end
  140. end
  141.  
  142. //////////////////////////////////////////////////////////////////////////////////
  143. // Async Buffer //
  144. //////////////////////////////////////////////////////////////////////////////////
  145. always @ (posedge CLK or negedge RST_X) begin
  146. if (~RST_X) begin
  147. r_req_1d<= #DLY 1'd0;
  148. r_req_2d<= #DLY 1'd0;
  149. end else begin
  150. r_req_1d<= #DLY w_req;
  151. r_req_2d<= #DLY r_req_1d;
  152. end
  153. end
  154.  
  155. endmodule

ASYNC_BUS_TRN
  1. module ASYNC_BUS_TRN(
  2. CLK ,
  3. RST_X ,
  4. DEN ,
  5. DI ,
  6. ACK ,
  7. REQ ,
  8. DO ,
  9. READY
  10. );
  11. // parameter //
  12. parameter P_WIDTH = 8; // P : data bus width
  13. // Port //
  14. input CLK; // C : Clock
  15. input RST_X; // R : Reset
  16. input DEN; // I : Data enable
  17. input [P_WIDTH-1:0] DI; // I : Data in
  18. input ACK; // I : ack
  19. output REQ; // O : request
  20. output [P_WIDTH-1:0] DO; // O : Data out
  21. output READY; // O : ready
  22.  
  23. //////////////////////////////////////////////////////////////////////////////////
  24. // Register //
  25. //////////////////////////////////////////////////////////////////////////////////
  26.  
  27. // Async Buffer //
  28. reg r_ack_1d; //
  29. reg r_ack_2d; //
  30. // output buffer //
  31. reg r_req; //
  32. reg [P_WIDTH-1:0] r_do; //
  33. // state machine //
  34. reg [1:0] r_async_st; //
  35.  
  36. //////////////////////////////////////////////////////////////////////////////////
  37. // net //
  38. //////////////////////////////////////////////////////////////////////////////////
  39.  
  40. // Input port //
  41. wire w_den; //
  42. wire [P_WIDTH-1:0] w_di; //
  43. wire w_ack; //
  44. // Output port //
  45. wire w_ready; //
  46.  
  47. // state machine //
  48. reg [1:0] w_async_st; //
  49.  
  50. //******************************************************************************//
  51. // RTL //
  52. //******************************************************************************//
  53.  
  54. // Parameter //
  55. // simulation Parameter //
  56. parameter DLY = 1; // cell delay
  57. // state machine //
  58. parameter ST_IDLE = 2'b00; //
  59. parameter ST_REQ = 2'b01; //
  60. parameter ST_ACK = 2'b10; //
  61.  
  62. // External pin //
  63. // connect Input Port //
  64. assign w_den = DEN; //
  65. assign w_di = DI; //
  66. assign w_ack = ACK; //
  67. // connect Output Port //
  68. assign REQ = r_req; //
  69. assign DO = r_do; //
  70. assign READY = w_ready; //
  71.  
  72. //----------------------------------------------------------------------------//
  73. // State Machine //
  74. //----------------------------------------------------------------------------//
  75.  
  76. // DFF //
  77. always @ (posedge CLK or negedge RST_X) begin
  78. if (~RST_X) begin
  79. r_async_st <= #DLY ST_IDLE;
  80. end else begin
  81. r_async_st <= #DLY w_async_st;
  82. end
  83. end
  84.  
  85. // Gate //
  86. always @ (r_async_st or w_den or r_ack_2d) begin
  87. case(r_async_st)
  88. // idle //
  89. ST_IDLE : begin
  90. if(w_den)begin
  91. w_async_st <= ST_REQ;
  92. end else begin
  93. w_async_st <= ST_IDLE;
  94. end
  95. end
  96. // send request //
  97. ST_REQ : begin
  98. if(r_ack_2d)begin
  99. w_async_st <= ST_ACK;
  100. end else begin
  101. w_async_st <= ST_REQ;
  102. end
  103. end
  104. // wait until finished ack //
  105. ST_ACK : begin
  106. if(~r_ack_2d)begin
  107. w_async_st <= ST_IDLE;
  108. end else begin
  109. w_async_st <= ST_ACK;
  110. end
  111. end
  112. // illigal state. //
  113. default : begin
  114. w_async_st <= ST_IDLE;
  115. end
  116. endcase
  117. end
  118.  
  119. //----------------------------------------------------------------------------//
  120. // Output //
  121. //----------------------------------------------------------------------------//
  122.  
  123. // REQ //
  124. always @ (posedge CLK or negedge RST_X) begin
  125. if (~RST_X) begin
  126. r_req <= #DLY 1'b0;
  127. end else begin
  128. if(w_async_st==ST_REQ)begin
  129. r_req <= #DLY 1'b1;
  130. end else begin
  131. r_req <= #DLY 1'b0;
  132. end
  133. end
  134. end
  135.  
  136. // Data //
  137. always @ (posedge CLK or negedge RST_X) begin
  138. if (~RST_X) begin
  139. r_do <= #DLY {P_WIDTH{1'b0}};
  140. end else begin
  141. if(w_den & r_async_st==ST_IDLE)begin
  142. r_do <= #DLY w_di;
  143. end
  144. end
  145. end
  146.  
  147. // READY //
  148. assign w_ready = ~( w_den | r_req | r_ack_2d);
  149.  
  150. //////////////////////////////////////////////////////////////////////////////////
  151. // Async Buffer //
  152. //////////////////////////////////////////////////////////////////////////////////
  153.  
  154. always @ (posedge CLK or negedge RST_X) begin
  155. if (~RST_X) begin
  156. r_ack_1d <= #DLY 1'd0;
  157. r_ack_2d <= #DLY 1'd0;
  158. end else begin
  159. r_ack_1d <= #DLY w_ack;
  160. r_ack_2d <= #DLY r_ack_1d;
  161. end
  162. end
  163.  
  164. endmodule














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