코드 개요
이전 7 Segment 에서 모듈화 시켜서 더욱 자세한 작업 분배가 가능해졌습니다.
RTL 스키메틱
소스코드 - ucf는 전파일과 동일합니다.
다운로드
main.v
control.v
display.v
clock.v
코드 개요
이전 7 Segment 에서 모듈화 시켜서 더욱 자세한 작업 분배가 가능해졌습니다.
RTL 스키메틱
module main(CLK, START, AN, SEG);
input CLK;
input START;
output [3:0] AN;
output [7:0] SEG;
wire [3:0] value_wire; // 나가는 값을 전송해주는 통로
wire cclk_wire; // 클럭을 중계해주는 통로
mCLK clock(.CLK(CLK), .CCLK(cclk_wire)); // .하위모듈(상위모듈)
mStop control( .CLK(cclk_wire), .START(START), .VALUE(value_wire), .AN(AN));
mLed display( .CLK(CLK), .VALUE(value_wire), .SEG(SEG));
endmodule
control.v
module mStop(CLK, START, VALUE, AN);
input CLK; // 줄어든 클럭을 받습니다.
input START; // 시작과 멈추는 신호를 받습니다
output [3:0] AN; // 출력할 자릿수를 보냅니다.
output [3:0] VALUE; // 출력될 값을 받습니다.
reg [3:0] value_buf; // VALUE 으로 나갈 버퍼를 만듭니다.
reg [3:0] an_buf; // AN 으로 나갈 버퍼를 만듭니다.
always@(posedge CLK)
begin
if(START == 1)
begin
value_buf = value_buf + 1;
if(value_buf > 4'b1001)
begin
value_buf = 0;
end
an_buf = 4'b0000;
end
end
assign VALUE = value_buf;
assign AN = an_buf;
endmodule
module mLed(CLK, VALUE, SEG);
input CLK;
input [3:0] VALUE;
output [7:0] SEG; reg [7:0] seg_buf = 0; // 7-Segment 를 보낼 버퍼를 만듭니다.
always@(CLK, VALUE)
begin
case (VALUE)
4'b0000 : seg_buf <= 8'b00111111; // 0
4'b0001 : seg_buf <= 8'b00000110; // 1
4'b0010 : seg_buf <= 8'b01011011; // 2
4'b0011 : seg_buf <= 8'b01001111; // 3
4'b0100 : seg_buf <= 8'b01100110; // 4
4'b0101 : seg_buf <= 8'b01101101; // 5
4'b0110 : seg_buf <= 8'b01111101; // 6
4'b0111 : seg_buf <= 8'b00000111; // 7
4'b1000 : seg_buf <= 8'b01111111; // 8
4'b1001 : seg_buf <= 8'b01101111; // 9
default : seg_buf <= 8'b00111111; // 0
endcase
end
assign SEG = seg_buf;
endmodule
clock.v
module mCLK(CLK, CCLK);
input CLK;
output CCLK;
reg [30:0] cnt;
reg cclk_buf;
always@(posedge CLK)
begin
cnt = cnt + 1;
if (cnt == 2000000)
begin
cnt = 0;
cclk_buf = ~cclk_buf;
end
end
assign CCLK = cclk_buf;
endmodule