module LM_search
(
CLOCK_27,// 27 MHz
KEY, // Pushbutton[3:0]
SW, // Toggle Switch[17:0]
HEX0, // Seven Segment Digit 0
HEX1, // Seven Segment Digit 1
HEX2, // Seven Segment Digit 2
HEX3, // Seven Segment Digit 3
HEX4, // Seven Segment Digit 4
HEX5, // Seven Segment Digit 5
HEX6, // Seven Segment Digit 6
HEX7, // Seven Segment Digit 7
//////////////////// LCD Module 16X2 ////////////////
LCD_ON, // LCD Power ON/OFF
LCD_BLON,// LCD Back Light ON/OFF
LCD_RW, // LCD Read/Write Select, 0 = Write, 1 = Read
LCD_EN, // LCD Enable
LCD_RS, // LCD Command/Data Select, 0 = Command, 1 = Data
LCD_DATA,// LCD Data bus 8 bits
//////////////////// USB JTAG link ////////////////////
TDI, // CPLD -> FPGA (data in)
TCK, // CPLD -> FPGA (clk)
TCS, // CPLD -> FPGA (CS)
TDO, // FPGA -> CPLD (data out)
TD_RESET// TV Decoder Reset
);
input CLOCK_27; // 27 MHz
input [3:0] KEY; // Pushbutton[3:0]
input [17:0] SW; // Toggle Switch[17:0]
output [6:0] HEX0; // Seven Segment Digit 0
output [6:0] HEX1; // Seven Segment Digit 1
output [6:0] HEX2; // Seven Segment Digit 2
output [6:0] HEX3; // Seven Segment Digit 3
output [6:0] HEX4; // Seven Segment Digit 4
output [6:0] HEX5; // Seven Segment Digit 5
output [6:0] HEX6; // Seven Segment Digit 6
output [6:0] HEX7; // Seven Segment Digit 7
inout [7:0] LCD_DATA; // LCD Data bus 8 bits
output LCD_ON; // LCD Power ON/OFF
output LCD_BLON; // LCD Back Light ON/OFF
output LCD_RW; // LCD Read/Write Select, 0 = Write, 1 = Read
output LCD_EN; // LCD Enable
output LCD_RS; // LCD Command/Data Select, 0 = Command, 1 = Data
input TDI; // CPLD -> FPGA (data in)
input TCK; // CPLD -> FPGA (clk)
input TCS; // CPLD -> FPGA (CS)
output TDO; // FPGA -> CPLD (data out)
output TD_RESET; // TV Decoder Reset
// Turn off all HEX
assign HEX0 = 7'hFF;
assign HEX1 = 7'hFF;
assign HEX2 = 7'hFF;
assign HEX3 = 7'hFF;
assign HEX4 = 7'hFF;
assign HEX5 = 7'hFF;
assign HEX6 = 7'hFF;
assign HEX7 = 7'hFF;
// Turn on LCD
assign LCD_ON = 1'b1;
assign LCD_BLON = 1'b1;
//Activate the 27MHz oscillator
assign TD_RESET = 1'b1;
wire [63:0] hash; //hash to look for
wire [55:0] plain_txt; //the decoded key!!!
wire [63:0] key[39:0]; // wires distributing the generated keys
wire [63:0] data; //constant data for DES: KGS!@#$%
wire [39:0] match; //individual match signals from each DES unit
wire [39:0] done; //done signal from each DES unit
wire sys_clk,sys_rst; //clk & rst for DES
wire signal_done;
wire signal_next; //start next calculation
wire signal_match; //indicate that key has been FOUND
assign signal_done = &done; // AND all the bits of done
assign signal_match = | match;
assign data = {8'h4B,8'h47,8'h53,8'h21, // KGS!@#$%
8'h40,8'h23,8'h24,8'h25};
assign sys_clk=CLOCK_27;
//Main Controller & LCD Driver
controller u1(CLOCK_27,~(SW[17]& ~KEY[0]),LCD_DATA,LCD_RW,LCD_EN,LCD_RS,
KEY[3:0],SW[0],hash,plain_txt,signal_match,sys_rst);
//SW[17] & ~KEY[0] is LCD reset
//Key Generator
key_gen40 key_gen40(sys_clk,sys_rst,signal_done,signal_next,
match,
plain_txt,
key[0],key[1],key[2],key[3],key[4],key[5],key[6],key[7],key[8],key[9],
key[10],key[11],key[12],key[13],key[14],key[15],key[16],key[17],key[18],key[19],
key[20],key[21],key[22],key[23],key[24],key[25],key[26],key[27],key[28],key[29],
key[30],key[31],key[32],key[33],key[34],key[35],key[36],key[37],key[38],key[39]);
//DES--40 Instances
DES crypto0(key[0],data,sys_clk,sys_rst,hash,match[0],done[0],signal_next);
DES crypto1(key[1],data,sys_clk,sys_rst,hash,match[1],done[1],signal_next);
DES crypto2(key[2],data,sys_clk,sys_rst,hash,match[2],done[2],signal_next);
DES crypto3(key[3],data,sys_clk,sys_rst,hash,match[3],done[3],signal_next);
DES crypto4(key[4],data,sys_clk,sys_rst,hash,match[4],done[4],signal_next);
DES crypto5(key[5],data,sys_clk,sys_rst,hash,match[5],done[5],signal_next);
DES crypto6(key[6],data,sys_clk,sys_rst,hash,match[6],done[6],signal_next);
DES crypto7(key[7],data,sys_clk,sys_rst,hash,match[7],done[7],signal_next);
DES crypto8(key[8],data,sys_clk,sys_rst,hash,match[8],done[8],signal_next);
DES crypto9(key[9],data,sys_clk,sys_rst,hash,match[9],done[9],signal_next);
DES crypto10(key[10],data,sys_clk,sys_rst,hash,match[10],done[10],signal_next);
DES crypto11(key[11],data,sys_clk,sys_rst,hash,match[11],done[11],signal_next);
DES crypto12(key[12],data,sys_clk,sys_rst,hash,match[12],done[12],signal_next);
DES crypto13(key[13],data,sys_clk,sys_rst,hash,match[13],done[13],signal_next);
DES crypto14(key[14],data,sys_clk,sys_rst,hash,match[14],done[14],signal_next);
DES crypto15(key[15],data,sys_clk,sys_rst,hash,match[15],done[15],signal_next);
DES crypto16(key[16],data,sys_clk,sys_rst,hash,match[16],done[16],signal_next);
DES crypto17(key[17],data,sys_clk,sys_rst,hash,match[17],done[17],signal_next);
DES crypto18(key[18],data,sys_clk,sys_rst,hash,match[18],done[18],signal_next);
DES crypto19(key[19],data,sys_clk,sys_rst,hash,match[19],done[19],signal_next);
DES crypto20(key[20],data,sys_clk,sys_rst,hash,match[20],done[20],signal_next);
DES crypto21(key[21],data,sys_clk,sys_rst,hash,match[21],done[21],signal_next);
DES crypto22(key[22],data,sys_clk,sys_rst,hash,match[22],done[22],signal_next);
DES crypto23(key[23],data,sys_clk,sys_rst,hash,match[23],done[23],signal_next);
DES crypto24(key[24],data,sys_clk,sys_rst,hash,match[24],done[24],signal_next);
DES crypto25(key[25],data,sys_clk,sys_rst,hash,match[25],done[25],signal_next);
DES crypto26(key[26],data,sys_clk,sys_rst,hash,match[26],done[26],signal_next);
DES crypto27(key[27],data,sys_clk,sys_rst,hash,match[27],done[27],signal_next);
DES crypto28(key[28],data,sys_clk,sys_rst,hash,match[28],done[28],signal_next);
DES crypto29(key[29],data,sys_clk,sys_rst,hash,match[29],done[29],signal_next);
DES crypto30(key[30],data,sys_clk,sys_rst,hash,match[30],done[30],signal_next);
DES crypto31(key[31],data,sys_clk,sys_rst,hash,match[31],done[31],signal_next);
DES crypto32(key[32],data,sys_clk,sys_rst,hash,match[32],done[32],signal_next);
DES crypto33(key[33],data,sys_clk,sys_rst,hash,match[33],done[33],signal_next);
DES crypto34(key[34],data,sys_clk,sys_rst,hash,match[34],done[34],signal_next);
DES crypto35(key[35],data,sys_clk,sys_rst,hash,match[35],done[35],signal_next);
DES crypto36(key[36],data,sys_clk,sys_rst,hash,match[36],done[36],signal_next);
DES crypto37(key[37],data,sys_clk,sys_rst,hash,match[37],done[37],signal_next);
DES crypto38(key[38],data,sys_clk,sys_rst,hash,match[38],done[38],signal_next);
DES crypto39(key[39],data,sys_clk,sys_rst,hash,match[39],done[39],signal_next);
endmodule