More Related Content
Similar to GreyCount (20)
More from Thomas Knudstrup
More from Thomas Knudstrup (9)
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