VHDL 을 배우다가 Verilog 배우니깐 적응이 안되네요. 처음으로 7 Segment 출력하는 코드를 만들어 봤습니다. xilinx 9.1i 를 썼는데 자원을 너무 차지 하는 바람에 7.1i 로 바꾸었습니다. 한결 가볍습니다. 스펙에 따라 설정이 다르므로 다른 기기에 맞게 파일을 적당히 바꾸지 않는다면 작동이 안 됩니다. 코드 설명은 주석을 보시기 바랍니다;;작동 내용 LED 4개에 0 부터 9까지 숫자를 딱 맞게 출력하는 내용입니다.코드 다운 받기
접습니다(Fold)..
`timescale 1ns / 1ps //////////////////////////////////////////////////////////////////////////////// // Company: Korea Univ // Engineer: JaeWook Lee // // Create Date: 22:13:13 03/24/07 // Design Name: 7-SegTest // Module Name: work // Project Name: // Target Device: // Tool versions: xilinx 7.1.04i // Description: // // Dependencies: Nothing // // Revision: // Revision 0.01 - File Created // Additional Comments: http://cakel.tistory.com // 교육용으로 자유롭게 쓸수 있습니다. //////////////////////////////////////////////////////////////////////////////// module work(CLK, START, AN, SEG); input CLK; input START; output [3:0] AN; output [7:0] SEG;
reg [30:0] cnt = 0; // ?Hz 분주용 reg start_buf = 0; // 입력 스위치의 토글을 위한 버퍼 reg continue = 0; // 토글을 받아서 계속할찌 안할지 결정 reg toggle = 0; // 토글 기존 값저장 reg c100hz = 0; // ?Hz 분주되었을때 나갈 스위치 reg [4:0] value = 0; // 7-Segment 로 받는 값 reg [7:0] seg_buf = 0; // 7-Segment 나갈 값 reg [3:0] an_buf = 0; // 4개의 LED 주소값
always@(posedge CLK) // 클럭분주 begin start_buf <= START;
if(start_buf == 1'b1) // 토글용 작동이 잘 안됩니다. begin toggle = start_buf; continue = ~continue;
end
if(continue == 1'b1) begin if (cnt == 3000000) // 100hz 용이 아닙니다. begin cnt <= 0; c100hz <= ~c100hz; end
else
begin
cnt <= cnt + 1;
end
end
end
always@(posedge c100hz) // ? Hz가 되었을때
begin an_buf <= 4'b0000; // 4개의 LED 모두 작동
if(value >= 10) // 10보다 크다면 begin value = 0; // 0으로 바꾼다. end
value = value + 4'b0001; // 값을 1씩 증가합니다.
case (value) // 값에 따라 출력할 LED 값 계산 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; assign AN = an_buf;
endmodule
접습니다(Fold)..
접습니다(Fold)..
NET "AN<0>" LOC = "P63"; NET "AN<1>" LOC = "P47"; NET "AN<2>" LOC = "P42"; NET "AN<3>" LOC = "P41"; NET "SEG<0>" LOC = "P58"; NET "SEG<1>" LOC = "P40"; NET "SEG<2>" LOC = "P48"; NET "SEG<3>" LOC = "P59"; NET "SEG<4>" LOC = "P64"; NET "SEG<5>" LOC = "P50"; NET "SEG<6>" LOC = "P43"; NET "SEG<7>" LOC = "P56"; NET "CLK" LOC = "P88"; NET "START" LOC = "P75";
접습니다(Fold)..