Advertisement
Chinnani

Untitled

Mar 31st, 2016
1,048
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.61 KB | None | 0 0
  1. module TwoPButterfly( input wire en, input wire clk, input wire [63:0]inr1,ini1,inr2,ini2,
  2. output reg [63:0]outr1,outi1,outr2,outi2);
  3.  
  4. add_sub adder1(en,clk,inr1[63],inr2[63],inr1[62:52],inr2[62:52],inr1[51:0],inr2[51:0],1'b0,outr1[63],outr1[62:52],outr1[51:0]);
  5. add_sub adder2(en,clk,ini1[63],ini2[63],ini1[62:52],ini2[62:52],ini1[51:0],ini2[51:0],1'b0,outi1[63],outi1[62:52],outi1[51:0]);
  6.  
  7.  
  8. add_sub subtractor1(en,clk,inr1[63],inr2[63],inr1[62:52],inr2[62:52],inr1[51:0],inr2[51:0],1'b1,outr2[63],outr2[62:52],outr2[51:0]);
  9. add_sub subtractor2(en,clk,ini1[63],ini2[63],ini1[62:52],ini2[62:52],ini1[51:0],ini2[51:0],1'b1,outi2[63],outi2[62:52],outi2[51:0]);
  10.  
  11. endmodule
  12.  
  13. ---------------------------------------------------------------
  14. // adder/subtractor module
  15. module add_sub(input wire en, input wire clk, input wire S1,S2,
  16. input wire[10:0]E1, input wire [10:0]E2,
  17. input wire[51:0]F1,input wire [51:0]F2,
  18. input wire aors,
  19. output reg S,output reg[10:0]E,output reg[51:0]F);
  20.  
  21. wire [63:0]in1,in2,out;
  22. reg [10:0]e,Ei;
  23. wire [52:0]f1,f2;
  24. reg [52:0]f,Fs,Fi1;
  25. reg [53:0]Fi;
  26. wire s1,s2;
  27. assign f1={1'b1,F1};
  28. assign f2={1'b1,F2};
  29.  
  30. xor a1(s1,S2,aors);
  31. xor a2(s2,s1,S1);
  32. assign in1={S1,E1,F1};
  33. assign in2={S2,E2,F2};
  34.  
  35.  
  36. always@(posedge clk, E1,E2,S1,S2,F1,F2,aors)
  37. begin
  38. if(en == 1)
  39. begin
  40. if(E1>E2)
  41. Ei=E1;
  42. else
  43. Ei=E2;
  44.  
  45. if(E1>E2)
  46. e=E1-E2;
  47. else
  48. e=E2-E1;
  49.  
  50. if(E1>E2)
  51. f=f2>>e;
  52. else
  53. f=f1>>e;
  54. end
  55. end
  56.  
  57. always@(*)
  58. begin
  59. if(en == 1)
  60. begin
  61. if(s2==0)
  62. S=S1;
  63. else
  64. begin
  65. if(E1>E2)
  66. begin
  67. if(f1>f)
  68. S=S1;
  69. else
  70. S=s1;
  71. end
  72. else
  73. begin
  74. if(f2>f)
  75. S=s1;
  76. else
  77. S=S1;
  78. end
  79. end
  80. end
  81. end
  82.  
  83.  
  84. always@(*)
  85. begin
  86. if(en == 1)
  87. begin
  88. if(s2 == 1)
  89. begin
  90. if(E1>E2)
  91. begin
  92. if(f1>f)
  93. Fs=f1-f;
  94. else
  95. Fs=f-f1;
  96. end
  97. else
  98. begin
  99. if(f2>f)
  100. Fs=f2-f;
  101. else
  102. Fs=f-f2;
  103. end
  104. end
  105. end
  106. end
  107.  
  108. integer j=0;
  109. always@(*)
  110. begin
  111. if(en == 1)
  112. begin
  113. if(s2==0)
  114. begin
  115. if(E1>E2)
  116. Fi=f1+f;
  117. else
  118. Fi=f2+f;
  119. end
  120. else
  121. Fi={1'b0,Fs};
  122. //Normalization
  123. if(Fi[53] != 1'b1)
  124. begin
  125. Fi1 = Fi;
  126. Ei = Ei+1;
  127. while(Fi[53]!= 1 && j<54)
  128. begin
  129. Fi = Fi<<1;
  130. Ei = Ei - 1;
  131. j = j+1;
  132. end
  133. j=0;
  134. F= Fi[52:1];
  135. E=Ei;
  136. end
  137. else
  138. begin
  139. Fi1 = Fi;
  140. F=Fi[52:1];
  141. E=Ei + 1;
  142. end
  143. end
  144. end
  145. assign out = (en) ? {S,E,F} : 64'b0;
  146.  
  147. endmodule
  148.  
  149. ------------------------------------------------------------------
  150. //Testbench
  151.  
  152. module TwoPButterfly_tb;
  153.  
  154. reg en,clk;
  155. reg [63:0]inr1,ini1,inr2,ini2;
  156.  
  157. wire [63:0]outr1,outi1,outr2,outi2;
  158.  
  159. TwoPButterfly T1(en,clk,inr1,ini1,inr2,ini2,outr1,outi1,outr2,outi2);
  160.  
  161. always #5 clk <= ~clk;
  162.  
  163. initial
  164. begin
  165. clk = 1'b0;
  166. en = 1'b1;
  167.  
  168. #4
  169. // 7+7i , 6+6i
  170. inr1 <= 64'b0100000000011100000000000000000000000000000000000000000000000000;
  171. ini1 <= 64'b0100000000011100000000000000000000000000000000000000000000000000;
  172. inr2 <= 64'b0100000000011000000000000000000000000000000000000000000000000000;
  173. ini2 <= 64'b0100000000011000000000000000000000000000000000000000000000000000;
  174.  
  175. #5
  176. //10+3i , 5+4i
  177. inr1 <= 64'b0100000000100100000000000000000000000000000000000000000000000000;
  178. ini1 <= 64'b0100000000001000000000000000000000000000000000000000000000000000;
  179. inr2 <= 64'b0100000000010100000000000000000000000000000000000000000000000000;
  180. ini2 <= 64'b0100000000010000000000000000000000000000000000000000000000000000;
  181.  
  182. end
  183. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement