SlideShare a Scribd company logo
1 of 7
/////////////////////////////////////////////////////////////////////////////////
// Copywrite Thomas Knudstrup 1998 -2015
// Grey Code counter with segmentation and lookahead short cuts for speed and convenience
//
//////////////////////////////////////////////////////////////////////////////////
`timescale 1 ns/10 ps
module grey_count
(
clk,
rst,
mark,
rtrn,
count_gc_h,
count_bn_h,
//
inc,
count_gc,
count_bn,
cross_gc,
cross_bn,
zero
);
//////////////////////////////////////////////////////////////////////////////////
// I/O
//////////////////////////////////////////////////////////////////////////////////
input clk;
input rst;
input mark;
input rtrn;
output[19:0] count_gc_h;
output[19:0] count_bn_h;
input inc;
output[19:0] count_gc;
output[19:0] count_bn;
input[19:0] cross_gc;
output[19:0] cross_bn;
input zero;
//////////////////////////////////////////////////////////////////////////////////
// Signals
//////////////////////////////////////////////////////////////////////////////////
reg[3:0] gcr0, gcr1, gcr2, gcr3, gcr4;
reg gcr0_15, gcr1_15, gcr1_15_p, gcr2_15, gcr2_15_p, gcr3_15, gcr3_15_p;
//
reg[3:0] gcr0_h, gcr1_h, gcr2_h, gcr3_h, gcr4_h;
reg gcr0_15_h, gcr1_15_h, gcr1_15_p_h, gcr2_15_h, gcr2_15_p_h, gcr3_15_h, gcr3_15_p_h;
//
wire[19:0] count_gc = {gcr4, gcr3 , gcr2 , gcr1 , gcr0};
wire gcr0up = !(^{gcr4,gcr3,gcr2,gcr1}),
gcr1up = !(^{gcr4,gcr3,gcr2}),
gcr2up = !(^{gcr4,gcr3}),
gcr3up = !(^{gcr4});
wire[19:0] count_bn = {gc2num(1,gcr4), gc2num(gcr3up,gcr3), gc2num(gcr2up,gcr2),
gc2num(gcr1up,gcr1), gc2num(gcr0up,gcr0)};
wire[19:0] count_gc_h = {gcr4_h, gcr3_h, gcr2_h, gcr1_h, gcr0_h};
wire gcr0up_h = !(^{gcr4_h,gcr3_h,gcr2_h,gcr1_h}),
gcr1up_h = !(^{gcr4_h,gcr3_h,gcr2_h}),
gcr2up_h = !(^{gcr4_h,gcr3_h}),
gcr3up_h = !(^{gcr4_h});
wire[19:0] count_bn_h = {gc2num(1,gcr4_h), gc2num(gcr3up_h,gcr3_h),
gc2num(gcr2up_h,gcr2_h), gc2num(gcr1up_h,gcr1_h), gc2num(gcr0up_h,gcr0_h)};
wire count_nup = (count_gc !== count_gc_h);
//
wire ccr0up = !(^cross_gc[19:4]),
ccr1up = !(^cross_gc[19:8]),
ccr2up = !(^cross_gc[19:12]),
ccr3up = !(^cross_gc[19:16]);
wire[19:0] cross_bn = {gc2num(1,cross_gc[19:16]), gc2num(ccr3up,cross_gc[15:12]),
gc2num(ccr2up,cross_gc[11:8]), gc2num(ccr1up,cross_gc[7:4]), gc2num(ccr0up,cross_gc[3:0])};
//////////////////////////////////////////////////////////////////////////////////
// Defines
//////////////////////////////////////////////////////////////////////////////////
`define gc_00 4'b0000
`define gc_01 4'b0010
`define gc_02 4'b0011
`define gc_03 4'b0001
`define gc_04 4'b0101
`define gc_05 4'b0111
`define gc_06 4'b0110
`define gc_07 4'b0100
`define gc_08 4'b1100
`define gc_09 4'b1110
`define gc_10 4'b1111
`define gc_11 4'b1101
`define gc_12 4'b1001
`define gc_13 4'b1011
`define gc_14 4'b1010
`define gc_15 4'b1000
wire[3:0] n_gcr0 = (!gcr2_15_p&&!gcr1_15_p&&!gcr0_15) ? ((gcr0up) ? gc_inc(gcr0) :
gc_dec(gcr0)) : gcr0;
wire n_gcr0_15 = (gcr0up) ? (gcr0 == `gc_14) : (gcr0 == `gc_01);
wire[3:0] n_gcr1 = (!gcr2_15_p&&!gcr1_15_p&&gcr0_15) ? ((gcr1up) ? gc_inc(gcr1) :
gc_dec(gcr1)) : gcr1;
wire n_gcr1_15 = (gcr0_15) ? ((gcr1up) ? (gcr1 == `gc_14) : (gcr1 == `gc_01)) : gcr1_15;
wire n_gcr1_15_p = ((gcr0up) ? (gcr0 == `gc_14) : (gcr0 == `gc_01))&&gcr1_15;
wire[3:0] n_gcr2 = ((!gcr2_15_p&&gcr1_15&&gcr0_15)) ? ((gcr2up) ? gc_inc(gcr2) :
gc_dec(gcr2)) : gcr2;
wire n_gcr2_15 = ((gcr1_15&&gcr0_15)) ? ((gcr2up) ? (gcr2 == `gc_14) : (gcr2 == `gc_01)) :
gcr2_15;
wire n_gcr2_15_p = ((gcr0up) ? (gcr0 == `gc_14) : (gcr0 == `gc_01))&&gcr1_15&&gcr2_15;
wire[3:0] n_gcr3 = ((gcr2_15&&gcr1_15&&gcr0_15)) ? gc_inc(gcr3) : gcr3;
wire n_gcr3_15 = ((gcr2_15&&gcr1_15&&gcr0_15)) ? ((gcr3up) ? (gcr3 == `gc_14) : (gcr3
== `gc_01)) : gcr3_15;
wire n_gcr3_15_p = ((gcr0up) ? (gcr0 == `gc_14) : (gcr0 ==
`gc_01))&&gcr1_15&&gcr2_15&&gcr3_15;
wire[3:0] n_gcr4 = ((gcr3_15&&gcr2_15&&gcr1_15&&gcr0_15)) ? gc_inc(gcr4) : gcr4;
always @(posedge clk) begin
if (rst) begin
gcr0 <= 4'd0; gcr0_15 <= 1'd0;
gcr1 <= 4'd0; gcr1_15 <= 1'd0; gcr1_15_p <= 1'd0;
gcr2 <= 4'd0; gcr2_15 <= 1'd0; gcr2_15_p <= 1'd0;
gcr3 <= 4'd0; gcr3_15 <= 1'd0; gcr3_15_p <= 1'd0;
gcr4 <= 4'd0;
end
else if(rtrn) begin
gcr0 <= gcr0_h; gcr0_15 <= gcr0_15_h;
gcr1 <= gcr1_h; gcr1_15 <= gcr1_15_h; gcr1_15_p <= gcr1_15_p_h;
gcr2 <= gcr2_h; gcr2_15 <= gcr2_15_h; gcr2_15_p <= gcr2_15_p_h;
gcr3 <= gcr3_h; gcr3_15 <= gcr3_15_h; gcr3_15_p <= gcr3_15_p_h;
gcr4 <= gcr4_h;
end
else if(inc && zero) begin
gcr0 <= 4'd0; gcr0_15 <= 1'd0;
gcr1 <= 4'd0; gcr1_15 <= 1'd0; gcr1_15_p <= 1'd0;
gcr2 <= 4'd0; gcr2_15 <= 1'd0; gcr2_15_p <= 1'd0;
gcr3 <= 4'd0; gcr3_15 <= 1'd0; gcr3_15_p <= 1'd0;
gcr4 <= 4'd0;
end
else if(inc) begin
gcr0 <= n_gcr0;
gcr0_15 <= n_gcr0_15;
gcr1 <= n_gcr1;
gcr1_15 <= n_gcr1_15;
gcr1_15_p <= n_gcr1_15_p;
gcr2 <= n_gcr2;
gcr2_15 <= n_gcr2_15;
gcr2_15_p <= n_gcr2_15_p;
gcr3 <= n_gcr3;
gcr3_15 <= n_gcr3_15;
gcr3_15_p <= n_gcr3_15_p;
gcr4 <= n_gcr4;
end
end
//
reg marked;
always @(posedge clk) begin
if(rst) marked <= 1'd0;
else marked <= mark;
end
//
always @(posedge clk) begin
if(rst) begin
gcr0_h <= 4'd0; gcr0_15_h <= 1'd0;
gcr1_h <= 4'd0; gcr1_15_h <= 1'd0; gcr1_15_p_h <= 1'd0;
gcr2_h <= 4'd0; gcr2_15_h <= 1'd0; gcr2_15_p_h <= 1'd0;
gcr3_h <= 4'd0; gcr3_15_h <= 1'd0; gcr3_15_p_h <= 1'd0;
gcr4_h <= 4'd0;
end
else if((inc&&!marked)) begin
gcr0_h <= n_gcr0;
gcr0_15_h <= n_gcr0_15;
gcr1_h <= n_gcr1;
gcr1_15_h <= n_gcr1_15;
gcr1_15_p_h <= n_gcr1_15_p;
gcr2_h <= n_gcr2;
gcr2_15_h <= n_gcr2_15;
gcr2_15_p_h <= n_gcr2_15_p;
gcr3_h <= n_gcr3;
gcr3_15_h <= n_gcr3_15;
gcr3_15_p_h <= n_gcr3_15_p;
gcr4_h <= n_gcr4;
end
else if((count_nup&&!marked)) begin
gcr0_h <= gcr0; gcr0_15_h <= gcr0_15;
gcr1_h <= gcr1; gcr1_15_h <= gcr1_15; gcr1_15_p_h <= gcr1_15_p;
gcr2_h <= gcr2; gcr2_15_h <= gcr2_15; gcr2_15_p_h <= gcr2_15_p;
gcr3_h <= gcr3; gcr3_15_h <= gcr3_15; gcr3_15_p_h <= gcr3_15_p;
gcr4_h <= gcr4;
end
end
//
function[3:0] gc_inc;
input[3:0] old_gcr;
begin
case(old_gcr)
`gc_00 : gc_inc = `gc_01;
`gc_01 : gc_inc = `gc_02;
`gc_02 : gc_inc = `gc_03;
`gc_03 : gc_inc = `gc_04;
`gc_04 : gc_inc = `gc_05;
`gc_05 : gc_inc = `gc_06;
`gc_06 : gc_inc = `gc_07;
`gc_07 : gc_inc = `gc_08;
`gc_08 : gc_inc = `gc_09;
`gc_09 : gc_inc = `gc_10;
`gc_10 : gc_inc = `gc_11;
`gc_11 : gc_inc = `gc_12;
`gc_12 : gc_inc = `gc_13;
`gc_13 : gc_inc = `gc_14;
`gc_14 : gc_inc = `gc_15;
`gc_15 : gc_inc = `gc_00;
endcase
end
endfunction
//
function[3:0] gc_dec;
input[3:0] old_gcr;
begin
case(old_gcr)
`gc_00 : gc_dec = `gc_15;
`gc_01 : gc_dec = `gc_00;
`gc_02 : gc_dec = `gc_01;
`gc_03 : gc_dec = `gc_02;
`gc_04 : gc_dec = `gc_03;
`gc_05 : gc_dec = `gc_04;
`gc_06 : gc_dec = `gc_05;
`gc_07 : gc_dec = `gc_06;
`gc_08 : gc_dec = `gc_07;
`gc_09 : gc_dec = `gc_08;
`gc_10 : gc_dec = `gc_09;
`gc_11 : gc_dec = `gc_10;
`gc_12 : gc_dec = `gc_11;
`gc_13 : gc_dec = `gc_12;
`gc_14 : gc_dec = `gc_13;
`gc_15 : gc_dec = `gc_14;
endcase
end
endfunction
//
function[3:0] gc2num;
input up;
input[3:0] gcr;
begin
if(up) begin
case(gcr)
`gc_00 : gc2num = 4'd0;
`gc_01 : gc2num = 4'd1;
`gc_02 : gc2num = 4'd2;
`gc_03 : gc2num = 4'd3;
`gc_04 : gc2num = 4'd4;
`gc_05 : gc2num = 4'd5;
`gc_06 : gc2num = 4'd6;
`gc_07 : gc2num = 4'd7;
`gc_08 : gc2num = 4'd8;
`gc_09 : gc2num = 4'd9;
`gc_10 : gc2num = 4'd10;
`gc_11 : gc2num = 4'd11;
`gc_12 : gc2num = 4'd12;
`gc_13 : gc2num = 4'd13;
`gc_14 : gc2num = 4'd14;
`gc_15 : gc2num = 4'd15;
endcase
end
else begin
case(gcr)
`gc_00 : gc2num = 4'd15;
`gc_01 : gc2num = 4'd14;
`gc_02 : gc2num = 4'd13;
`gc_03 : gc2num = 4'd12;
`gc_04 : gc2num = 4'd11;
`gc_05 : gc2num = 4'd10;
`gc_06 : gc2num = 4'd9;
`gc_07 : gc2num = 4'd8;
`gc_08 : gc2num = 4'd7;
`gc_09 : gc2num = 4'd6;
`gc_10 : gc2num = 4'd5;
`gc_11 : gc2num = 4'd4;
`gc_12 : gc2num = 4'd3;
`gc_13 : gc2num = 4'd2;
`gc_14 : gc2num = 4'd1;
`gc_15 : gc2num = 4'd0;
endcase
end
end
endfunction
endmodule
`gc_05 : gc2num = 4'd10;
`gc_06 : gc2num = 4'd9;
`gc_07 : gc2num = 4'd8;
`gc_08 : gc2num = 4'd7;
`gc_09 : gc2num = 4'd6;
`gc_10 : gc2num = 4'd5;
`gc_11 : gc2num = 4'd4;
`gc_12 : gc2num = 4'd3;
`gc_13 : gc2num = 4'd2;
`gc_14 : gc2num = 4'd1;
`gc_15 : gc2num = 4'd0;
endcase
end
end
endfunction
endmodule

More Related Content

Similar to GreyCount

Digital Voltmeter displaying voltage level on a seven segment display and com...
Digital Voltmeter displaying voltage level on a seven segment display and com...Digital Voltmeter displaying voltage level on a seven segment display and com...
Digital Voltmeter displaying voltage level on a seven segment display and com...Karthik Rathinavel
 
Sine Wave Generator with controllable frequency displayed on a seven segment ...
Sine Wave Generator with controllable frequency displayed on a seven segment ...Sine Wave Generator with controllable frequency displayed on a seven segment ...
Sine Wave Generator with controllable frequency displayed on a seven segment ...Karthik Rathinavel
 
How do I draw the Labview code for pneumatic cylinder(air pistion). .pdf
How do I draw the Labview code for pneumatic cylinder(air pistion). .pdfHow do I draw the Labview code for pneumatic cylinder(air pistion). .pdf
How do I draw the Labview code for pneumatic cylinder(air pistion). .pdffootstatus
 
include ltiostreamgt include ltstringgt include .pdf
include ltiostreamgt include ltstringgt include .pdfinclude ltiostreamgt include ltstringgt include .pdf
include ltiostreamgt include ltstringgt include .pdfcontact32
 
How To Crack RSA Netrek Binary Verification System
How To Crack RSA Netrek Binary Verification SystemHow To Crack RSA Netrek Binary Verification System
How To Crack RSA Netrek Binary Verification SystemJay Corrales
 
Computer Networks Lab File
Computer Networks Lab FileComputer Networks Lab File
Computer Networks Lab FileKandarp Tiwari
 
calc3build# calc3bison -y -d calc3.yflex calc3.lgcc -c .docx
calc3build# calc3bison -y -d calc3.yflex calc3.lgcc -c .docxcalc3build# calc3bison -y -d calc3.yflex calc3.lgcc -c .docx
calc3build# calc3bison -y -d calc3.yflex calc3.lgcc -c .docxRAHUL126667
 
To designing counters using verilog code
To designing counters using verilog codeTo designing counters using verilog code
To designing counters using verilog codeBharti Airtel Ltd.
 
Runtime Code Generation and Data Management for Heterogeneous Computing in Java
Runtime Code Generation and Data Management for Heterogeneous Computing in JavaRuntime Code Generation and Data Management for Heterogeneous Computing in Java
Runtime Code Generation and Data Management for Heterogeneous Computing in JavaJuan Fumero
 
Dns server clients (actual program)
Dns server clients (actual program)Dns server clients (actual program)
Dns server clients (actual program)Youssef Dirani
 
Dns server clients (actual program)
Dns server clients (actual program)Dns server clients (actual program)
Dns server clients (actual program)Youssef Dirani
 
SQL techniques for faster applications
SQL techniques for faster applicationsSQL techniques for faster applications
SQL techniques for faster applicationsConnor McDonald
 
Kaggle Google Quest Q&A Labeling 反省会 LT資料 47th place solution
Kaggle Google Quest Q&A Labeling 反省会 LT資料 47th place solutionKaggle Google Quest Q&A Labeling 反省会 LT資料 47th place solution
Kaggle Google Quest Q&A Labeling 反省会 LT資料 47th place solutionKen'ichi Matsui
 
Python And GIS - Beyond Modelbuilder And Pythonwin
Python And GIS - Beyond Modelbuilder And PythonwinPython And GIS - Beyond Modelbuilder And Pythonwin
Python And GIS - Beyond Modelbuilder And PythonwinChad Cooper
 

Similar to GreyCount (20)

Digital Voltmeter displaying voltage level on a seven segment display and com...
Digital Voltmeter displaying voltage level on a seven segment display and com...Digital Voltmeter displaying voltage level on a seven segment display and com...
Digital Voltmeter displaying voltage level on a seven segment display and com...
 
FINISHED_CODE
FINISHED_CODEFINISHED_CODE
FINISHED_CODE
 
Verilog_Examples (1).pdf
Verilog_Examples (1).pdfVerilog_Examples (1).pdf
Verilog_Examples (1).pdf
 
Sine Wave Generator with controllable frequency displayed on a seven segment ...
Sine Wave Generator with controllable frequency displayed on a seven segment ...Sine Wave Generator with controllable frequency displayed on a seven segment ...
Sine Wave Generator with controllable frequency displayed on a seven segment ...
 
How do I draw the Labview code for pneumatic cylinder(air pistion). .pdf
How do I draw the Labview code for pneumatic cylinder(air pistion). .pdfHow do I draw the Labview code for pneumatic cylinder(air pistion). .pdf
How do I draw the Labview code for pneumatic cylinder(air pistion). .pdf
 
include ltiostreamgt include ltstringgt include .pdf
include ltiostreamgt include ltstringgt include .pdfinclude ltiostreamgt include ltstringgt include .pdf
include ltiostreamgt include ltstringgt include .pdf
 
How To Crack RSA Netrek Binary Verification System
How To Crack RSA Netrek Binary Verification SystemHow To Crack RSA Netrek Binary Verification System
How To Crack RSA Netrek Binary Verification System
 
Computer Networks Lab File
Computer Networks Lab FileComputer Networks Lab File
Computer Networks Lab File
 
REPORT
REPORTREPORT
REPORT
 
calc3build# calc3bison -y -d calc3.yflex calc3.lgcc -c .docx
calc3build# calc3bison -y -d calc3.yflex calc3.lgcc -c .docxcalc3build# calc3bison -y -d calc3.yflex calc3.lgcc -c .docx
calc3build# calc3bison -y -d calc3.yflex calc3.lgcc -c .docx
 
9.C Programming
9.C Programming9.C Programming
9.C Programming
 
To designing counters using verilog code
To designing counters using verilog codeTo designing counters using verilog code
To designing counters using verilog code
 
Runtime Code Generation and Data Management for Heterogeneous Computing in Java
Runtime Code Generation and Data Management for Heterogeneous Computing in JavaRuntime Code Generation and Data Management for Heterogeneous Computing in Java
Runtime Code Generation and Data Management for Heterogeneous Computing in Java
 
Dns server clients (actual program)
Dns server clients (actual program)Dns server clients (actual program)
Dns server clients (actual program)
 
Dns server clients (actual program)
Dns server clients (actual program)Dns server clients (actual program)
Dns server clients (actual program)
 
SQL techniques for faster applications
SQL techniques for faster applicationsSQL techniques for faster applications
SQL techniques for faster applications
 
Kaggle Google Quest Q&A Labeling 反省会 LT資料 47th place solution
Kaggle Google Quest Q&A Labeling 反省会 LT資料 47th place solutionKaggle Google Quest Q&A Labeling 反省会 LT資料 47th place solution
Kaggle Google Quest Q&A Labeling 反省会 LT資料 47th place solution
 
Verilog code
Verilog codeVerilog code
Verilog code
 
CPP Homework Help
CPP Homework HelpCPP Homework Help
CPP Homework Help
 
Python And GIS - Beyond Modelbuilder And Pythonwin
Python And GIS - Beyond Modelbuilder And PythonwinPython And GIS - Beyond Modelbuilder And Pythonwin
Python And GIS - Beyond Modelbuilder And Pythonwin
 

More from Thomas Knudstrup (9)

NinjaSynch
NinjaSynchNinjaSynch
NinjaSynch
 
CLinkedList
CLinkedListCLinkedList
CLinkedList
 
Generics
GenericsGenerics
Generics
 
distill
distilldistill
distill
 
assembly
assemblyassembly
assembly
 
Fibonnaci
FibonnaciFibonnaci
Fibonnaci
 
HappyFeat
HappyFeatHappyFeat
HappyFeat
 
Sorter
SorterSorter
Sorter
 
Sorter
SorterSorter
Sorter
 

GreyCount

  • 1. ///////////////////////////////////////////////////////////////////////////////// // Copywrite Thomas Knudstrup 1998 -2015 // Grey Code counter with segmentation and lookahead short cuts for speed and convenience // ////////////////////////////////////////////////////////////////////////////////// `timescale 1 ns/10 ps module grey_count ( clk, rst, mark, rtrn, count_gc_h, count_bn_h, // inc, count_gc, count_bn, cross_gc, cross_bn, zero ); ////////////////////////////////////////////////////////////////////////////////// // I/O ////////////////////////////////////////////////////////////////////////////////// input clk; input rst; input mark; input rtrn; output[19:0] count_gc_h; output[19:0] count_bn_h; input inc; output[19:0] count_gc; output[19:0] count_bn; input[19:0] cross_gc; output[19:0] cross_bn; input zero; ////////////////////////////////////////////////////////////////////////////////// // Signals ////////////////////////////////////////////////////////////////////////////////// reg[3:0] gcr0, gcr1, gcr2, gcr3, gcr4; reg gcr0_15, gcr1_15, gcr1_15_p, gcr2_15, gcr2_15_p, gcr3_15, gcr3_15_p; // reg[3:0] gcr0_h, gcr1_h, gcr2_h, gcr3_h, gcr4_h; reg gcr0_15_h, gcr1_15_h, gcr1_15_p_h, gcr2_15_h, gcr2_15_p_h, gcr3_15_h, gcr3_15_p_h; // wire[19:0] count_gc = {gcr4, gcr3 , gcr2 , gcr1 , gcr0}; wire gcr0up = !(^{gcr4,gcr3,gcr2,gcr1}), gcr1up = !(^{gcr4,gcr3,gcr2}), gcr2up = !(^{gcr4,gcr3}), gcr3up = !(^{gcr4});
  • 2. wire[19:0] count_bn = {gc2num(1,gcr4), gc2num(gcr3up,gcr3), gc2num(gcr2up,gcr2), gc2num(gcr1up,gcr1), gc2num(gcr0up,gcr0)}; wire[19:0] count_gc_h = {gcr4_h, gcr3_h, gcr2_h, gcr1_h, gcr0_h}; wire gcr0up_h = !(^{gcr4_h,gcr3_h,gcr2_h,gcr1_h}), gcr1up_h = !(^{gcr4_h,gcr3_h,gcr2_h}), gcr2up_h = !(^{gcr4_h,gcr3_h}), gcr3up_h = !(^{gcr4_h}); wire[19:0] count_bn_h = {gc2num(1,gcr4_h), gc2num(gcr3up_h,gcr3_h), gc2num(gcr2up_h,gcr2_h), gc2num(gcr1up_h,gcr1_h), gc2num(gcr0up_h,gcr0_h)}; wire count_nup = (count_gc !== count_gc_h); // wire ccr0up = !(^cross_gc[19:4]), ccr1up = !(^cross_gc[19:8]), ccr2up = !(^cross_gc[19:12]), ccr3up = !(^cross_gc[19:16]); wire[19:0] cross_bn = {gc2num(1,cross_gc[19:16]), gc2num(ccr3up,cross_gc[15:12]), gc2num(ccr2up,cross_gc[11:8]), gc2num(ccr1up,cross_gc[7:4]), gc2num(ccr0up,cross_gc[3:0])}; ////////////////////////////////////////////////////////////////////////////////// // Defines ////////////////////////////////////////////////////////////////////////////////// `define gc_00 4'b0000 `define gc_01 4'b0010 `define gc_02 4'b0011 `define gc_03 4'b0001 `define gc_04 4'b0101 `define gc_05 4'b0111 `define gc_06 4'b0110 `define gc_07 4'b0100 `define gc_08 4'b1100 `define gc_09 4'b1110 `define gc_10 4'b1111 `define gc_11 4'b1101 `define gc_12 4'b1001 `define gc_13 4'b1011 `define gc_14 4'b1010 `define gc_15 4'b1000 wire[3:0] n_gcr0 = (!gcr2_15_p&&!gcr1_15_p&&!gcr0_15) ? ((gcr0up) ? gc_inc(gcr0) : gc_dec(gcr0)) : gcr0; wire n_gcr0_15 = (gcr0up) ? (gcr0 == `gc_14) : (gcr0 == `gc_01); wire[3:0] n_gcr1 = (!gcr2_15_p&&!gcr1_15_p&&gcr0_15) ? ((gcr1up) ? gc_inc(gcr1) : gc_dec(gcr1)) : gcr1; wire n_gcr1_15 = (gcr0_15) ? ((gcr1up) ? (gcr1 == `gc_14) : (gcr1 == `gc_01)) : gcr1_15; wire n_gcr1_15_p = ((gcr0up) ? (gcr0 == `gc_14) : (gcr0 == `gc_01))&&gcr1_15; wire[3:0] n_gcr2 = ((!gcr2_15_p&&gcr1_15&&gcr0_15)) ? ((gcr2up) ? gc_inc(gcr2) : gc_dec(gcr2)) : gcr2; wire n_gcr2_15 = ((gcr1_15&&gcr0_15)) ? ((gcr2up) ? (gcr2 == `gc_14) : (gcr2 == `gc_01)) : gcr2_15; wire n_gcr2_15_p = ((gcr0up) ? (gcr0 == `gc_14) : (gcr0 == `gc_01))&&gcr1_15&&gcr2_15; wire[3:0] n_gcr3 = ((gcr2_15&&gcr1_15&&gcr0_15)) ? gc_inc(gcr3) : gcr3; wire n_gcr3_15 = ((gcr2_15&&gcr1_15&&gcr0_15)) ? ((gcr3up) ? (gcr3 == `gc_14) : (gcr3 == `gc_01)) : gcr3_15; wire n_gcr3_15_p = ((gcr0up) ? (gcr0 == `gc_14) : (gcr0 ==
  • 3. `gc_01))&&gcr1_15&&gcr2_15&&gcr3_15; wire[3:0] n_gcr4 = ((gcr3_15&&gcr2_15&&gcr1_15&&gcr0_15)) ? gc_inc(gcr4) : gcr4; always @(posedge clk) begin if (rst) begin gcr0 <= 4'd0; gcr0_15 <= 1'd0; gcr1 <= 4'd0; gcr1_15 <= 1'd0; gcr1_15_p <= 1'd0; gcr2 <= 4'd0; gcr2_15 <= 1'd0; gcr2_15_p <= 1'd0; gcr3 <= 4'd0; gcr3_15 <= 1'd0; gcr3_15_p <= 1'd0; gcr4 <= 4'd0; end else if(rtrn) begin gcr0 <= gcr0_h; gcr0_15 <= gcr0_15_h; gcr1 <= gcr1_h; gcr1_15 <= gcr1_15_h; gcr1_15_p <= gcr1_15_p_h; gcr2 <= gcr2_h; gcr2_15 <= gcr2_15_h; gcr2_15_p <= gcr2_15_p_h; gcr3 <= gcr3_h; gcr3_15 <= gcr3_15_h; gcr3_15_p <= gcr3_15_p_h; gcr4 <= gcr4_h; end else if(inc && zero) begin gcr0 <= 4'd0; gcr0_15 <= 1'd0; gcr1 <= 4'd0; gcr1_15 <= 1'd0; gcr1_15_p <= 1'd0; gcr2 <= 4'd0; gcr2_15 <= 1'd0; gcr2_15_p <= 1'd0; gcr3 <= 4'd0; gcr3_15 <= 1'd0; gcr3_15_p <= 1'd0; gcr4 <= 4'd0; end else if(inc) begin gcr0 <= n_gcr0; gcr0_15 <= n_gcr0_15; gcr1 <= n_gcr1; gcr1_15 <= n_gcr1_15; gcr1_15_p <= n_gcr1_15_p; gcr2 <= n_gcr2; gcr2_15 <= n_gcr2_15; gcr2_15_p <= n_gcr2_15_p; gcr3 <= n_gcr3; gcr3_15 <= n_gcr3_15; gcr3_15_p <= n_gcr3_15_p; gcr4 <= n_gcr4; end end // reg marked; always @(posedge clk) begin if(rst) marked <= 1'd0; else marked <= mark; end // always @(posedge clk) begin if(rst) begin gcr0_h <= 4'd0; gcr0_15_h <= 1'd0; gcr1_h <= 4'd0; gcr1_15_h <= 1'd0; gcr1_15_p_h <= 1'd0; gcr2_h <= 4'd0; gcr2_15_h <= 1'd0; gcr2_15_p_h <= 1'd0; gcr3_h <= 4'd0; gcr3_15_h <= 1'd0; gcr3_15_p_h <= 1'd0;
  • 4. gcr4_h <= 4'd0; end else if((inc&&!marked)) begin gcr0_h <= n_gcr0; gcr0_15_h <= n_gcr0_15; gcr1_h <= n_gcr1; gcr1_15_h <= n_gcr1_15; gcr1_15_p_h <= n_gcr1_15_p; gcr2_h <= n_gcr2; gcr2_15_h <= n_gcr2_15; gcr2_15_p_h <= n_gcr2_15_p; gcr3_h <= n_gcr3; gcr3_15_h <= n_gcr3_15; gcr3_15_p_h <= n_gcr3_15_p; gcr4_h <= n_gcr4; end else if((count_nup&&!marked)) begin gcr0_h <= gcr0; gcr0_15_h <= gcr0_15; gcr1_h <= gcr1; gcr1_15_h <= gcr1_15; gcr1_15_p_h <= gcr1_15_p; gcr2_h <= gcr2; gcr2_15_h <= gcr2_15; gcr2_15_p_h <= gcr2_15_p; gcr3_h <= gcr3; gcr3_15_h <= gcr3_15; gcr3_15_p_h <= gcr3_15_p; gcr4_h <= gcr4; end end // function[3:0] gc_inc; input[3:0] old_gcr; begin case(old_gcr) `gc_00 : gc_inc = `gc_01; `gc_01 : gc_inc = `gc_02; `gc_02 : gc_inc = `gc_03; `gc_03 : gc_inc = `gc_04; `gc_04 : gc_inc = `gc_05; `gc_05 : gc_inc = `gc_06; `gc_06 : gc_inc = `gc_07; `gc_07 : gc_inc = `gc_08; `gc_08 : gc_inc = `gc_09; `gc_09 : gc_inc = `gc_10; `gc_10 : gc_inc = `gc_11; `gc_11 : gc_inc = `gc_12; `gc_12 : gc_inc = `gc_13; `gc_13 : gc_inc = `gc_14; `gc_14 : gc_inc = `gc_15; `gc_15 : gc_inc = `gc_00; endcase end endfunction // function[3:0] gc_dec; input[3:0] old_gcr; begin
  • 5. case(old_gcr) `gc_00 : gc_dec = `gc_15; `gc_01 : gc_dec = `gc_00; `gc_02 : gc_dec = `gc_01; `gc_03 : gc_dec = `gc_02; `gc_04 : gc_dec = `gc_03; `gc_05 : gc_dec = `gc_04; `gc_06 : gc_dec = `gc_05; `gc_07 : gc_dec = `gc_06; `gc_08 : gc_dec = `gc_07; `gc_09 : gc_dec = `gc_08; `gc_10 : gc_dec = `gc_09; `gc_11 : gc_dec = `gc_10; `gc_12 : gc_dec = `gc_11; `gc_13 : gc_dec = `gc_12; `gc_14 : gc_dec = `gc_13; `gc_15 : gc_dec = `gc_14; endcase end endfunction // function[3:0] gc2num; input up; input[3:0] gcr; begin if(up) begin case(gcr) `gc_00 : gc2num = 4'd0; `gc_01 : gc2num = 4'd1; `gc_02 : gc2num = 4'd2; `gc_03 : gc2num = 4'd3; `gc_04 : gc2num = 4'd4; `gc_05 : gc2num = 4'd5; `gc_06 : gc2num = 4'd6; `gc_07 : gc2num = 4'd7; `gc_08 : gc2num = 4'd8; `gc_09 : gc2num = 4'd9; `gc_10 : gc2num = 4'd10; `gc_11 : gc2num = 4'd11; `gc_12 : gc2num = 4'd12; `gc_13 : gc2num = 4'd13; `gc_14 : gc2num = 4'd14; `gc_15 : gc2num = 4'd15; endcase end else begin case(gcr) `gc_00 : gc2num = 4'd15; `gc_01 : gc2num = 4'd14; `gc_02 : gc2num = 4'd13; `gc_03 : gc2num = 4'd12; `gc_04 : gc2num = 4'd11;
  • 6. `gc_05 : gc2num = 4'd10; `gc_06 : gc2num = 4'd9; `gc_07 : gc2num = 4'd8; `gc_08 : gc2num = 4'd7; `gc_09 : gc2num = 4'd6; `gc_10 : gc2num = 4'd5; `gc_11 : gc2num = 4'd4; `gc_12 : gc2num = 4'd3; `gc_13 : gc2num = 4'd2; `gc_14 : gc2num = 4'd1; `gc_15 : gc2num = 4'd0; endcase end end endfunction endmodule
  • 7. `gc_05 : gc2num = 4'd10; `gc_06 : gc2num = 4'd9; `gc_07 : gc2num = 4'd8; `gc_08 : gc2num = 4'd7; `gc_09 : gc2num = 4'd6; `gc_10 : gc2num = 4'd5; `gc_11 : gc2num = 4'd4; `gc_12 : gc2num = 4'd3; `gc_13 : gc2num = 4'd2; `gc_14 : gc2num = 4'd1; `gc_15 : gc2num = 4'd0; endcase end end endfunction endmodule