123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- //
- // Encodes a word in TMDS 8/10 format
- //
- module tmdsenc
- (
- input rst_n,
- input clk,
- input den, // Video data enable
- input [7:0] d, // Video data word
- input ten, // TERC data enable
- input [3:0] t, // TERC data
- input [1:0] c, // Control symbol
- output [9:0] q
- );
- // Control symbols
- wire [9:0] csym[0:3];
- assign csym[ 0] = 10'b11010_10100;
- assign csym[ 1] = 10'b00101_01011;
- assign csym[ 2] = 10'b01010_10100;
- assign csym[ 3] = 10'b10101_01011;
- // TERC4 symbols
- wire [9:0] tsym[0:15];
- assign tsym[ 0] = 10'b10100_11100;
- assign tsym[ 1] = 10'b10011_00011;
- assign tsym[ 2] = 10'b10111_00100;
- assign tsym[ 3] = 10'b10111_00010;
- assign tsym[ 4] = 10'b01011_10001;
- assign tsym[ 5] = 10'b01000_11110;
- assign tsym[ 6] = 10'b01100_01110;
- assign tsym[ 7] = 10'b01001_11100;
- assign tsym[ 8] = 10'b10110_01100;
- assign tsym[ 9] = 10'b01001_11001;
- assign tsym[10] = 10'b01100_11100;
- assign tsym[11] = 10'b10110_00110;
- assign tsym[12] = 10'b10100_01110;
- assign tsym[13] = 10'b10011_10001;
- assign tsym[14] = 10'b01011_00011;
- assign tsym[15] = 10'b10110_00011;
- reg signed [4:0] disparity; // Running disparity/2
- reg [9:0] qreg;
- assign q = qreg;
- reg [7:0] dreg;
- reg denreg;
- reg [3:0] treg;
- reg tenreg;
- reg [1:0] creg;
- wire signed [3:0] ddisp =
- dreg[7] + dreg[6] + dreg[5] + dreg[4] +
- dreg[3] + dreg[2] + dreg[1] + dreg[0] - 'sd4;
- reg [8:0] dx; // X(N)OR stage output
- wire signed [3:0] xdisp = // Does not include dx[8]!
- dx[7] + dx[6] + dx[5] + dx[4] +
- dx[3] + dx[2] + dx[1] + dx[0] - 'sd4;
- always_comb
- begin
- dx[8] = $signed(ddisp | { 3'd0, ~dreg[0] }) <= 4'sd0;
- 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 @ (*)
- reg [9:0] dq; // Disparity stage output
- always_comb
- begin
- dq[9] = ((disparity == 5'sd0) | (xdisp == 4'sd0))
- ? ~dx[8] : ( disparity[4] == xdisp[3] );
- dq[8] = dx[8];
- dq[7:0] = dx[7:0] ^ {{8{dq[9]}}};
- end
- wire signed [3:0] qdisp =
- dq[9] + dq[8] + dq[7] + dq[6] + dq[5] +
- dq[4] + dq[3] + dq[2] + dq[1] + dq[0] - 'sd5;
- always @(negedge rst_n or posedge clk)
- if (~rst_n)
- begin
- disparity <= 'sd0;
- qreg <= csym[0];
- dreg <= 8'bx;
- denreg <= 1'b0;
- tenreg <= 1'b0;
- treg <= 4'bx;
- creg <= 2'b00;
- end
- else
- begin
- denreg <= den;
- tenreg <= ten;
- creg <= c;
- treg <= t;
- dreg <= d;
- if (denreg)
- begin
- qreg <= dq;
- disparity <= disparity + qdisp;
- end
- else
- begin
- qreg <= tenreg ? tsym[treg] : csym[creg];
- disparity <= 'sd0;
- end
- end // else: !if(~rst_n)
- endmodule // tmdsenc
|