You are on page 1of 2

module keycode_gen (column, data_out, valid, reset, clk, row);

output [3:0] column, data_out; output valid;


input reset, clk; input [3:0] row;
reg [3:0] column, coltemp, keycode, data_out;
reg temp, valid; reg [1:0] count;
//Column sequence generator. 0111(7) --> 1011(b) --> 1101(d) --> 1110(e)
always @(posedge clk or posedge reset)
begin
if (reset === 1'b1) column <= 4'b1111; //reset=1 --> reset column inpu
t
else begin
if (column == 4'b1110) column <= 4'b0111;
else if (column == 4'b0111 || column == 4'b1011 || column == 4'b
1101)
begin
temp <= column[0];
coltemp <= column >> 1;
column[3] <= {temp,coltemp[2:0]};
end
else column <= 4'b0111; //default --> column starts with
4'd7
end
end
//Generate code for key pressed based on row and column
always @(row, reset)
begin
if (reset) keycode = 4'b0000;
else begin
case ({column,row})
//assert column 1 & read row
8'b01110111 : keycode = 4'b0000; //row0 --> key0 pressed
8'b01111011 : keycode = 4'b0001; //row1 --> key1 pressed
8'b01111101 : keycode = 4'b0010; //row2 --> key2 pressed
8'b01111110 : keycode = 4'b0011; //row3 --> key3 press
ed
//assert column 2 & read row
8'b10110111 : keycode = 4'b0100; //row0 --> key4 pressed
8'b10111011 : keycode = 4'b0101; //row1 --> key5 pressed
8'b10111101 : keycode = 4'b0110; //row2 --> key6 pressed
8'b10111110 : keycode = 4'b0111; //row3 --> key7 pressed
//assert column 3 & read row
8'b11010111 : keycode = 4'b1000; //row0 --> key8 pressed
8'b11011011 : keycode = 4'b1001; //row1 --> key9 pressed
8'b11011101 : keycode = 4'b1010; //row2 --> keyA pressed
8'b11011110 : keycode = 4'b1011; //row3 --> keyB pressed
//assert column 4 & read row
8'b11100111 : keycode = 4'b1100; //row0 --> keyC pressed
8'b11101011 : keycode = 4'b1101; //row1 --> keyD pressed
8'b11101101 : keycode = 4'b1110; //row2 --> keyE pressed
8'b11101110 : keycode = 4'b1111; //row3 --> keyF pressed
default : keycode = keycode; //arbitrary choice --> keycode
must hold its value
endcase
end
end
//Check key-hold and no-key press conditions
always @(column, reset)
begin
if (reset == 1'b1) data_out = 4'b0000;
else begin
if (row == 4'b1111 && count == 2'b11) //4 column checks give r
ow = 1111 --> no-key press condition --> output generated(data_out)
begin
data_out = keycode; valid = 1'b1; count = 2'b00;

end
else if (row ==4'b1111 && count != 2'b11) //3 column checks g
ive row = 1111 --> key-hold condition --> no output
begin
valid = 1'b0; count = count + 1;
end
else count = 2'b00; //default counter value = 00
end
end
endmodule

You might also like