Это интересно: Шифровальная машина Enigma M3 в FPGA Intel MAX10
Шифровальная машина имела систему роторов, которые по некоторому закону делали многократную замену букв:
Электрический сигнал проходил через один ротор к другому, контакты справа от каждого ротора - исходная буква, а слева - буква после подмены.
На языке Verilog HDL такое действие можно было бы описать, например, вот так:
module ring( input wire [25:0]f_in, output reg [25:0]f_out, input wire [25:0]b_in, output reg [25:0]b_out ); parameter TRANSLATION = "BDFHJLCPRTXVZNYEIWGAKMUSQO"; always @* begin f_out[ ((TRANSLATION>>(25*8) )&8'hFF) - 8'h41 ]= f_in[0 ]; f_out[ ((TRANSLATION>>(24*8) )&8'hFF) - 8'h41 ]= f_in[1 ]; f_out[ ((TRANSLATION>>(23*8) )&8'hFF) - 8'h41 ]= f_in[2 ]; f_out[ ((TRANSLATION>>(22*8) )&8'hFF) - 8'h41 ]= f_in[3 ]; f_out[ ((TRANSLATION>>(21*8) )&8'hFF) - 8'h41 ]= f_in[4 ]; f_out[ ((TRANSLATION>>(20*8) )&8'hFF) - 8'h41 ]= f_in[5 ]; f_out[ ((TRANSLATION>>(19*8) )&8'hFF) - 8'h41 ]= f_in[6 ]; f_out[ ((TRANSLATION>>(18*8) )&8'hFF) - 8'h41 ]= f_in[7 ]; f_out[ ((TRANSLATION>>(17*8) )&8'hFF) - 8'h41 ]= f_in[8 ]; f_out[ ((TRANSLATION>>(16*8) )&8'hFF) - 8'h41 ]= f_in[9 ]; f_out[ ((TRANSLATION>>(15*8) )&8'hFF) - 8'h41 ]= f_in[10]; f_out[ ((TRANSLATION>>(14*8) )&8'hFF) - 8'h41 ]= f_in[11]; f_out[ ((TRANSLATION>>(13*8) )&8'hFF) - 8'h41 ]= f_in[12]; f_out[ ((TRANSLATION>>(12*8) )&8'hFF) - 8'h41 ]= f_in[13]; f_out[ ((TRANSLATION>>(11*8) )&8'hFF) - 8'h41 ]= f_in[14]; f_out[ ((TRANSLATION>>(10*8) )&8'hFF) - 8'h41 ]= f_in[15]; f_out[ ((TRANSLATION>>( 9*8) )&8'hFF) - 8'h41 ]= f_in[16]; f_out[ ((TRANSLATION>>( 8*8) )&8'hFF) - 8'h41 ]= f_in[17]; f_out[ ((TRANSLATION>>( 7*8) )&8'hFF) - 8'h41 ]= f_in[18]; f_out[ ((TRANSLATION>>( 6*8) )&8'hFF) - 8'h41 ]= f_in[19]; f_out[ ((TRANSLATION>>( 5*8) )&8'hFF) - 8'h41 ]= f_in[20]; f_out[ ((TRANSLATION>>( 4*8) )&8'hFF) - 8'h41 ]= f_in[21]; f_out[ ((TRANSLATION>>( 3*8) )&8'hFF) - 8'h41 ]= f_in[22]; f_out[ ((TRANSLATION>>( 2*8) )&8'hFF) - 8'h41 ]= f_in[23]; f_out[ ((TRANSLATION>>( 1*8) )&8'hFF) - 8'h41 ]= f_in[24]; f_out[ ((TRANSLATION>>( 0*8) )&8'hFF) - 8'h41 ]= f_in[25]; end
С каждым нажатием на клавиши роторы поворачивались и выходило, что нажатие одной и той же буквы выдавало каждый раз новый результат.
Более подробно о проекте для FPGA Intel MAX10 платы M02mini можно прочитать здесь.
В той статье даже есть видео демонстрация работы шифровальной машины выполненной на FPGA.