/* Example 10: by karttu, Jan 1 2005. Show 11 x 5 x 7 x 6 = 2310 different three- or four-letter words, one with each successive pressing of the rightmost push button. (show the previous word after the user presses the leftmost button). */ module esim10(CLK,PB_IN,SEG_OUT,DIGIT_OUT); input CLK; input [1:0] PB_IN; output [7:0] SEG_OUT; output [3:0] DIGIT_OUT; // segment encoding // 0 // --- // 5 | | 1 // --- <- 6 // 4 | | 2 // --- . <- 7 // 3 parameter [6:0] LET_BLANK = 7'b1111111; parameter [6:0] LET_A = 7'b0001000; parameter [6:0] LET_b = 7'b0000011; parameter [6:0] LET_C = 7'b1000110; parameter [6:0] LET_d = 7'b0100001; parameter [6:0] LET_E = 7'b0000110; parameter [6:0] LET_F = 7'b0001110; parameter [6:0] LET_H = 7'b0001001; parameter [6:0] LET_I = 7'b1111001; parameter [6:0] LET_J = 7'b1100001; parameter [6:0] LET_L = 7'b1000111; parameter [6:0] LET_O = 7'b1000000; parameter [6:0] LET_P = 7'b0001100; parameter [6:0] LET_S = 7'b0010010; parameter [6:0] LET_U = 7'b1000001; parameter [6:0] LET_Y = 7'b0010001; // Four letter-masks: reg [6:0] LETTER[3:0]; // = (LET_S, LET_E, LET_I, LET_S); // Four one-hot shift-registers: reg [10:0] shr1 = 1; reg [4:0] shr2 = 1; reg [6:0] shr3 = 1; reg [5:0] shr4 = 1; // 11 x 5 x 7 x 6 = 55 x 42 = 2310. integer i; wire PB_INC; // State of the debounced push button for incrementing. reg pb_inc_prev = 0; // is saved here also. wire PB_DEC; // State of the debounced push button for decrementing. reg pb_dec_prev = 0; // is saved here also. debounced_button DBB0(CLK,PB_IN[0],PB_INC); debounced_button DBB1(CLK,PB_IN[1],PB_DEC); show4let LETDISPLAY(CLK,LETTER[0],LETTER[1],LETTER[2],LETTER[3],SEG_OUT,DIGIT_OUT); always @(posedge CLK) begin // Update the letter-masks depending on the state of // shift-registers: LETTER[3] <= (shr1[0] ? LET_BLANK : shr1[1] ? LET_P : shr1[2] ? LET_F : shr1[3] ? LET_J : shr1[4] ? LET_H : shr1[5] ? LET_S : shr1[6] ? LET_L : shr1[7] ? LET_A : shr1[8] ? LET_E : shr1[9] ? LET_O : LET_U); LETTER[2] <= (shr2[0] ? LET_A : shr2[1] ? LET_E : shr2[2] ? LET_I : shr2[3] ? LET_O : LET_U); LETTER[1] <= (shr3[0] ? LET_L : shr3[1] ? LET_P : shr3[2] ? LET_F : shr3[3] ? LET_J : shr3[4] ? LET_H : shr3[5] ? LET_S : LET_C); LETTER[0] <= (shr4[0] ? LET_A : shr4[1] ? LET_E : shr4[2] ? LET_I : shr4[3] ? LET_O : shr4[4] ? LET_U : LET_Y); pb_inc_prev <= PB_INC; pb_dec_prev <= PB_DEC; if(PB_INC && ~pb_inc_prev) begin // Increment. // I.e. rotate the shift registers for the next round: for(i=1; i<= 10; i=i+1) begin shr1[i] <= shr1[i-1]; end shr1[0] <= shr1[10]; for(i=1; i<= 4; i=i+1) begin shr2[i] <= shr2[i-1]; end shr2[0] <= shr2[4]; for(i=1; i<= 6; i=i+1) begin shr3[i] <= shr3[i-1]; end shr3[0] <= shr3[6]; for(i=1; i<= 5; i=i+1) begin shr4[i] <= shr4[i-1]; end shr4[0] <= shr4[5]; end if(PB_DEC && ~pb_dec_prev) begin // Decrement. // I.e. rotate the shift registers for the next round: for(i=0; i< 10; i=i+1) begin shr1[i] <= shr1[i+1]; end shr1[10] <= shr1[0]; for(i=0; i< 4; i=i+1) begin shr2[i] <= shr2[i+1]; end shr2[4] <= shr2[0]; for(i=0; i< 6; i=i+1) begin shr3[i] <= shr3[i+1]; end shr3[6] <= shr3[0]; for(i=0; i< 5; i=i+1) begin shr4[i] <= shr4[i+1]; end shr4[5] <= shr4[0]; end end endmodule