Advertisement
Guest User

Untitled

a guest
Nov 24th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.01 KB | None | 0 0
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 11:40:13 04/05/2017
  7. // Design Name:
  8. // Module Name: ctrlpush
  9. // Project Name:
  10. // Target Devices:
  11. // Tool versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module ctrlpush(
  22. input clk,
  23. input reset,
  24. input start,
  25. input [7:0] mdout,
  26. input [7:0] size,
  27. input [7:0] din,
  28. output sizeinc,
  29. output mwen,
  30. output [7:0] maddr,
  31. output [7:0] mdin,
  32. output done
  33. );
  34.  
  35. /* STATE MACHINE */
  36. // registers for one-hot
  37. wire d_idle, d_init, d_parent, d_comp, d_done;
  38. wire q_idle, q_init, q_parent, q_comp, q_done;
  39.  
  40. dff1s dff_idle(.clk(clk),
  41. .clr(1'b0),
  42. .set(reset),
  43. .d(d_idle),
  44. .q(q_idle) );
  45. dff1s dff_init(.clk(clk),
  46. .clr(reset),
  47. .set(1'b0),
  48. .d(d_init),
  49. .q(q_init) );
  50. dff1s dff_parent(.clk(clk),
  51. .clr(reset),
  52. .set(1'b0),
  53. .d(d_parent),
  54. .q(q_parent) );
  55. dff1s dff_comp(.clk(clk),
  56. .clr(reset),
  57. .set(1'b0),
  58. .d(d_comp),
  59. .q(q_comp) );
  60. dff1s dff_done(.clk(clk),
  61. .clr(reset),
  62. .set(1'b0),
  63. .d(d_done),
  64. .q(q_done) );
  65.  
  66. // state logic
  67. assign d_idle = (q_done) | (q_idle & ~start);
  68. assign d_init = (q_idle & start);
  69. assign d_parent = (q_init & size_gt_0) | (q_comp & din_lt_p & ~idx_div2_eq_1);
  70. assign d_comp = (q_parent);
  71. assign d_done = (q_comp & (din_gte_p | idx_div2_eq_1)) | (q_init & ~size_gt_0);
  72.  
  73. // state logic components
  74. wire size_gt_0, din_lt_p, idx_div2_eq_1, din_gte_p;
  75. assign size_gt_0 = (size[7:0] > 0);
  76. assign din_lt_p = (din[7:0] < p[7:0]);
  77. assign idx_div2_eq_1 = ({1'b0, idx[7:1]} == 1);
  78. assign din_gte_p = (din[7:0] >= p[7:0]);
  79.  
  80. /* DATAPATH */
  81. // registers
  82. reg [7:0]d_idx; // memory address
  83. wire [7:0]idx;
  84. reg8e reg_idx(.clk(clk),
  85. .reset(reset),
  86. .en(q_init | q_comp),
  87. .d(d_idx),
  88. .q(idx) );
  89.  
  90. wire [7:0]p; // value of parent
  91. reg8e reg_p(.clk(clk),
  92. .reset(reset),
  93. .en(q_init | q_parent),
  94. .d(mdout),
  95. .q(p) );
  96.  
  97. reg [7:0]d_maddr;
  98. reg [7:0]d_mdin;
  99. reg d_mwen;
  100.  
  101. always @ (q_idle or q_init or q_parent or q_comp or q_done or din_lt_p)
  102. if(q_idle) begin
  103. // do nothing
  104. d_idx = 8'b00000000;
  105. d_maddr = 8'b00000000;
  106. d_mdin = 8'b00000000;
  107. d_mwen = 1'b0;
  108. end else if(q_init) begin
  109. d_mwen = 1'b0;
  110. d_idx = size[7:0] + 1;
  111. end else if(q_parent) begin
  112. d_maddr = {1'b0, d_idx[7:1]};
  113. d_mwen = 1'b0;
  114. end else if(q_comp) begin
  115. if(din_lt_p) begin
  116. d_mwen = 1'b1;
  117. d_maddr = idx[7:0];
  118. d_mdin = p[7:0];
  119. d_idx = {1'b0, idx[7:1]};
  120. end
  121. end else if(q_done) begin
  122. d_mwen = 1'b1;
  123. d_maddr = idx[7:0];
  124. d_mdin = din[7:0];
  125. end
  126.  
  127. assign sizeinc = q_init;
  128. assign done = q_done;
  129. assign maddr = d_maddr;
  130. assign mdin = d_mdin;
  131. assign mwen = d_mwen;
  132.  
  133. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement