220 likes | 436 Views
실험 목표. 키패드로 0~9 중 두개의 숫자를 연속으로 입력받음 . 첫번째 입력을 10 의 자리 , 두번째 입력을 1 의 자리로 인식 , 두개의 7- 세그먼트에 십진수로 표시. 실험 조건. 0-9 까지의 한자리 수 표현은 십의 자리에 0 을 포함하여 표현한다 . 예 > 키패드로 09 를 입력하고 7- 세그먼트도 09 로 출력한다 . 현재 입력이 혼동되지 않게 첫번째 입력시 모든 7- 세그먼트를 OFF, 두번째 입력까지 모두 완료 되면 7- 세그먼트에 결과 표시.
E N D
실험 목표 • 키패드로0~9중 두개의 숫자를 연속으로 입력받음. • 첫번째 입력을 10의 자리, 두번째 입력을 1의 자리로 인식, • 두개의7-세그먼트에 십진수로 표시. 실험 조건 • 0-9까지의 한자리 수 표현은 십의 자리에 0을 포함하여 표현한다. • 예> 키패드로09를 입력하고 7-세그먼트도 09로 출력한다. • 현재 입력이 혼동되지 않게 첫번째입력시 모든 7-세그먼트를 OFF, • 두번째 입력까지 모두 완료 되면 7-세그먼트에 결과 표시.
전체 회로 구성도 clk scan Counter 1 4 4 7 7 7 6 5 4 3 2 1 0 com com Keypad 3 2 1 0 data 7-Segment MUX 6 5 4 3 2 1 0 seg Counter 2 3 4 Keypad memory 7-Segment Keypad memory 7-Segment
Counter1 - 1이 입력되는 동안 1, 2, 4 카운트 clk scan Counter 1 4 4 7 7 7 6 5 4 3 2 1 0 com com Keypad 3 2 1 0 data 7-Segment MUX 6 5 4 3 2 1 0 seg Counter 2 3 4 Keypad memory 7-Segment Keypad memory 7-Segment
Counter1 - 1이 입력되는 동안 1, 2, 4 카운트 키패드는scan 입력이 1인 줄의 각 키 상태를 data값으로 출력. 즉, 키 입력 처리를 위해 매번 scan값에 001, 010, 100을 출력하여 해당 라인의 data값 상태 확인 필요. ← data module counter(x, clk, z); input x, clk; output [2:0] z; wire a, b; d_ffda(a, clk, z[2]), db(b, clk, z[1]); assign a = (z[2] & ~z[1] & ~x) | (~z[2] & z[1] & x); assign b = (~z[2] & z[1] & ~x) | (~z[2] & ~z[1] & x); assign z[0] = ~z[2] & ~z[1]; endmodule ↑ scan z[2] z[1] z[0] 추가로, 키 입력이 감지되었을 때, 해당 값을 처리하기 위해 scan값을 고정해줄 필요가 있음. 따라서 키패드에 입력이 발생(x=0)하면 카운트를 멈추는(scan값 고정) 카운터 회로 작성.
Counter1 - 1이 입력되는 동안 1, 2, 4 카운트 0 0 Status Graph Transition Table S3 001 S1 010 S2 100 S0 001 1 1 0 1 1 A+ = AB’X’ + A’BX B+ = A’BX’ + A’B’X Z2 = A+ Z1 = B+ Z0 = Z2’ Z1’ S3 0
Counter1 - 1이 입력되는 동안 1, 2, 4 카운트 Circuit Design z x clk
Keypad – 키패드 입력에 따른 BCD코드 출력 clk scan Counter 1 4 4 7 7 7 6 5 4 3 2 1 0 com com Keypad 3 2 1 0 data 7-Segment MUX 6 5 4 3 2 1 0 seg Counter 2 3 4 Keypad memory 7-Segment Keypad memory 7-Segment
Keypad – 키패드 입력에 따른 BCD코드 출력 scan conv key 키패드에서입력받은data값은 당시의 scan값에 대한 결과. 따라서 키의 확인을 위해서는 Counter1에서 출력한 scan값과 회로에 입력받은data값을 조합하여 결과 출력. 버튼에 따른 scan-data값은 좌측의 표와 같음. Keypad모듈은 scan-data값에 대한 키패드 값을 BCD코드로 변환하여 출력. data module keypad(scan, data, key); input [2:0] scan; input [3:0] data; output [3:0] key; wire [6:0] sd; function [3:0] conv; input [6:0] SD; case(SD) 7'b010_0001: conv = 4'b0000; // 0 7'b100_1000: conv = 4'b0001; // 1 7'b010_1000: conv = 4'b0010; // 2 7'b001_1000: conv = 4'b0011; // 3 7'b100_0100: conv = 4'b0100; // 4 7'b010_0100: conv = 4'b0101; // 5 7'b001_0100: conv = 4'b0110; // 6 7'b100_0010: conv = 4'b0111; // 7 7'b010_0010: conv = 4'b1000; // 8 7'b001_0010: conv = 4'b1001; // 9 7'b100_0001: conv = 4'b1010; // * 7'b001_0001: conv = 4'b1011; // # default: conv = 4'b0000; endcase endfunction assign sd[6:4] = scan; assign sd[3:0] = data; assign key = conv(sd); endmodule
Counter2 – 10 입력시퀀스로 0~1 카운트 clk scan Counter 1 4 4 7 7 7 6 5 4 3 2 1 0 com com Keypad 3 2 1 0 data 7-Segment MUX 6 5 4 3 2 1 0 seg Counter 2 3 4 Keypad memory 7-Segment Keypad memory 7-Segment
Counter2 – 10 입력시퀀스로 0~1 카운트 키패드 입력에 대한 BCD코드 값을 저장 할 메모리를 선택하기 위해, 0~1을 카운트(선택) 해줄 회로가 필요. ※ 카운트 조건 1. 버튼이 눌려짐 = 1 버튼이 눌려져있지 않음 = 0 2. 입력받는 행위 = 버튼이 눌렸다 떼어졌을 때 ☞ 10이 입력시퀀스로 들어왔을 때 module counter2(x, clk, cnt); input clk, x; output cnt; wire a_in, b_in, a, b; d_ffda(a_in, clk, a), db(b_in, clk, b); assign a_in = (a & x) | (a & ~b) | (~a & b & ~x); assign b_in = x; assign cnt = a; endmodule
Counter2 – 10 입력시퀀스로 0~1 카운트 Status Graph Transition Table 0/0 1/0 S0 1/0 S1 0/0 0/1 A+ = AX + AB’ + A’BX’ B+ = X Z = A+ S3 S2 1/1 1/1 0/1
Counter2 – 10 입력시퀀스로 0~1 카운트 Circuit Design z x clk
Keypad memory – 키패드 입력 저장, 저장되어있는 값 출력 clk scan Counter 1 4 4 7 7 7 6 5 4 3 2 1 0 com com Keypad 3 2 1 0 data 7-Segment MUX 6 5 4 3 2 1 0 seg Counter 2 3 4 Keypad memory 7-Segment Keypad memory 7-Segment
D D D D Q Q Q Q Keypad memory – 키패드 입력 저장, 저장되어있는 값 출력 CLK CLK CLK CLK 0 0 0 0 1 1 1 1 D 플립플롭에 의해 키패드에서입력받은 값을 저장하고, 저장 한 값을 출력. 키패드 입력이 없어도 회로는 작동하기 때문에 입력이 있을 때에만 해당 값을 저장하도록 구분해주기 위해 2-1 MUX 추가. ☞ 키패드 입력이 있을 때엔 키패드입력값, 키패드 입력이 없을 때엔 이전에 저장된 값을 플립플롭에 저장하고 출력한다. module keypad_memory(key_in, load, clk, key_out); input [3:0] key_in; input load, clk; output [3:0] key_out; wire [3:0] key; mux_2 setmux3(key_in[3], key_out[3], load, key[3]), setmux2(key_in[2], key_out[2], load, key[2]), setmux1(key_in[1], key_out[1], load, key[1]), setmux0(key_in[0], key_out[0], load, key[0]); d_ff mem3(key[3], clk, key_out[3]), mem2(key[2], clk, key_out[2]), mem1(key[1], clk, key_out[1]), mem0(key[0], clk, key_out[0]); endmodule
D D D D Q Q Q Q Keypad memory – 키패드 입력 저장, 저장되어있는 값 출력 CLK CLK CLK CLK 0 0 0 0 1 1 1 1 Key_in[3] Key_in[2] Key_in[1] Key_in[0] Circuit Design load clk Key_out[3] Key_out[2] Key_out[1] Key_out[0]
7-Segment – BCD코드로 7-세그먼트 세팅 clk scan Counter 1 4 4 7 7 7 6 5 4 3 2 1 0 com com Keypad 3 2 1 0 data 7-Segment MUX 6 5 4 3 2 1 0 seg Counter 2 3 4 Keypad memory 7-Segment Keypad memory 7-Segment
7-Segment – BCD코드로 7-세그먼트 세팅 7-Segment 이전 실험에서 만들었던 7-세그먼트 회로의 출력값만 일부 변경 module sevensegment(a_in, seg); input [3:0] a_in; output [6:0] seg; function [6:0] func_seg; input [3:0] in; case(in) 4'h0: func_seg = 7'b011_1111; 4'h1: func_seg = 7'b000_0110; 4'h2: func_seg = 7'b101_1011; 4'h3: func_seg = 7'b100_1111; 4'h4: func_seg = 7'b110_0110; 4'h5: func_seg = 7'b110_1101; 4'h6: func_seg = 7'b111_1101; 4'h7: func_seg = 7'b000_0111; 4'h8: func_seg = 7'b111_1111; 4'h9: func_seg = 7'b110_1111; 4'ha: func_seg = 7'b111_0111; 4'hb: func_seg = 7'b111_1100; endcase endfunction assign seg = func_seg(a_in); endmodule
7-Segment MUX – 출력 할 7-세그먼트값 결정 clk scan Counter 1 4 4 7 7 7 6 5 4 3 2 1 0 com com Keypad 3 2 1 0 data 7-Segment MUX 6 5 4 3 2 1 0 seg Counter 2 3 4 Keypad memory 7-Segment Keypad memory 7-Segment
7-Segment MUX – 출력 할 7-세그먼트값 결정 두개의7-세그먼트 모듈에서 나온 세팅값 중 한 쪽의 값을 선택하기 위해 각 자리의 값마다 MUX 추가. seg mux_2 muxss0(seg0[0], seg1[0], clk, seg[0]), muxss1(seg0[1], seg1[1], clk, seg[1]), muxss2(seg0[2], seg1[2], clk, seg[2]), muxss3(seg0[3], seg1[3], clk, seg[3]), muxss4(seg0[4], seg1[4], clk, seg[4]), muxss5(seg0[5], seg1[5], clk, seg[5]), muxss6(seg0[6], seg1[6], clk, seg[6]); clk seg0 seg1
com – COMBO-II에서 표시 할 7-세그먼트 결정 clk scan Counter 1 4 4 7 7 7 6 5 4 3 2 1 0 com com Keypad 3 2 1 0 data 7-Segment MUX 6 5 4 3 2 1 0 seg Counter 2 3 4 Keypad memory 7-Segment Keypad memory 7-Segment
com – COMBO-II에서 표시 할 7-세그먼트 결정 • assign comctr = pressed | memctr; • mux_2 muxcom0(1'b1, comctr, clk, com[6]), • muxcom1(comctr, 1'b1, clk, com[7]); • assign com[5:0] = 6'b11_1111; 출력 조건인 “두번째 입력까지 모두 완료 되면 7-세그먼트에 결과 표시” ☞ 버튼이 눌려져있지 않고 첫번째 입력을 받을차례 = 0 ☞ ~(~pressed & ~memctr) = 0 ☞ pressed | memctr = 1 전체 회로 중 COM의 회로 clk com com data Counter 2 pressed memctr