x393  1.0
FPGAcodeforElphelNC393camera
scrambler.v
Go to the documentation of this file.
1 
39 /*
40  Algorithm is taken from the doc, p.565. TODO make it parallel
41  */
42 // TODO another widths support
43 module scrambler #(
44  parameter DATA_BYTE_WIDTH = 4
45 )
46 (
47  input wire clk,
48  input wire rst,
49 
50  input wire val_in,
51  input wire [DATA_BYTE_WIDTH*8 - 1:0] data_in,
52  output wire [DATA_BYTE_WIDTH*8 - 1:0] data_out
53 );
54 
55 reg [15:0] now;
56 reg [31:0] next;
57 
58 always @ (posedge clk)
59  now <= rst ? 16'hf0f6 : val_in ? next[31:16] : now;
60 
61 assign data_out = val_in ? data_in ^ next : data_in;
62 
63 always @ (*)
64 /* if (rst)
65  next = 32'h0;
66  else**/
67  begin
68  next[31] = now[12] ^ now[10] ^ now[7] ^ now[3] ^ now[1] ^ now[0];
69  next[30] = now[15] ^ now[14] ^ now[12] ^ now[11] ^ now[9] ^ now[6] ^ now[3] ^ now[2] ^ now[0];
70  next[29] = now[15] ^ now[13] ^ now[12] ^ now[11] ^ now[10] ^ now[8] ^ now[5] ^ now[3] ^ now[2] ^ now[1];
71  next[28] = now[14] ^ now[12] ^ now[11] ^ now[10] ^ now[9] ^ now[7] ^ now[4] ^ now[2] ^ now[1] ^ now[0];
72  next[27] = now[15] ^ now[14] ^ now[13] ^ now[12] ^ now[11] ^ now[10] ^ now[9] ^ now[8] ^ now[6] ^ now[1] ^ now[0];
73  next[26] = now[15] ^ now[13] ^ now[11] ^ now[10] ^ now[9] ^ now[8] ^ now[7] ^ now[5] ^ now[3] ^ now[0];
74  next[25] = now[15] ^ now[10] ^ now[9] ^ now[8] ^ now[7] ^ now[6] ^ now[4] ^ now[3] ^ now[2];
75  next[24] = now[14] ^ now[9] ^ now[8] ^ now[7] ^ now[6] ^ now[5] ^ now[3] ^ now[2] ^ now[1];
76  next[23] = now[13] ^ now[8] ^ now[7] ^ now[6] ^ now[5] ^ now[4] ^ now[2] ^ now[1] ^ now[0];
77  next[22] = now[15] ^ now[14] ^ now[7] ^ now[6] ^ now[5] ^ now[4] ^ now[1] ^ now[0];
78  next[21] = now[15] ^ now[13] ^ now[12] ^ now[6] ^ now[5] ^ now[4] ^ now[0];
79  next[20] = now[15] ^ now[11] ^ now[5] ^ now[4];
80  next[19] = now[14] ^ now[10] ^ now[4] ^ now[3];
81  next[18] = now[13] ^ now[9] ^ now[3] ^ now[2];
82  next[17] = now[12] ^ now[8] ^ now[2] ^ now[1];
83  next[16] = now[11] ^ now[7] ^ now[1] ^ now[0];
84 
85  next[15] = now[15] ^ now[14] ^ now[12] ^ now[10] ^ now[6] ^ now[3] ^ now[0];
86  next[14] = now[15] ^ now[13] ^ now[12] ^ now[11] ^ now[9] ^ now[5] ^ now[3] ^ now[2];
87  next[13] = now[14] ^ now[12] ^ now[11] ^ now[10] ^ now[8] ^ now[4] ^ now[2] ^ now[1];
88  next[12] = now[13] ^ now[11] ^ now[10] ^ now[9] ^ now[7] ^ now[3] ^ now[1] ^ now[0];
89  next[11] = now[15] ^ now[14] ^ now[10] ^ now[9] ^ now[8] ^ now[6] ^ now[3] ^ now[2] ^ now[0];
90  next[10] = now[15] ^ now[13] ^ now[12] ^ now[9] ^ now[8] ^ now[7] ^ now[5] ^ now[3] ^ now[2] ^ now[1];
91  next[9] = now[14] ^ now[12] ^ now[11] ^ now[8] ^ now[7] ^ now[6] ^ now[4] ^ now[2] ^ now[1] ^ now[0];
92  next[8] = now[15] ^ now[14] ^ now[13] ^ now[12] ^ now[11] ^ now[10] ^ now[7] ^ now[6] ^ now[5] ^ now[1] ^ now[0];
93  next[7] = now[15] ^ now[13] ^ now[11] ^ now[10] ^ now[9] ^ now[6] ^ now[5] ^ now[4] ^ now[3] ^ now[0];
94  next[6] = now[15] ^ now[10] ^ now[9] ^ now[8] ^ now[5] ^ now[4] ^ now[2];
95  next[5] = now[14] ^ now[9] ^ now[8] ^ now[7] ^ now[4] ^ now[3] ^ now[1];
96  next[4] = now[13] ^ now[8] ^ now[7] ^ now[6] ^ now[3] ^ now[2] ^ now[0];
97  next[3] = now[15] ^ now[14] ^ now[7] ^ now[6] ^ now[5] ^ now[3] ^ now[2] ^ now[1];
98  next[2] = now[14] ^ now[13] ^ now[6] ^ now[5] ^ now[4] ^ now[2] ^ now[1] ^ now[0];
99  next[1] = now[15] ^ now[14] ^ now[13] ^ now[5] ^ now[4] ^ now[1] ^ now[0];
100  next[0] = now[15] ^ now[13] ^ now[4] ^ now[0];
101  end
102 
103 
104 endmodule
15590DATA_BYTE_WIDTH4
Definition: scrambler.v:44
15596nowreg[15:0]
Definition: scrambler.v:55
wire [DATA_BYTE_WIDTH*8 - 1:0] 15594data_in
Definition: scrambler.v:51
wire [DATA_BYTE_WIDTH*8 - 1:0] 15595data_out
Definition: scrambler.v:52
wire 15591clk
Definition: scrambler.v:47
wire 15593val_in
Definition: scrambler.v:50
wire 15592rst
Definition: scrambler.v:48
15597nextreg[31:0]
Definition: scrambler.v:56