www.pudn.com > dds_quicklogic.zip > PNGEN.V
/******************************************************************************* **************************************************************************** ** ** ** Project Name : DDS ** ** Author : Daniel J. Morelli ** Creation Date : 04/10/96 20:32:05 ** Version Number : 1.0 ** ** Revision History : ** ** Date Initials Modification ** ** ** Description : ** ** This module is a pair of GOLD code PN generators of length n=31. ** These PN generators can be used to output random I and Q data to ** BPSK or QPSK mmodulate the NCO. ref Peterson and Weldon (1972). ** ** *******************************************************************************/ module pngen( RESETN, // global reset PNCLK, // PN generator clock IDATA, // I axis data QDATA); // Q axis data // Port types input PNCLK, RESETN; output IDATA, QDATA; reg[4:0] pnig1; // I pn code generator 1 g1(p) = p^5 + p^2 + 1 reg[4:0] pnig2; // I pn code generator 2 reg[4:0] pnqg1; // Q pn code generator 1 g2(p) = p^5 + p^4 + P^2 + p + 1 reg[4:0] pnqg2; // Q pn code generator 2 reg[4:0] pnig1_next; // I pn code generator 1 g1(p) = p^5 + p^2 + 1 reg[4:0] pnig2_next; // I pn code generator 2 reg[4:0] pnqg1_next; // Q pn code generator 1 g2(p) = p^5 + p^4 + P^2 + p + 1 reg[4:0] pnqg2_next; // Q pn code generator 2 integer lp; // loop variable // design architecture assign IDATA = pnig1[4] ^ pnig2[4]; assign QDATA = pnqg1[4] ^ pnqg2[4]; // sift register for PN code generators always@(posedge PNCLK or negedge RESETN) if (!RESETN) begin pnig1 <= 5'b10101; pnqg1 <= 5'b10101; pnig2 <= 5'b01101; pnqg2 <= 5'b01000; end else begin pnig1 <= pnig1_next; pnqg1 <= pnqg1_next; pnig2 <= pnig2_next; pnqg2 <= pnqg2_next; end always@(pnig1 or pnig2 or pnqg1 or pnqg2) begin pnig1_next[0] <= pnig1[4]; pnig2_next[0] <= pnig2[4]; pnqg1_next[0] <= pnqg1[4]; pnqg2_next[0] <= pnqg2[4]; for (lp = 1; lp < 5; lp = lp + 1) begin if (lp == 2) begin pnig1_next[lp] <= pnig1[lp-1] ^ pnig1[4]; pnig2_next[lp] <= pnig2[lp-1] ^ pnig2[4]; pnqg1_next[lp] <= pnqg1[lp-1] ^ pnqg1[4]; pnqg2_next[lp] <= pnqg2[lp-1] ^ pnqg2[4]; end else begin pnig1_next[lp] <= pnig1[lp-1]; pnig2_next[lp] <= pnig2[lp-1]; pnqg1_next[lp] <= pnqg1[lp-1]; pnqg2_next[lp] <= pnqg2[lp-1]; end if ((lp == 1) | (lp == 4)) begin pnig2_next[lp] <= pnig2[lp-1] ^ pnig2[4]; pnqg2_next[lp] <= pnqg2[lp-1] ^ pnqg2[4]; end end end endmodule