1
0
mirror of https://github.com/pConst/basic_verilog.git synced 2025-02-04 07:12:56 +08:00
Konstantin Pavlov (pt) 40533743d7 Added altera cookbook
2015-12-15 22:44:58 +03:00

506 lines
15 KiB
Verilog

// Copyright 2007 Altera Corporation. All rights reserved.
// Altera products are protected under numerous U.S. and foreign patents,
// maskwork rights, copyrights and other intellectual property laws.
//
// This reference design file, and your use thereof, is subject to and governed
// by the terms and conditions of the applicable Altera Reference Design
// License Agreement (either as signed by you or found at www.altera.com). By
// using this reference design file, you indicate your acceptance of such terms
// and conditions between you and Altera Corporation. In the event that you do
// not agree with such terms and conditions, you may not use the reference
// design file and please promptly destroy any copies you have made.
//
// This reference design file is being provided on an "as-is" basis and as an
// accommodation and therefore all warranties, representations or guarantees of
// any kind (whether express, implied or statutory) including, without
// limitation, warranties of merchantability, non-infringement, or fitness for
// a particular purpose, are specifically disclaimed. By making this reference
// design file available, Altera expressly does not recommend, suggest or
// require that this reference design file be used in combination with any
// other product not provided by Altera.
/////////////////////////////////////////////////////////////////////////////
// baeckler - 04-10-2006
// an 8b10b encoder, based on files from Martin R and IBM paper
module encoder_8b10b (
clk,
rst,
kin_ena, // Data in is a special code, not all are legal.
ein_ena, // Data (or code) input enable
ein_dat, // 8b data in
ein_rd, // running disparity input
eout_val, // data out is valid
eout_dat, // data out
eout_rdcomb, // running disparity output (comb)
eout_rdreg // running disparity output (reg)
);
// method = 0 is generic for comparison / test
// method = 1 is speed optimized
parameter METHOD = 1;
input clk;
input rst;
input kin_ena;
input ein_ena;
input [7:0] ein_dat;
input ein_rd;
output eout_val;
output[9:0] eout_dat;
output eout_rdcomb;
output eout_rdreg;
wire ein_rd;
wire ein_ena;
wire [7:0] ein_dat;
reg eout_val;
reg [9:0] eout_dat;
wire A = ein_dat[0];
wire B = ein_dat[1];
wire C = ein_dat[2];
wire D = ein_dat[3];
wire E = ein_dat[4];
wire F = ein_dat[5];
wire G = ein_dat[6];
wire H = ein_dat[7];
wire K = kin_ena;
reg rd1_part /* synthesis keep */;
reg rd1;
reg eout_rdcomb;
reg eout_rdreg;
reg SorK;
reg a,b,c,d,e,f,g,h,i,j;
generate
if (METHOD == 0) begin
//classification
wire L04 = (!A & !B & !C & !D);
wire L13 = (!A & !B & !C & D) | (!A & !B & C & !D) | (!A & B & !C & !D) | (A & !B & !C & !D);
wire L22 = (!A & !B & C & D) | (!A & B & C & !D) | (A & B & !C & !D) | (A & !B & C & !D) | (A & !B & !C & D) | (!A & B & !C & D);
wire L31 = (A & B & C & !D) | (A & B & !C & D) | (A & !B & C & D) | (!A & B & C & D);
wire L40 = (A & B & C & D);
wire disp0 = (!L22 & !L31 & !E);
wire disp1 = (L31 & !D & !E);
wire disp2 = (L13 & D & E);
wire disp3 = (!L22 & !L13 & E);
wire invert_ai = !(ein_rd ? (disp3 | disp1 | K) : (disp0 | disp2));
always @(*)
begin
a = !A ^ invert_ai;
b = ((L04) ? 0 : (L40) ? 1 :!B) ^ invert_ai;
c = ((L04) ? 0 : (L13 & D & E) ? 0 : !C) ^ invert_ai;
d = ((L40) ? 1 : !D) ^ invert_ai;
e = ((L13 & !E) ? 0 : (L13 & D & E) ? 1 : !E) ^ invert_ai;
i = ((L22 & !E) ? 0 : (L04 & E) ? 0 : (L13 & !D & E) ? 0 :
(L40 & E) ? 0 : (L22 & K) ? 0 : 1) ^ invert_ai;
rd1_part = (disp0 | disp2 | disp3);
rd1 = (rd1_part | K) ^ ein_rd;
end
always @(*)
begin
SorK = ( e & i & !rd1) | (!e & !i & rd1) | K;
end
wire disp4 = (!F & !G);
wire disp5 = (F & G);
wire disp6 = ((F ^ G) & K);
wire invert_fj = !(rd1 ? disp5 : (disp4 | disp6));
always @(*)
begin
f = ((F & G & H & (SorK)) ? 1 : !F) ^ invert_fj;
g = ((!F & !G & !H) ? 0 : !G) ^ invert_fj;
h = (!H) ^ invert_fj;
j = (((F ^ G) & !H) ? 0 : (F & G & H & (SorK)) ? 0 : 1) ^ invert_fj;
eout_rdcomb = (disp4 | (F & G & H)) ^ rd1;
end
end
else if (METHOD == 1) begin
wire rdout_x,rdout_y;
stratixii_lcell_comb rdoutx (
.dataa (!B),.datab (!D),.datac (!E),.datad (!A),.datae (!C),.dataf (!K),.datag(1'b1),
.cin(1'b1),.sharein(1'b0),.sumout(),.cout(),.shareout(),
.combout(rdout_x));
defparam rdoutx .lut_mask = 64'h157E7EE800000000;
defparam rdoutx .shared_arith = "off";
defparam rdoutx .extended_lut = "off";
stratixii_lcell_comb rdouty (
.dataa (!H),.datab (!ein_rd),.datac (!F),.datad (!G),.datae (!rdout_x),.dataf (!rdout_x),.datag(1'b1),
.cin(1'b1),.sharein(1'b0),.sumout(),.cout(),.shareout(),
.combout(rdout_y));
defparam rdouty .lut_mask = 64'h3CC99663699CC336;
defparam rdouty .shared_arith = "off";
defparam rdouty .extended_lut = "off";
always @(*) begin
eout_rdcomb = rdout_y;
case ({ein_rd,ein_dat[4:0],kin_ena})
7'h00 : {i,e,d,c,b,a} = 6'h39;
7'h01 : {i,e,d,c,b,a} = 6'h39;
7'h02 : {i,e,d,c,b,a} = 6'h2e;
7'h03 : {i,e,d,c,b,a} = 6'h2e;
7'h04 : {i,e,d,c,b,a} = 6'h2d;
7'h05 : {i,e,d,c,b,a} = 6'h2d;
7'h06 : {i,e,d,c,b,a} = 6'h23;
7'h07 : {i,e,d,c,b,a} = 6'h23;
7'h08 : {i,e,d,c,b,a} = 6'h2b;
7'h09 : {i,e,d,c,b,a} = 6'h2b;
7'h0a : {i,e,d,c,b,a} = 6'h25;
7'h0b : {i,e,d,c,b,a} = 6'h25;
7'h0c : {i,e,d,c,b,a} = 6'h26;
7'h0d : {i,e,d,c,b,a} = 6'h26;
7'h0e : {i,e,d,c,b,a} = 6'h07;
7'h0f : {i,e,d,c,b,a} = 6'h07;
7'h10 : {i,e,d,c,b,a} = 6'h27;
7'h11 : {i,e,d,c,b,a} = 6'h27;
7'h12 : {i,e,d,c,b,a} = 6'h29;
7'h13 : {i,e,d,c,b,a} = 6'h29;
7'h14 : {i,e,d,c,b,a} = 6'h2a;
7'h15 : {i,e,d,c,b,a} = 6'h2a;
7'h16 : {i,e,d,c,b,a} = 6'h0b;
7'h17 : {i,e,d,c,b,a} = 6'h0b;
7'h18 : {i,e,d,c,b,a} = 6'h2c;
7'h19 : {i,e,d,c,b,a} = 6'h2c;
7'h1a : {i,e,d,c,b,a} = 6'h0d;
7'h1b : {i,e,d,c,b,a} = 6'h0d;
7'h1c : {i,e,d,c,b,a} = 6'h0e;
7'h1d : {i,e,d,c,b,a} = 6'h0e;
7'h1e : {i,e,d,c,b,a} = 6'h3a;
7'h1f : {i,e,d,c,b,a} = 6'h3a;
7'h20 : {i,e,d,c,b,a} = 6'h36;
7'h21 : {i,e,d,c,b,a} = 6'h36;
7'h22 : {i,e,d,c,b,a} = 6'h31;
7'h23 : {i,e,d,c,b,a} = 6'h31;
7'h24 : {i,e,d,c,b,a} = 6'h32;
7'h25 : {i,e,d,c,b,a} = 6'h32;
7'h26 : {i,e,d,c,b,a} = 6'h13;
7'h27 : {i,e,d,c,b,a} = 6'h33;
7'h28 : {i,e,d,c,b,a} = 6'h34;
7'h29 : {i,e,d,c,b,a} = 6'h34;
7'h2a : {i,e,d,c,b,a} = 6'h15;
7'h2b : {i,e,d,c,b,a} = 6'h35;
7'h2c : {i,e,d,c,b,a} = 6'h16;
7'h2d : {i,e,d,c,b,a} = 6'h36;
7'h2e : {i,e,d,c,b,a} = 6'h17;
7'h2f : {i,e,d,c,b,a} = 6'h17;
7'h30 : {i,e,d,c,b,a} = 6'h33;
7'h31 : {i,e,d,c,b,a} = 6'h33;
7'h32 : {i,e,d,c,b,a} = 6'h19;
7'h33 : {i,e,d,c,b,a} = 6'h39;
7'h34 : {i,e,d,c,b,a} = 6'h1a;
7'h35 : {i,e,d,c,b,a} = 6'h3a;
7'h36 : {i,e,d,c,b,a} = 6'h1b;
7'h37 : {i,e,d,c,b,a} = 6'h1b;
7'h38 : {i,e,d,c,b,a} = 6'h1c;
7'h39 : {i,e,d,c,b,a} = 6'h3c;
7'h3a : {i,e,d,c,b,a} = 6'h1d;
7'h3b : {i,e,d,c,b,a} = 6'h1d;
7'h3c : {i,e,d,c,b,a} = 6'h1e;
7'h3d : {i,e,d,c,b,a} = 6'h1e;
7'h3e : {i,e,d,c,b,a} = 6'h35;
7'h3f : {i,e,d,c,b,a} = 6'h35;
7'h40 : {i,e,d,c,b,a} = 6'h06;
7'h41 : {i,e,d,c,b,a} = 6'h39;
7'h42 : {i,e,d,c,b,a} = 6'h11;
7'h43 : {i,e,d,c,b,a} = 6'h2e;
7'h44 : {i,e,d,c,b,a} = 6'h12;
7'h45 : {i,e,d,c,b,a} = 6'h2d;
7'h46 : {i,e,d,c,b,a} = 6'h23;
7'h47 : {i,e,d,c,b,a} = 6'h1c;
7'h48 : {i,e,d,c,b,a} = 6'h14;
7'h49 : {i,e,d,c,b,a} = 6'h2b;
7'h4a : {i,e,d,c,b,a} = 6'h25;
7'h4b : {i,e,d,c,b,a} = 6'h1a;
7'h4c : {i,e,d,c,b,a} = 6'h26;
7'h4d : {i,e,d,c,b,a} = 6'h19;
7'h4e : {i,e,d,c,b,a} = 6'h38;
7'h4f : {i,e,d,c,b,a} = 6'h38;
7'h50 : {i,e,d,c,b,a} = 6'h18;
7'h51 : {i,e,d,c,b,a} = 6'h27;
7'h52 : {i,e,d,c,b,a} = 6'h29;
7'h53 : {i,e,d,c,b,a} = 6'h16;
7'h54 : {i,e,d,c,b,a} = 6'h2a;
7'h55 : {i,e,d,c,b,a} = 6'h15;
7'h56 : {i,e,d,c,b,a} = 6'h0b;
7'h57 : {i,e,d,c,b,a} = 6'h34;
7'h58 : {i,e,d,c,b,a} = 6'h2c;
7'h59 : {i,e,d,c,b,a} = 6'h13;
7'h5a : {i,e,d,c,b,a} = 6'h0d;
7'h5b : {i,e,d,c,b,a} = 6'h32;
7'h5c : {i,e,d,c,b,a} = 6'h0e;
7'h5d : {i,e,d,c,b,a} = 6'h31;
7'h5e : {i,e,d,c,b,a} = 6'h05;
7'h5f : {i,e,d,c,b,a} = 6'h3a;
7'h60 : {i,e,d,c,b,a} = 6'h09;
7'h61 : {i,e,d,c,b,a} = 6'h09;
7'h62 : {i,e,d,c,b,a} = 6'h31;
7'h63 : {i,e,d,c,b,a} = 6'h0e;
7'h64 : {i,e,d,c,b,a} = 6'h32;
7'h65 : {i,e,d,c,b,a} = 6'h0d;
7'h66 : {i,e,d,c,b,a} = 6'h13;
7'h67 : {i,e,d,c,b,a} = 6'h0c;
7'h68 : {i,e,d,c,b,a} = 6'h34;
7'h69 : {i,e,d,c,b,a} = 6'h0b;
7'h6a : {i,e,d,c,b,a} = 6'h15;
7'h6b : {i,e,d,c,b,a} = 6'h0a;
7'h6c : {i,e,d,c,b,a} = 6'h16;
7'h6d : {i,e,d,c,b,a} = 6'h09;
7'h6e : {i,e,d,c,b,a} = 6'h28;
7'h6f : {i,e,d,c,b,a} = 6'h28;
7'h70 : {i,e,d,c,b,a} = 6'h0c;
7'h71 : {i,e,d,c,b,a} = 6'h33;
7'h72 : {i,e,d,c,b,a} = 6'h19;
7'h73 : {i,e,d,c,b,a} = 6'h06;
7'h74 : {i,e,d,c,b,a} = 6'h1a;
7'h75 : {i,e,d,c,b,a} = 6'h05;
7'h76 : {i,e,d,c,b,a} = 6'h24;
7'h77 : {i,e,d,c,b,a} = 6'h24;
7'h78 : {i,e,d,c,b,a} = 6'h1c;
7'h79 : {i,e,d,c,b,a} = 6'h03;
7'h7a : {i,e,d,c,b,a} = 6'h22;
7'h7b : {i,e,d,c,b,a} = 6'h22;
7'h7c : {i,e,d,c,b,a} = 6'h21;
7'h7d : {i,e,d,c,b,a} = 6'h21;
7'h7e : {i,e,d,c,b,a} = 6'h0a;
7'h7f : {i,e,d,c,b,a} = 6'h0a;
endcase
case (ein_dat[4:0])
5'h00 : rd1_part = 1'b1;
5'h01 : rd1_part = 1'b1;
5'h02 : rd1_part = 1'b1;
5'h03 : rd1_part = 1'b0;
5'h04 : rd1_part = 1'b1;
5'h05 : rd1_part = 1'b0;
5'h06 : rd1_part = 1'b0;
5'h07 : rd1_part = 1'b0;
5'h08 : rd1_part = 1'b1;
5'h09 : rd1_part = 1'b0;
5'h0a : rd1_part = 1'b0;
5'h0b : rd1_part = 1'b0;
5'h0c : rd1_part = 1'b0;
5'h0d : rd1_part = 1'b0;
5'h0e : rd1_part = 1'b0;
5'h0f : rd1_part = 1'b1;
5'h10 : rd1_part = 1'b1;
5'h11 : rd1_part = 1'b0;
5'h12 : rd1_part = 1'b0;
5'h13 : rd1_part = 1'b0;
5'h14 : rd1_part = 1'b0;
5'h15 : rd1_part = 1'b0;
5'h16 : rd1_part = 1'b0;
5'h17 : rd1_part = 1'b1;
5'h18 : rd1_part = 1'b1;
5'h19 : rd1_part = 1'b0;
5'h1a : rd1_part = 1'b0;
5'h1b : rd1_part = 1'b1;
5'h1c : rd1_part = 1'b0;
5'h1d : rd1_part = 1'b1;
5'h1e : rd1_part = 1'b1;
5'h1f : rd1_part = 1'b1;
endcase
end
wire disp4 = (!F & !G);
wire disp5 = (F & G);
wire disp6 = ((F ^ G) & K);
wire invert_fj = !(((rd1_part | K) ^ ein_rd) ? disp5 : (disp4 | disp6));
always @(*)
begin
g = (!(!F & !H) & !G) ^ invert_fj;
h = (!H) ^ invert_fj;
end
wire f0,f1,f2,f3,f4;
stratixii_lcell_comb f0_I (
.dataa(!ein_dat[3]),
.datab(!ein_dat[4]),
.datac(!ein_dat[1]),
.datad(!ein_dat[2]),
.datae(!ein_dat[0]),
.dataf(1'b1),.datag(1'b1),
.cin(1'b1),.sharein(1'b0),.sumout(),.cout(),.shareout(),
.combout(f0 ));
defparam f0_I .shared_arith = "off";
defparam f0_I .extended_lut = "off";
defparam f0_I .lut_mask = 64'h0224244002242440;
stratixii_lcell_comb f1_I (
.dataa(!ein_rd),
.datab(!ein_dat[7]),
.datac(!ein_dat[6]),
.datad(!ein_dat[5]),
.datae(!kin_ena),
.dataf(1'b1),.datag(1'b1),
.cin(1'b1),.sharein(1'b0),.sumout(),.cout(),.shareout(),
.combout(f1 ));
defparam f1_I .shared_arith = "off";
defparam f1_I .extended_lut = "off";
defparam f1_I .lut_mask = 64'h0F03AA590F03AA59;
stratixii_lcell_comb f2_I (
.dataa(!ein_rd),
.datab(!ein_dat[7]),
.datac(!ein_dat[6]),
.datad(!ein_dat[5]),
.datae(!kin_ena),
.dataf(1'b1),.datag(1'b1),
.cin(1'b1),.sharein(1'b0),.sumout(),.cout(),.shareout(),
.combout(f2 ));
defparam f2_I .shared_arith = "off";
defparam f2_I .extended_lut = "off";
defparam f2_I .lut_mask = 64'h00F355A600F355A6;
stratixii_lcell_comb f3_I (
.dataa(!f4 ),
.datab(!f0 ),
.datac(!ein_rd),
.datad(!f1 ),
.datae(!f2 ),
.dataf(1'b1),.datag(1'b1),
.cin(1'b1),.sharein(1'b0),.sumout(),.cout(),.shareout(),
.combout(f3 ));
defparam f3_I .shared_arith = "off";
defparam f3_I .extended_lut = "off";
defparam f3_I .lut_mask = 64'h7800FF597800FF59;
stratixii_lcell_comb f4_I (
.dataa(!ein_dat[3]),
.datab(!ein_dat[4]),
.datac(!ein_dat[1]),
.datad(!ein_dat[2]),
.datae(!ein_dat[0]),
.dataf(1'b1),.datag(1'b1),
.cin(1'b1),.sharein(1'b0),.sumout(),.cout(),.shareout(),
.combout(f4 ));
defparam f4_I .shared_arith = "off";
defparam f4_I .extended_lut = "off";
defparam f4_I .lut_mask = 64'h055E5EE8055E5EE8;
always @(*)
begin
f = f3;
end
wire j0,j1,j2,j3,j4,j5;
stratixii_lcell_comb j0_I (
.dataa(!ein_dat[1]),
.datab(!ein_dat[3]),
.datac(!ein_dat[4]),
.datad(!ein_dat[2]),
.datae(!ein_dat[0]),
.dataf(1'b1),.datag(1'b1),
.cin(1'b1),.sharein(1'b0),.sumout(),.cout(),.shareout(),
.combout(j0 ));
defparam j0_I .shared_arith = "off";
defparam j0_I .extended_lut = "off";
defparam j0_I .lut_mask = 64'h117676E8117676E8;
stratixii_lcell_comb j1_I (
.dataa(!ein_dat[1]),
.datab(!ein_dat[3]),
.datac(!ein_dat[4]),
.datad(!ein_dat[2]),
.datae(!ein_dat[0]),
.dataf(1'b1),.datag(1'b1),
.cin(1'b1),.sharein(1'b0),.sumout(),.cout(),.shareout(),
.combout(j1 ));
defparam j1_I .shared_arith = "off";
defparam j1_I .extended_lut = "off";
defparam j1_I .lut_mask = 64'h0418182004181820;
stratixii_lcell_comb j2_I (
.dataa(!ein_rd),
.datab(!ein_dat[7]),
.datac(!ein_dat[5]),
.datad(!ein_dat[6]),
.datae(!kin_ena),
.dataf(1'b1),.datag(1'b1),
.cin(1'b1),.sharein(1'b0),.sumout(),.cout(),.shareout(),
.combout(j2 ));
defparam j2_I .shared_arith = "off";
defparam j2_I .extended_lut = "off";
defparam j2_I .lut_mask = 64'h5339A6665339A666;
stratixii_lcell_comb j3_I (
.datac(!ein_dat[5]),
.datad(!ein_dat[6]),
.datae(!kin_ena),
.dataa(1'b1),.datab(1'b1),.dataf(1'b1),.datag(1'b1),
.cin(1'b1),.sharein(1'b0),.sumout(),.cout(),.shareout(),
.combout(j3 ));
defparam j3_I .shared_arith = "off";
defparam j3_I .extended_lut = "off";
defparam j3_I .lut_mask = 64'hF00F0000F00F0000;
stratixii_lcell_comb j4_I (
.datab(!ein_dat[7]),
.datac(!ein_dat[5]),
.datad(!ein_dat[6]),
.datae(!kin_ena),
.dataa(1'b1),.dataf(1'b1),.datag(1'b1),
.cin(1'b1),.sharein(1'b0),.sumout(),.cout(),.shareout(),
.combout(j4 ));
defparam j4_I .shared_arith = "off";
defparam j4_I .extended_lut = "off";
defparam j4_I .lut_mask = 64'h0003000000030000;
stratixii_lcell_comb j5_I (
.dataa(!j0 ),
.datab(!j1 ),
.datac(!j2 ),
.datad(!j3 ),
.datae(!j4 ),
.dataf(1'b1),.datag(1'b1),
.cin(1'b1),.sharein(1'b0),.sumout(),.cout(),.shareout(),
.combout(j5 ));
defparam j5_I .shared_arith = "off";
defparam j5_I .extended_lut = "off";
defparam j5_I .lut_mask = 64'hF07870A6F07870A6;
always @(*)
begin
j = j5;
end
end
endgenerate
always @(posedge clk or posedge rst)
begin
if (rst)
begin
eout_rdreg <= 0;
eout_val <= 0;
eout_dat <= 0;
end
else
begin
eout_val <= 0;
if (ein_ena | kin_ena)
begin
eout_rdreg <= eout_rdcomb;
eout_val <= ein_ena | kin_ena;
eout_dat <= {j,h,g,f,i,e,d,c,b,a};
end
end
end
endmodule