0% found this document useful (0 votes)
256 views

Verilog Implementation of Gaussion Random Number Generator Using Boxmuller Method, Full Verilog Code

this code represents the pipeline structure of gaussion random number generator ,the pipeline structure having 4 stages .., it follows the boxmuller method. full verilog code.....
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
256 views

Verilog Implementation of Gaussion Random Number Generator Using Boxmuller Method, Full Verilog Code

this code represents the pipeline structure of gaussion random number generator ,the pipeline structure having 4 stages .., it follows the boxmuller method. full verilog code.....
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 22

//////////////////////////////////////////////////////////////////////////////////

//SQUARE ROOT CALCULATIONG PROGRAM


//combinational circuit of square root
module SQUAREROOTLELO(outsquare,insquare
);
input [0:5] insquare;
output [0:2] outsquare;
assign outsquare[0]=(insquare[2] & insquare[3]) | insquare[1];
assign outsquare[1]=((~insquare[1]) & (insquare[2] ^ insquare[3]));
assign outsquare[2]=(insquare[5] | insquare[4]) & (((~insquare[1]) & (~(insquare[1]^insquare[3]))) |
(insquare[2] & insquare[1]));
endmodule

///////////////////////////////////////////////////////////////////////////////////////////////////////
//p encoder
//8bit p encoder
module p_encoder8to3(outp,eout,inp,ein
);
input [0:7] inp;
input ein;
output [0:2] outp;
output eout;
assign outp[0]=ein & (inp[3] | inp[2] | inp[1] | inp[0]);
assign outp[1]=ein & ((inp[5] & (~inp[3]) & (~inp[2])) | (inp[4] & (~inp[3]) & (~inp[2])) |inp[1] | inp[0]);
assign outp[2]=ein & ((inp[6] & ~inp[5] & ~inp[3] & ~inp[1]) | (inp[4] & ~inp[3] & ~inp[1]) | (inp[2] &
~inp[1]) | inp[0] );
assign eout=ein & ~inp[0] & ~inp[1] & ~inp[2] & ~inp[3] & ~inp[4] & ~inp[5] & ~inp[6] & ~inp[7];
endmodule

//32 BIT P_ENCODER USING 4 8BIT P_ENCODER


////////////////////////////////////////////////////////////////////////////////////////////////////////
module p_encoder32to5(outpt,inpt);
input [0:31] inpt;
output [0:4] outpt;
wire [0:2] peo1,peo2,peo3,peo4;
wire eout1,eout2,eout3,eout4;
assign eout4=1;
p_encoder8to3 pe1 (peo1,,inpt[24:31],eout1);
p_encoder8to3 pe2 (peo2,eout1,inpt[16:23],eout2);
p_encoder8to3 pe3 (peo3,eout2,inpt[8:15],eout3);
p_encoder8to3 pe4 (peo4,eout3,inpt[0:7],eout4);
assign outpt[4]=peo1[2] | peo2[2] | peo3[2] | peo4[2];
assign outpt[3]=peo1[1] | peo2[1] | peo3[1] | peo4[1];
assign outpt[2]=peo1[0] | peo2[0] | peo3[0] | peo4[0];
assign outpt[1]= (~eout1) & ~(eout2 ^ eout3);
assign outpt[0]= (~eout1) & (~eout2);
endmodule

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//APPROX LOG CALCULATING ALGO USING P_ENCODER
//LOG CALCULATING PROGRAM
module LOGLELO(outlog,inlog
);
input [0:31] inlog;
output [0:5] outlog;
wire [0:4] outpet;
p_encoder32to5 pe32 (outpet,inlog);
assign outlog=44-7*outpet/5;

endmodule

//////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
//SINE WAVE GENERATOR
module SINELELO(outs,signs,ins);
input [0:31] ins;
output [0:31] outs;
output signs;
//wire declaration
wire [0:32] tmp;
wire [0:31] twos1,twos2,ready;
wire [0:31] outs,ins;
wire [0:34] tmp1,ans;
wire [0:67] tmp2;
wire p;
assign tmp[0]=(ins[0] & ins[1]);
assign tmp[1]=((~ins[0]) | ins[1]);
assign tmp[2:32] =0;
assign signs=((ins[0] & ins[1]) |(ins[0] & (~ins[1])));
twocmp tws1 (twos1,ins,((ins[0] & ins[1])|((~ins[0]) & ins[1])));
assign twos2[0]=(((~ins[0])| (ins[1])) & twos1[0]);
assign twos2[1:31]=twos1[1:31];
assign ready=tmp+twos2;
assign tmp1=7*ready;
assign tmp2=12*ready*ready;
assign ans=tmp1-tmp2[1:35];
assign p=ready[0]| ready[2]| ready[3]| ready[4]| ready[5]| ready[6]| ready[7]| ready[8]|
ready[9]|ready[10]|ready[11]|ready[12]|ready[13]|ready[14]|ready[15]|ready[16]|ready[17];

assign outs[1:31]=ans[2:33];
assign outs[0]=((~p)& ready[1]);
//first bit of out put id integer and other 31 bit if float
endmodule
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
COS
//COS CALCULATING PROGRAM , USING POLYNOMIAL METHOD
module COSLELO(cosout,sign,in
);
input [0:31] in;
output [0:31] cosout;
output sign;
wire [0:32] q;
wire [0:31] in1,in2;
wire [0:31] cosout;
wire [0:63] a;
wire [0:127] b;
wire [0:191] c;
wire [0:255] d;
assign sign=in[0];
assign in2[0]=in[0];
assign in2[1]=in[0];
assign in2[2]=in[0];
assign in2[3]=in[0];
assign in2[4]=in[0];
assign in2[5]=in[0];
assign in2[6]=in[0];
assign in2[7]=in[0];
assign in2[8]=in[0];

assign in2[9]=in[0];
assign in2[10]=in[0];
assign in2[11]=in[0];
assign in2[12]=in[0];
assign in2[13]=in[0];
assign in2[14]=in[0];
assign in2[15]=in[0];
assign in2[16]=in[0];
assign in2[17]=in[0];
assign in2[18]=in[0];
assign in2[19]=in[0];
assign in2[20]=in[0];
assign in2[21]=in[0];
assign in2[22]=in[0];
assign in2[23]=in[0];
assign in2[24]=in[0];
assign in2[25]=in[0];
assign in2[26]=in[0];
assign in2[27]=in[0];
assign in2[28]=in[0];
assign in2[29]=in[0];
assign in2[30]=in[0];
assign in2[31]=in[0];
assign in1[0:31]=(32'h80000000 & in2)+((in[0:31] & 32'h7fffffff)^in2)+in[0];
assign a=in1*in1*5;
assign b=in1*in1*in1*in1*4;
assign c=in1*in1*in1*in1*in1*in1*4/3;
assign d=in1*in1*in1*in1*in1*in1*in1*in1/4;
assign q=33'h100000000;

assign cosout=q-a[0:31]+b[0:31]-c[0:31]+d[0:31];
endmodule

///////////////////////////////////////////////////////////////////////////////////////////////////
//2X1 MUX
module mux2x1(outm,in1m,in2m,sm);
output [0:31] outm;
input sm;
input [0:31] in1m,in2m;
wire [0:31] in1m,in2m,outm;
wire sm,smb;
assign smb=~sm;
assign outm[0]= (in1m[0] & smb )|(in2m[0] & sm);
assign outm[1]= (in1m[1] & smb )|(in2m[1] & sm);
assign outm[2]= (in1m[2] & smb )|(in2m[2] & sm);
assign outm[3]= (in1m[3] & smb )|(in2m[3] & sm);
assign outm[4]= (in1m[4] & smb )|(in2m[4] & sm);
assign outm[5]= (in1m[5] & smb )|(in2m[5] & sm);
assign outm[6]= (in1m[6] & smb )|(in2m[6] & sm);
assign outm[7]= (in1m[7] & smb )|(in2m[7] & sm);
assign outm[8]= (in1m[8] & smb )|(in2m[8] & sm);
assign outm[9]= (in1m[9] & smb )|(in2m[9] & sm);
assign outm[10]= (in1m[10] & smb )|(in2m[10] & sm);
assign outm[11]= (in1m[11] & smb )|(in2m[11] & sm);
assign outm[12]= (in1m[12] & smb )|(in2m[12] & sm);
assign outm[13]= (in1m[13] & smb )|(in2m[13] & sm);
assign outm[14]= (in1m[14] & smb )|(in2m[14] & sm);
assign outm[15]= (in1m[15] & smb )|(in2m[15] & sm);
assign outm[16]= (in1m[16] & smb )|(in2m[16] & sm);

assign outm[17]= (in1m[17] & smb )|(in2m[17] & sm);


assign outm[18]= (in1m[18] & smb )|(in2m[18] & sm);
assign outm[19]= (in1m[19] & smb )|(in2m[19] & sm);
assign outm[20]= (in1m[20] & smb )|(in2m[20] & sm);
assign outm[21]= (in1m[21] & smb )|(in2m[21] & sm);
assign outm[22]= (in1m[22] & smb )|(in2m[22] & sm);
assign outm[23]= (in1m[23] & smb )|(in2m[23] & sm);
assign outm[24]= (in1m[24] & smb )|(in2m[24] & sm);
assign outm[25]= (in1m[25] & smb )|(in2m[25] & sm);
assign outm[26]= (in1m[26] & smb )|(in2m[26] & sm);
assign outm[27]= (in1m[27] & smb )|(in2m[27] & sm);
assign outm[28]= (in1m[28] & smb )|(in2m[28] & sm);
assign outm[29]= (in1m[29] & smb )|(in2m[29] & sm);
assign outm[30]= (in1m[30] & smb )|(in2m[30] & sm);
assign outm[31]= (in1m[31] & smb )|(in2m[31] & sm);
endmodule

///////////////////////////////////////////////////////////////////////////////////////////////////
//SIMPLE D FLIP FLOP WITH INITIAL CONDITION 1
module flipflop1(qff,dff,resetff,setff,clkff);
input clkff,dff,resetff,setff;
output qff;
reg qff;
initial
begin
qff=1;
end
always @(posedge clkff or posedge resetff or posedge setff)

begin
if (setff)
qff=1;
else if(resetff)
qff=0;
else
qff=dff;
end
endmodule
//////////////////////////////////////////////////////////////////////////////////////////////////
///SIMPLE D FLIP FLOP WITH INITIAL CONDITION 0
module flipflop0(qff,dff,resetff,setff,clkff);
input clkff,dff,resetff,setff;
output qff;
reg qff;
initial
begin
qff=0;
end
always @(posedge clkff or posedge resetff or posedge setff)
begin
if (setff)
qff=1;
else if(resetff)
qff=0;
else
qff=dff;
end
endmodule

// FIRST LSFR
///////////////////////////////////////////////////////////////////////////////////////////////////////
//USING 43 FF,AND SELECT 32 BIT IN 43
module LSFRone(outlsfr,resetlsfr,clklsfr);
input clklsfr,resetlsfr;
output [0:31] outlsfr;
wire [0:31] outlsfr;
wire [0:5] uga;
wire setlsfr;
assign setlsfr=0;
xor (uga[0],outlsfr[0],outlsfr[31]);
xor (uga[1],outlsfr[0],outlsfr[30]);
xor (uga[2],outlsfr[0],outlsfr[29]);
xor (uga[3],outlsfr[0],outlsfr[28]);
xor (uga[4],outlsfr[0],outlsfr[27]);
xor (uga[5],outlsfr[0],outlsfr[26]);
flipflop0 ff1 (outlsfr[0],outlsfr[1],resetlsfr,setlsfr,clklsfr);
flipflop0 ff2 (outlsfr[1],outlsfr[2],resetlsfr,setlsfr,clklsfr);
flipflop0 ff3 (outlsfr[2],outlsfr[3],resetlsfr,setlsfr,clklsfr);
flipflop0 ff4 (outlsfr[3],outlsfr[4],resetlsfr,setlsfr,clklsfr);
flipflop0 ff5 (outlsfr[4],outlsfr[5],resetlsfr,setlsfr,clklsfr);
flipflop0 ff6 (outlsfr[5],outlsfr[6],resetlsfr,setlsfr,clklsfr);
flipflop1 ff7 (outlsfr[6],outlsfr[7],setlsfr,resetlsfr,clklsfr);
flipflop0 ff8 (outlsfr[7],outlsfr[8],resetlsfr,resetlsfr,clklsfr);
flipflop0 ff9 (outlsfr[8],outlsfr[9],resetlsfr,resetlsfr,clklsfr);
flipflop0 ff10 (outlsfr[9],outlsfr[10],resetlsfr,resetlsfr,clklsfr);
flipflop0 ff11 (outlsfr[10],outlsfr[11],resetlsfr,setlsfr,clklsfr);
flipflop0 ff12 (outlsfr[11],outlsfr[12],resetlsfr,setlsfr,clklsfr);
flipflop0 ff13 (outlsfr[12],outlsfr[13],resetlsfr,setlsfr,clklsfr);

flipflop1 ff14 (outlsfr[13],outlsfr[14],setlsfr,resetlsfr,clklsfr);


flipflop0 ff15 (outlsfr[14],outlsfr[15],resetlsfr,setlsfr,clklsfr);
flipflop0 ff16 (outlsfr[15],outlsfr[16],resetlsfr,setlsfr,clklsfr);
flipflop0 ff17 (outlsfr[16],outlsfr[17],resetlsfr,setlsfr,clklsfr);
flipflop0 ff18 (outlsfr[17],outlsfr[18],resetlsfr,setlsfr,clklsfr);
flipflop0 ff19 (outlsfr[18],outlsfr[19],resetlsfr,setlsfr,clklsfr);
flipflop1 ff20 (outlsfr[19],outlsfr[20],setlsfr,resetlsfr,clklsfr);
flipflop0 ff21 (outlsfr[20],outlsfr[21],resetlsfr,setlsfr,clklsfr);
flipflop0 ff22 (outlsfr[21],outlsfr[22],resetlsfr,setlsfr,clklsfr);
flipflop0 ff23 (outlsfr[22],outlsfr[23],resetlsfr,setlsfr,clklsfr);
flipflop0 ff24 (outlsfr[23],outlsfr[24],resetlsfr,setlsfr,clklsfr);
flipflop0 ff25 (outlsfr[24],outlsfr[25],resetlsfr,setlsfr,clklsfr);
flipflop0 ff26 (outlsfr[25],outlsfr[26],resetlsfr,setlsfr,clklsfr);
flipflop0 ff27 (outlsfr[26],outlsfr[27],resetlsfr,setlsfr,clklsfr);
flipflop0 ff28 (outlsfr[27],uga[3],resetlsfr,setlsfr,clklsfr);
flipflop0 ff29 (outlsfr[28],uga[2],resetlsfr,setlsfr,clklsfr);
flipflop0 ff30 (outlsfr[29],uga[1],resetlsfr,setlsfr,clklsfr);
flipflop1 ff31 (outlsfr[30],uga[0],resetlsfr,setlsfr,clklsfr);
flipflop0 ff32 (outlsfr[31],outlsfr[0],resetlsfr,setlsfr,clklsfr);

endmodule

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////
// SECOND LSFR
///////////////////////////////////////////////////////////////////////////////////////////////////////
//USING 43 FF, SELECT 32 BIT IN 43;
module LSFRtwo(outlsfr,resetlsfr,clklsfr);
input clklsfr,resetlsfr;

output [0:31] outlsfr;


wire [0:31] outlsfr;
wire [0:5] uga2;
wire setlsfr;
assign setlsfr=0;
xor (uga2[0],outlsfr[0],outlsfr[31]);
xor (uga2[1],outlsfr[0],outlsfr[30]);
xor (uga2[2],outlsfr[0],outlsfr[29]);
xor (uga2[3],outlsfr[0],outlsfr[28]);
xor (uga2[4],outlsfr[0],outlsfr[27]);
xor (uga2[5],outlsfr[0],outlsfr[26]);
flipflop0 ff1 (outlsfr[0],outlsfr[1],resetlsfr,setlsfr,clklsfr);
flipflop0 ff2 (outlsfr[1],outlsfr[2],resetlsfr,setlsfr,clklsfr);
flipflop0 ff3 (outlsfr[2],outlsfr[3],resetlsfr,setlsfr,clklsfr);
flipflop0 ff4 (outlsfr[3],outlsfr[4],resetlsfr,setlsfr,clklsfr);
flipflop0 ff5 (outlsfr[4],outlsfr[5],resetlsfr,setlsfr,clklsfr);
flipflop1 ff6 (outlsfr[5],outlsfr[6],resetlsfr,setlsfr,clklsfr);
flipflop0 ff7 (outlsfr[6],outlsfr[7],setlsfr,resetlsfr,clklsfr);
flipflop0 ff8 (outlsfr[7],outlsfr[8],resetlsfr,resetlsfr,clklsfr);
flipflop0 ff9 (outlsfr[8],outlsfr[9],resetlsfr,resetlsfr,clklsfr);
flipflop0 ff10 (outlsfr[9],outlsfr[10],resetlsfr,resetlsfr,clklsfr);
flipflop0 ff11 (outlsfr[10],outlsfr[11],resetlsfr,setlsfr,clklsfr);
flipflop0 ff12 (outlsfr[11],outlsfr[12],resetlsfr,setlsfr,clklsfr);
flipflop0 ff13 (outlsfr[12],outlsfr[13],resetlsfr,setlsfr,clklsfr);
flipflop1 ff14 (outlsfr[13],outlsfr[14],setlsfr,resetlsfr,clklsfr);
flipflop0 ff15 (outlsfr[14],outlsfr[15],resetlsfr,setlsfr,clklsfr);
flipflop0 ff16 (outlsfr[15],outlsfr[16],resetlsfr,setlsfr,clklsfr);
flipflop0 ff17 (outlsfr[16],outlsfr[17],resetlsfr,setlsfr,clklsfr);
flipflop0 ff18 (outlsfr[17],outlsfr[18],resetlsfr,setlsfr,clklsfr);

flipflop0 ff19 (outlsfr[18],outlsfr[19],resetlsfr,setlsfr,clklsfr);


flipflop0 ff20 (outlsfr[19],outlsfr[20],setlsfr,resetlsfr,clklsfr);
flipflop0 ff21 (outlsfr[20],outlsfr[21],resetlsfr,setlsfr,clklsfr);
flipflop0 ff22 (outlsfr[21],outlsfr[22],resetlsfr,setlsfr,clklsfr);
flipflop0 ff23 (outlsfr[22],outlsfr[23],resetlsfr,setlsfr,clklsfr);
flipflop0 ff24 (outlsfr[23],outlsfr[24],resetlsfr,setlsfr,clklsfr);
flipflop1 ff25 (outlsfr[24],outlsfr[25],resetlsfr,setlsfr,clklsfr);
flipflop0 ff26 (outlsfr[25],outlsfr[26],resetlsfr,setlsfr,clklsfr);
flipflop0 ff27 (outlsfr[26],outlsfr[27],resetlsfr,setlsfr,clklsfr);
flipflop0 ff28 (outlsfr[27],uga2[3],resetlsfr,setlsfr,clklsfr);
flipflop0 ff29 (outlsfr[28],uga2[2],resetlsfr,setlsfr,clklsfr);
flipflop0 ff30 (outlsfr[29],uga2[1],resetlsfr,setlsfr,clklsfr);
flipflop1 ff31 (outlsfr[30],uga2[0],resetlsfr,setlsfr,clklsfr);
flipflop0 ff32 (outlsfr[31],outlsfr[0],resetlsfr,setlsfr,clklsfr);

endmodule

///////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////
//2'S COMPLEMENT GENERATOR;
module twocmp(outad,inad,scmp);
output [0:31] outad;
input scmp;
input [0:31] inad;
wire [0:31] tmp3;
assign tmp3[0]=scmp ^ inad[0];
assign tmp3[1]=scmp ^ inad[1];
assign tmp3[2]=scmp ^ inad[2];

assign tmp3[3]=scmp ^ inad[3];


assign tmp3[4]=scmp ^ inad[4];
assign tmp3[5]=scmp ^ inad[5];
assign tmp3[6]=scmp ^ inad[6];
assign tmp3[7]=scmp ^ inad[7];
assign tmp3[8]=scmp ^ inad[8];
assign tmp3[9]=scmp ^ inad[9];
assign tmp3[10]=scmp ^ inad[10];
assign tmp3[11]=scmp ^ inad[11];
assign tmp3[12]=scmp ^ inad[12];
assign tmp3[13]=scmp ^ inad[13];
assign tmp3[14]=scmp ^ inad[14];
assign tmp3[15]=scmp ^ inad[15];
assign tmp3[16]=scmp ^ inad[16];
assign tmp3[17]=scmp ^ inad[17];
assign tmp3[18]=scmp ^ inad[18];
assign tmp3[19]=scmp ^ inad[19];
assign tmp3[20]=scmp ^ inad[20];
assign tmp3[21]=scmp ^ inad[21];
assign tmp3[22]=scmp ^ inad[22];
assign tmp3[23]=scmp ^ inad[23];
assign tmp3[24]=scmp ^ inad[24];
assign tmp3[25]=scmp ^ inad[25];
assign tmp3[26]=scmp ^ inad[26];
assign tmp3[27]=scmp ^ inad[27];
assign tmp3[28]=scmp ^ inad[28];
assign tmp3[29]=scmp ^ inad[29];
assign tmp3[30]=scmp ^ inad[30];
assign tmp3[31]=scmp ^ inad[31];

assign outad=tmp3+scmp;
endmodule

////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//REGISTERS USER IN PIPELINE STRUCTURE
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//1st PART REGISTERS
module part1reg(lsfrout1,lsfrout2,resetr1,clkr1);
output [0:31] lsfrout1,lsfrout2;
input clkr1,resetr1;
reg [0:31] lsfrout1,lsfrout2;
wire [0:31] lsfrr1,lsfrr2;
wire clkh;
initial
begin
lsfrout1=0;
lsfrout2=0;
end
assign # 0.008 clkh=clkr1;
LSFRone L1 (lsfrr1,resetr1,clkr1);
LSFRtwo L2 (lsfrr2,resetr1,clkr1);
always @ (posedge clkh)
begin
lsfrout1<=lsfrr1;
lsfrout2<=lsfrr2;
end
endmodule
////////////////////////////////////////

//2nd PART PEGISTERS


module part2reg(sqwout,cosout,sinout,csign,ssign,lsfrr21,lsfrr22,clkr2);
input [0:31] lsfrr22,lsfrr21;
output [0:31] cosout;
output [0:31] sinout;
output csign,ssign;
output [0:2] sqwout;
input clkr2;
reg [0:31] cosout;
reg [0:31] sinout;
reg [0:2] sqwout;
reg csign,ssign;
wire [0:2] sqw;
wire [0:5] logw;
wire [0:31] cosr,lsfrr22,lsfrr21;
wire [0:31] sinr;
wire csign1,ssign1,clkh2;
initial
begin
csign=0;
ssign=0;
sqwout=0;
cosout=0;
sinout=0;
end
COSLELO C1 (cosr,csign1,lsfrr21);
SINELELO S1 (sinr,ssign1,lsfrr21);
LOGLELO LO1 (logw,lsfrr22);
SQUAREROOTLELO SQ1 (sqw,logw);

assign # 0.004 clkh2=clkr2;


always @ (posedge clkh2)
begin
sqwout<=sqw;
cosout<=cosr;
sinout<=sinr;
csign<=csign1;
ssign<=ssign1;
end
endmodule
///////////////////////////////////////////////////////////////////////////////
//3rd PART REGISTERS
module part3reg(grngc,csign,grngs,ssign,sd,cosinr3,sininr3,csignr3,ssignr3,sqwr3,clkr3);
input [0:31] cosinr3,sd;
input [0:31] sininr3;
input [0:2] sqwr3;
input clkr3,csignr3,ssignr3;
output [0:31] grngc,grngs;
output csign,ssign;
reg [0:31] grngc,grngs;
reg csign,ssign;
wire [0:34] multi;
wire [0:34] multis;
wire [0:14] multi2,multis2;
wire [0:66] xsd,xsds;
wire [0:31] xsd32,xsd32s;
wire clkh3;
initial
begin

grngc=0;
grngs=0;
csign=0;
ssign=0;
end
assign # 0.002 clkh3=clkr3;
assign multi=sqwr3*cosinr3;
assign multis=sqwr3*sininr3;
assign multi2=multi[1:15];
assign multis2=multis[2:16];
assign xsd=multi2*sd;
assign xsds=multis2*sd;
assign xsd32=xsd[22:53];
assign xsd32s=xsds[22:53];
always @ (posedge clkh3)
begin
grngc<=xsd32;
grngs<=xsd32s;
csign<=csignr3;
ssign<=ssignr3;
end
endmodule
///////////////////////////////////////////////////////////////////////
//4th part of pipeline
module part4reg (grnga1,g1sign,grnga2,g2sign,mean,xsdrc,xsdrs,csign,ssign,clkr4);
input [0:31] xsdrc,xsdrs,mean;
input clkr4,csign,ssign;
output [0:31] grnga1,grnga2;
output g1sign,g2sign;

reg [0:31] grnga1,grnga2;


reg g1sign,g2sign;
wire [0:34] cmp,cmps;
wire [0:31] mean2,mean2s,xsd2,xsd2s,outgc,outgs;
wire clkh4;
initial
begin
grnga1=0;
grnga2=0;
g1sign=0;
g2sign=0;
end
assign # 0.001 clkh4=clkr4;
assign cmp=mean-xsdrc;
assign cmps=mean-xsdrs;
assign signgc=(csign & cmp[0]);
assign signgs=(ssign & cmps[0]);
twocmp tw1 (mean2,mean,signgc);
twocmp tw2 (xsd2,xsdrc,(csign & (~cmp[0])));
twocmp tw3 (mean2s,mean,signgs);
twocmp tw4 (xsd2s,xsdrs,(ssign & (~cmps[0])));
assign outgc=mean2+xsd2;
assign outgs=mean2s+xsd2s;
always @ (posedge clkh4)
begin

grnga1<=outgc;
grnga2<=outgs;
g1sign<=signgc;

g2sign<=signgs;
end
endmodule
/////////////////////////////////////////////////////////////////////////////////////////////////
///////
//5th part of pipeline
module part5reg (grngoutr5,gsign,g1rng,g2rng,g1sign,g2sign,mean,clkr5);
input [0:31] g1rng,g2rng,mean;
input g1sign,g2sign,clkr5;
output [0:31] grngoutr5;
output gsign;
wire [0:32] cmp1;//cmp2;
wire tmpsign;
wire [0:31] tmp;
reg [0:31] grngoutr5;
reg gsign;
initial
begin
gsign=0;
grngoutr5=0;
end
assign cmp1=g1rng-g2rng;
//assign cmp2=g2rng-mean;
mux2x1 m1 (tmp,g1rng,g2rng,(~cmp1[0]));
assign tmpsign=((~cmp1[0]) & g2sign) | (cmp1[0] & g1sign);
always @ (posedge clkr5)
begin
grngoutr5<=tmp;
gsign<=tmpsign;

end
endmodule
//GAUSSION RANDOM NUMBER
GENERATOR////////////////////////////////////////////////////////////////////////
/////////////////////USING BOX MULLER METHOD
/////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////
module NEWGRNG(/*g1rng,g2rng,g1sign,g2sign,*/grngoutq,gsignq,numberofterm,mean,sd,resetg,clkg);
//output [0:31] g1rng,g2rng;
//output g1sign,g2sign;
//if g1sign=0 => number is +ve,
//if g2sign=1 => number is -ve,
//sd=standard deviation
output [0:31] grngoutq;
output gsignq;
input clkg,resetg;
input [0:31] mean,sd,numberofterm;
integer fp;
reg [0:31] number;
wire [0:31] lsfrp1,lsfrp2,cosh,grngch,grngsh;
wire [0:31] sinh;
wire [0:2] sqwh;
wire csignh,ssignh,signch,signsh,g1sign,g2sign,gsignq;
wire [0:31] g1rng,g2rng,grngoutq;
initial
begin
fp=$fopen("getval.txt","w");
number=0;
end

//First Stage of pipeline


//Generation of uniform random numbers
part1reg pr1 (lsfrp1,lsfrp2,resetg,clkg);
//Second stage of pipeline
//Apply BOX MULLER TRANSFORMATION calculate cos,sin,log,squarw root
part2reg pr2 (sqwh,cosh,sinh,csignh,ssignh,lsfrp1,lsfrp2,clkg);
//third stage of pipeline
//Multiplication of cos,sin unit to square root unit, and change sd
part3reg pr3 (grngch,signch,grngsh,signsh,sd,cosh,sinh,csignh,ssignh,sqwh,clkg);
//fourth stage of pipeline
//Change mean of the system
part4reg pr4 (g1rng,g1sign,g2rng,g2sign,mean,grngch,grngsh,signch,signsh,clkg);
//fifth stage of pipeline
//selection of best GRN
part5reg pr5 (grngoutq,gsignq,g1rng,g2rng,g1sign,g2sign,mean,clkg);
always @ (posedge clkg)
begin
if((numberofterm+3) ==number)
begin
$fclose(fp);
$finish;
end
if (number==0)
begin
$fwrite(fp,"%x\n%x\n",mean,sd);
end
if(number > 2)
begin
$fwrite(fp,"%x\n%x\n",gsignq,grngoutq);

//$fwrite(fp,"%x\n%x\n",g1sign,g1rng);
//$fwrite(fp,"%x\n%x\n",g2sign,g2rng);
end
number=number+1;
end
endmodule

You might also like