| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 | //// Encodes a word in TMDS 8/10 format//`undef USE_TMDSROM`ifdef USE_TMDSROMmodule tmdsenc  (   input	rst_n,   input	clk,   input	den, // It is a data word, not a control word   input [7:0]	d, // Data word   input [1:0]	c, // Control word   output [9:0] q   );   reg signed [3:0]	     disparity; // Running disparity/2   reg [9:0]		     qreg;   assign q = qreg;   wire [15:0]		     romq;   tmdsrom tmdsrom (		    .clk ( clk ),		    .d ( d ),		    .q ( romq )		    );   // Delay two cycles to match tmdsrom   reg [1:0]		     denreg;   reg [1:0]		     creg[2];   wire invert =	(disparity > 4'sd0 & romq[10]) |	(disparity < 4'sd0 & romq[11]);   wire cp =  creg[1][0];   wire cn = ~creg[1][0];   wire cx = ~creg[1][0] ^ creg[1][1]; // XNOR of C1 and C0   always @(negedge rst_n or posedge clk)     if (~rst_n)       begin	  disparity <= 4'sd0;	  denreg    <= 2'b00;	  creg[0]   <= 2'b00;	  creg[1]   <= 2'b00;       end     else       begin	  denreg <= { denreg[0], den };	  creg[0] <= c;	  creg[1] <= creg[0];	  if (denreg[1])	    begin	       qreg <= romq[9:0] ^ (invert ? 10'h2ff : 10'h000);	       disparity <= invert ?			    disparity - romq[15:12] :			    disparity + romq[15:12];	    end	  else	    begin	       qreg <= { cx, {4{cn, cp}}, cp };	       disparity <= 4'd0;	    end // else: !if(den)       end // else: !if(~rst_n)endmodule // tmdsenc`else // not USE_TMDSROMmodule tmdsenc  (   input	rst_n,   input	clk,   input	den, // It is a data word, not a control word   input [7:0]	d, // Data word   input [1:0]	c, // Control word   output [9:0] q   );   reg signed [3:0] disparity; // Running disparity/2   reg [9:0]	    qreg = 10'b11010101000; // Symbol C0   assign q = qreg;   reg [7:0]	    dreg;   reg		    denreg;   reg [1:0]	    creg;   wire signed [2:0] delta =	((dreg[7] + dreg[6]) + (dreg[5] + dreg[4])) +	((dreg[3] + dreg[2]) + (dreg[1] + dreg[0])) - 3'sd4;   reg [8:0]	     dx;		// X(N)OR stage output   always @(*)     begin	dx[8] = (delta > 3'sd0) | (~&delta & ~dreg[0]);	dx[0] = dreg[0];	dx[1] = dx[0] ^ dreg[1] ^ ~dx[8];	dx[2] = dx[1] ^ dreg[2] ^ ~dx[8];	dx[3] = dx[2] ^ dreg[3] ^ ~dx[8];	dx[4] = dx[3] ^ dreg[4] ^ ~dx[8];	dx[5] = dx[4] ^ dreg[5] ^ ~dx[8];	dx[6] = dx[5] ^ dreg[6] ^ ~dx[8];	dx[7] = dx[6] ^ dreg[7] ^ ~dx[8];     end // always @ (*)   wire cp =  creg[0];   wire cn = ~creg[0];   wire cx = ~creg[0] ^ creg[1];	// XNOR of c[1] and c[0]   always @(negedge rst_n or posedge clk)     if (~rst_n)       begin	  disparity <= 4'sd0;	  qreg      <= 10'b11010101000;	  dreg      <= 8'hxx;	  denreg    <= 1'b0;	  creg      <= 2'b00;       end     else       begin	  denreg <= den;	  creg   <= c;	  dreg   <= d;	  if (denreg)	    begin	       if ( (disparity == 4'sd0) | (delta == 3'sd0) )		 begin		    qreg <= { ~dx[8], dx[8], dx[7:0] ^ ~{8{dx[8]}} };	            disparity <= dx[8] ?			    disparity + delta :			    disparity - delta;	         end	       else if ( disparity[3] ^ ~delta[2] )		 begin		    qreg <= { 1'b1, dx[8], ~dx[7:0] };		    disparity <= disparity - (delta - dx[8]);		 end	       else		 begin		    qreg <= { 1'b0, dx[8], dx[7:0] };		    disparity <= disparity + (delta - ~dx[8]);		 end	    end // if (den)	  else	    begin	       qreg <= { cx, {4{cn, cp}}, cp };	       disparity <= 4'sd0;	    end // else: !if(den)       end // else: !if(~rst_n)endmodule // tmdsenc`endif
 |