[Feature] show scan code on 7-segment
This commit is contained in:
parent
bd88e52694
commit
36686d8f1a
@ -19,8 +19,8 @@ set_property PACKAGE_PIN V5 [get_ports {display[5]}]
|
|||||||
set_property PACKAGE_PIN U7 [get_ports {display[6]}]
|
set_property PACKAGE_PIN U7 [get_ports {display[6]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {display[6]}]
|
set_property IOSTANDARD LVCMOS33 [get_ports {display[6]}]
|
||||||
|
|
||||||
#set_property PACKAGE_PIN V7 [get_ports dp]
|
# set_property PACKAGE_PIN V7 [get_ports dp]
|
||||||
#set_property IOSTANDARD LVCMOS33 [get_ports dp]
|
# set_property IOSTANDARD LVCMOS33 [get_ports dp]
|
||||||
|
|
||||||
set_property PACKAGE_PIN U2 [get_ports {digit[0]}]
|
set_property PACKAGE_PIN U2 [get_ports {digit[0]}]
|
||||||
set_property IOSTANDARD LVCMOS33 [get_ports {digit[0]}]
|
set_property IOSTANDARD LVCMOS33 [get_ports {digit[0]}]
|
||||||
|
@ -5,49 +5,27 @@ module SampleDisplay(
|
|||||||
inout wire PS2_CLK,
|
inout wire PS2_CLK,
|
||||||
input wire rst,
|
input wire rst,
|
||||||
input wire clk
|
input wire clk
|
||||||
);
|
);
|
||||||
|
wire reset;
|
||||||
|
|
||||||
parameter [8:0] LEFT_SHIFT_CODES = 9'b0_0001_0010;
|
reg [7:0] scan_code, nxt_scan_code;
|
||||||
parameter [8:0] RIGHT_SHIFT_CODES = 9'b0_0101_1001;
|
|
||||||
parameter [8:0] KEY_CODES_00 = 9'b0_0100_0101; // 0 => 45
|
|
||||||
parameter [8:0] KEY_CODES_01 = 9'b0_0001_0110; // 1 => 16
|
|
||||||
parameter [8:0] KEY_CODES_02 = 9'b0_0001_1110; // 2 => 1E
|
|
||||||
parameter [8:0] KEY_CODES_03 = 9'b0_0010_0110; // 3 => 26
|
|
||||||
parameter [8:0] KEY_CODES_04 = 9'b0_0010_0101; // 4 => 25
|
|
||||||
parameter [8:0] KEY_CODES_05 = 9'b0_0010_1110; // 5 => 2E
|
|
||||||
parameter [8:0] KEY_CODES_06 = 9'b0_0011_0110; // 6 => 36
|
|
||||||
parameter [8:0] KEY_CODES_07 = 9'b0_0011_1101; // 7 => 3D
|
|
||||||
parameter [8:0] KEY_CODES_08 = 9'b0_0011_1110; // 8 => 3E
|
|
||||||
parameter [8:0] KEY_CODES_09 = 9'b0_0100_0110; // 9 => 46
|
|
||||||
|
|
||||||
parameter [8:0] KEY_CODES_10 = 9'b0_0111_0000; // right_0 => 70
|
|
||||||
parameter [8:0] KEY_CODES_11 = 9'b0_0110_1001; // right_1 => 69
|
|
||||||
parameter [8:0] KEY_CODES_12 = 9'b0_0111_0010; // right_2 => 72
|
|
||||||
parameter [8:0] KEY_CODES_13 = 9'b0_0111_1010; // right_3 => 7A
|
|
||||||
parameter [8:0] KEY_CODES_14 = 9'b0_0110_1011; // right_4 => 6B
|
|
||||||
parameter [8:0] KEY_CODES_15 = 9'b0_0111_0011; // right_5 => 73
|
|
||||||
parameter [8:0] KEY_CODES_16 = 9'b0_0111_0100; // right_6 => 74
|
|
||||||
parameter [8:0] KEY_CODES_17 = 9'b0_0110_1100; // right_7 => 6C
|
|
||||||
parameter [8:0] KEY_CODES_18 = 9'b0_0111_0101; // right_8 => 75
|
|
||||||
parameter [8:0] KEY_CODES_19 = 9'b0_0111_1101; // right_9 => 7D
|
|
||||||
|
|
||||||
reg [15:0] nums, next_nums;
|
|
||||||
reg [3:0] key_num;
|
|
||||||
reg [9:0] last_key;
|
|
||||||
|
|
||||||
wire shift_down;
|
|
||||||
wire [511:0] key_down;
|
wire [511:0] key_down;
|
||||||
wire [8:0] last_change;
|
wire [8:0] last_change;
|
||||||
wire been_ready;
|
wire been_ready;
|
||||||
|
|
||||||
assign shift_down = (key_down[LEFT_SHIFT_CODES] == 1'b1 || key_down[RIGHT_SHIFT_CODES] == 1'b1) ? 1'b1 : 1'b0;
|
OnePulse one_pulse(
|
||||||
|
.signal_single_pulse(reset),
|
||||||
|
.signal(rst),
|
||||||
|
.clock(clk)
|
||||||
|
);
|
||||||
|
|
||||||
SevenSegment seven_seg (
|
SegmentController controller (
|
||||||
.display(display),
|
.clk(clk),
|
||||||
.digit(digit),
|
.rst_n(!reset),
|
||||||
.nums(nums),
|
.signal({(last_change[8] ? 8'hE0 : 8'd0), scan_code}),
|
||||||
.rst(rst),
|
.seg(display),
|
||||||
.clk(clk)
|
.seg_an(digit)
|
||||||
);
|
);
|
||||||
|
|
||||||
KeyboardDecoder key_de (
|
KeyboardDecoder key_de (
|
||||||
@ -56,54 +34,21 @@ module SampleDisplay(
|
|||||||
.key_valid(been_ready),
|
.key_valid(been_ready),
|
||||||
.PS2_DATA(PS2_DATA),
|
.PS2_DATA(PS2_DATA),
|
||||||
.PS2_CLK(PS2_CLK),
|
.PS2_CLK(PS2_CLK),
|
||||||
.rst(rst),
|
.rst(reset),
|
||||||
.clk(clk)
|
.clk(clk)
|
||||||
);
|
);
|
||||||
|
|
||||||
always @ (posedge clk, posedge rst) begin
|
always @ (posedge clk, posedge reset) begin
|
||||||
if (rst) begin
|
if (reset) begin
|
||||||
nums <= 16'b0;
|
scan_code <= 16'd0;
|
||||||
end else begin
|
end else begin
|
||||||
nums <= next_nums;
|
scan_code <= nxt_scan_code;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
always @ (*) begin
|
|
||||||
next_nums = nums;
|
|
||||||
if (been_ready && key_down[last_change] == 1'b1) begin
|
|
||||||
if (key_num != 4'b1111) begin
|
|
||||||
if (shift_down == 1'b1) begin
|
|
||||||
next_nums = {key_num, nums[15:4]};
|
|
||||||
end else begin
|
|
||||||
next_nums = {nums[11:0], key_num};
|
|
||||||
end
|
|
||||||
end else next_nums = next_nums;
|
|
||||||
end else next_nums = next_nums;
|
|
||||||
end
|
|
||||||
|
|
||||||
always @ (*) begin
|
always @ (*) begin
|
||||||
case (last_change)
|
if (been_ready && key_down[last_change] == 1'b1) nxt_scan_code = last_change[7:0];
|
||||||
KEY_CODES_00 : key_num = 4'b0000;
|
else nxt_scan_code = scan_code;
|
||||||
KEY_CODES_01 : key_num = 4'b0001;
|
|
||||||
KEY_CODES_02 : key_num = 4'b0010;
|
|
||||||
KEY_CODES_03 : key_num = 4'b0011;
|
|
||||||
KEY_CODES_04 : key_num = 4'b0100;
|
|
||||||
KEY_CODES_05 : key_num = 4'b0101;
|
|
||||||
KEY_CODES_06 : key_num = 4'b0110;
|
|
||||||
KEY_CODES_07 : key_num = 4'b0111;
|
|
||||||
KEY_CODES_08 : key_num = 4'b1000;
|
|
||||||
KEY_CODES_09 : key_num = 4'b1001;
|
|
||||||
KEY_CODES_10 : key_num = 4'b0000;
|
|
||||||
KEY_CODES_11 : key_num = 4'b0001;
|
|
||||||
KEY_CODES_12 : key_num = 4'b0010;
|
|
||||||
KEY_CODES_13 : key_num = 4'b0011;
|
|
||||||
KEY_CODES_14 : key_num = 4'b0100;
|
|
||||||
KEY_CODES_15 : key_num = 4'b0101;
|
|
||||||
KEY_CODES_16 : key_num = 4'b0110;
|
|
||||||
KEY_CODES_17 : key_num = 4'b0111;
|
|
||||||
KEY_CODES_18 : key_num = 4'b1000;
|
|
||||||
KEY_CODES_19 : key_num = 4'b1001;
|
|
||||||
default : key_num = 4'b1111;
|
|
||||||
endcase
|
|
||||||
end
|
end
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -1,69 +1,81 @@
|
|||||||
module SevenSegment(
|
module ClockDivider #(
|
||||||
output reg [6:0] display,
|
parameter N = 20
|
||||||
output reg [3:0] digit,
|
) (
|
||||||
input wire [15:0] nums,
|
input clk,
|
||||||
input wire rst,
|
input rst_n,
|
||||||
input wire clk
|
output reg dclk
|
||||||
);
|
);
|
||||||
|
reg [N-1:0] dff;
|
||||||
reg [15:0] clk_divider;
|
always @(posedge clk) begin
|
||||||
reg [3:0] display_num;
|
if (!rst_n) begin
|
||||||
|
dff <= {N{1'b0}};
|
||||||
always @ (posedge clk, posedge rst) begin
|
|
||||||
if (rst) begin
|
|
||||||
clk_divider <= 16'b0;
|
|
||||||
end else begin
|
end else begin
|
||||||
clk_divider <= clk_divider + 16'b1;
|
dff <= dff + 1'b1;
|
||||||
|
dclk <= &dff;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module SegmentController (
|
||||||
|
input clk,
|
||||||
|
input rst_n,
|
||||||
|
input [15:0] signal,
|
||||||
|
output [6:0] seg,
|
||||||
|
output [3:0] seg_an
|
||||||
|
);
|
||||||
|
wire dclk;
|
||||||
|
wire [3:0] seg_en;
|
||||||
|
|
||||||
|
reg [1:0] cnt;
|
||||||
|
|
||||||
|
reg [6:0] seg_inv;
|
||||||
|
reg [3:0] digit;
|
||||||
|
|
||||||
|
ClockDivider #(.N(16)) display(clk, rst_n, dclk);
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if (!rst_n) begin
|
||||||
|
cnt <= 4'd0;
|
||||||
|
end else if (dclk) begin
|
||||||
|
cnt <= cnt + 1'b1;
|
||||||
|
end else begin
|
||||||
|
cnt <= cnt;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
always @ (posedge clk, posedge rst) begin
|
always @(*) begin
|
||||||
if (rst) begin
|
case (cnt)
|
||||||
display_num <= 4'b0000;
|
2'd0: digit = signal[3:0];
|
||||||
digit <= 4'b1111;
|
2'd1: digit = signal[7:4];
|
||||||
end else if (clk_divider == {16{1'b1}}) begin
|
2'd2: digit = signal[11:8];
|
||||||
case (digit)
|
2'd3: digit = signal[15:12];
|
||||||
4'b1110 : begin
|
default: digit = 4'd0;
|
||||||
display_num <= nums[7:4];
|
|
||||||
digit <= 4'b1101;
|
|
||||||
end
|
|
||||||
4'b1101 : begin
|
|
||||||
display_num <= nums[11:8];
|
|
||||||
digit <= 4'b1011;
|
|
||||||
end
|
|
||||||
4'b1011 : begin
|
|
||||||
display_num <= nums[15:12];
|
|
||||||
digit <= 4'b0111;
|
|
||||||
end
|
|
||||||
4'b0111 : begin
|
|
||||||
display_num <= nums[3:0];
|
|
||||||
digit <= 4'b1110;
|
|
||||||
end
|
|
||||||
default : begin
|
|
||||||
display_num <= nums[3:0];
|
|
||||||
digit <= 4'b1110;
|
|
||||||
end
|
|
||||||
endcase
|
|
||||||
end else begin
|
|
||||||
display_num <= display_num;
|
|
||||||
digit <= digit;
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
always @ (*) begin
|
|
||||||
case (display_num)
|
|
||||||
0 : display = 7'b1000000; //0000
|
|
||||||
1 : display = 7'b1111001; //0001
|
|
||||||
2 : display = 7'b0100100; //0010
|
|
||||||
3 : display = 7'b0110000; //0011
|
|
||||||
4 : display = 7'b0011001; //0100
|
|
||||||
5 : display = 7'b0010010; //0101
|
|
||||||
6 : display = 7'b0000010; //0110
|
|
||||||
7 : display = 7'b1111000; //0111
|
|
||||||
8 : display = 7'b0000000; //1000
|
|
||||||
9 : display = 7'b0010000; //1001
|
|
||||||
default : display = 7'b1111111;
|
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
|
|
||||||
|
always @(*) begin
|
||||||
|
case (digit)
|
||||||
|
4'h0: seg_inv = 7'b0111111;
|
||||||
|
4'h1: seg_inv = 7'b0000110;
|
||||||
|
4'h2: seg_inv = 7'b1011011;
|
||||||
|
4'h3: seg_inv = 7'b1001111;
|
||||||
|
4'h4: seg_inv = 7'b1100110;
|
||||||
|
4'h5: seg_inv = 7'b1101101;
|
||||||
|
4'h6: seg_inv = 7'b1111101;
|
||||||
|
4'h7: seg_inv = 7'b0000111;
|
||||||
|
4'h8: seg_inv = 7'b1111111;
|
||||||
|
4'h9: seg_inv = 7'b1101111;
|
||||||
|
4'ha: seg_inv = 7'b1110111;
|
||||||
|
4'hb: seg_inv = 7'b1111100;
|
||||||
|
4'hc: seg_inv = 7'b0111001;
|
||||||
|
4'hd: seg_inv = 7'b1011110;
|
||||||
|
4'he: seg_inv = 7'b1111001;
|
||||||
|
4'hf: seg_inv = 7'b1110001;
|
||||||
|
default: seg_inv = 7'b0000000;
|
||||||
|
endcase
|
||||||
|
end
|
||||||
|
|
||||||
|
assign seg = ~seg_inv;
|
||||||
|
assign seg_en = {(signal[15:8] == 8'hE0 ? 2'b11 : 2'b00), 2'b11};
|
||||||
|
assign seg_an = ~(seg_en & (4'b1 << cnt));
|
||||||
endmodule
|
endmodule
|
||||||
|
Loading…
x
Reference in New Issue
Block a user