aboutsummaryrefslogtreecommitdiffstats
path: root/tests/xilinx_ug901/cmult.v
diff options
context:
space:
mode:
Diffstat (limited to 'tests/xilinx_ug901/cmult.v')
-rw-r--r--tests/xilinx_ug901/cmult.v71
1 files changed, 71 insertions, 0 deletions
diff --git a/tests/xilinx_ug901/cmult.v b/tests/xilinx_ug901/cmult.v
new file mode 100644
index 000000000..d5d85a28c
--- /dev/null
+++ b/tests/xilinx_ug901/cmult.v
@@ -0,0 +1,71 @@
+//
+// Complex Multiplier (pr+i.pi) = (ar+i.ai)*(br+i.bi)
+// file: cmult.v
+
+module cmult # (parameter AWIDTH = 16, BWIDTH = 18)
+ (
+ input clk,
+ input signed [AWIDTH-1:0] ar, ai,
+ input signed [BWIDTH-1:0] br, bi,
+ output signed [AWIDTH+BWIDTH:0] pr, pi
+ );
+
+reg signed [AWIDTH-1:0] ai_d, ai_dd, ai_ddd, ai_dddd ;
+reg signed [AWIDTH-1:0] ar_d, ar_dd, ar_ddd, ar_dddd ;
+reg signed [BWIDTH-1:0] bi_d, bi_dd, bi_ddd, br_d, br_dd, br_ddd ;
+reg signed [AWIDTH:0] addcommon ;
+reg signed [BWIDTH:0] addr, addi ;
+reg signed [AWIDTH+BWIDTH:0] mult0, multr, multi, pr_int, pi_int ;
+reg signed [AWIDTH+BWIDTH:0] common, commonr1, commonr2 ;
+
+always @(posedge clk)
+ begin
+ ar_d <= ar;
+ ar_dd <= ar_d;
+ ai_d <= ai;
+ ai_dd <= ai_d;
+ br_d <= br;
+ br_dd <= br_d;
+ br_ddd <= br_dd;
+ bi_d <= bi;
+ bi_dd <= bi_d;
+ bi_ddd <= bi_dd;
+ end
+
+// Common factor (ar ai) x bi, shared for the calculations of the real and imaginary final products
+//
+always @(posedge clk)
+ begin
+ addcommon <= ar_d - ai_d;
+ mult0 <= addcommon * bi_dd;
+ common <= mult0;
+ end
+
+// Real product
+//
+always @(posedge clk)
+ begin
+ ar_ddd <= ar_dd;
+ ar_dddd <= ar_ddd;
+ addr <= br_ddd - bi_ddd;
+ multr <= addr * ar_dddd;
+ commonr1 <= common;
+ pr_int <= multr + commonr1;
+ end
+
+// Imaginary product
+//
+always @(posedge clk)
+ begin
+ ai_ddd <= ai_dd;
+ ai_dddd <= ai_ddd;
+ addi <= br_ddd + bi_ddd;
+ multi <= addi * ai_dddd;
+ commonr2 <= common;
+ pi_int <= multi + commonr2;
+ end
+
+assign pr = pr_int;
+assign pi = pi_int;
+
+endmodule // cmult