001 `timescale 1ns / 1ps
002 //////////////////////////////////////////////////////////////////////////////////
003 // Create Date: 12:29:40 10/22/2015
004 // Module Name: counter30
005 //////////////////////////////////////////////////////////////////////////////////
006 module counter30(
007 input wire clk0,
008 output wire [7:0] seg7,
009 output wire [3:0] line,
010 output wire [6:0] led
011 );
012 assign line = 4'b0001<<ab;
013 assign led = { 2'b00, count3, count10 };
014 assign seg7 = { 1'b0, disp };
015
016 parameter [6:0] seg7_data[0:9]={
017 7'b0111111, //0
018 7'b0000110, //1
019 7'b1011011, //2
020 7'b1001111, //3
021 7'b1100110, //4
022 7'b1101101, //5
023 7'b1111101, //6
024 7'b0100111, //7
025 7'b1111111, //8
026 7'b1101111 //9
027 };
028
029 // ダイナミック表示
030 reg[6:0] disp=7'b0;
031 reg[3:0] x;
032 reg ab=0;
033 always @( posedge clk0 )begin
034 if(c[19:0]==0)begin
035 x <= ab?count3:count10;
036 if(x<=4'd9)
037 disp <= seg7_data[x];
038 else
039 disp <= 7'b0000000;
040 ab <= ab + 1'b1;
041 end
042 end
043
044 // 1秒生成
045 reg[26:0] c=27'b0;
046 reg sec_enable=1'b0;
047 always @( posedge clk0 )begin
048 if( c==27'd99999999 )begin // 100,000,000-1
049 c <= 0;
050 sec_enable <= 1'b1;
051 end
052 else begin
053 c <= c + 1'b1;
054 sec_enable <= 1'b0;
055 end
056 end
057
058 // 10進カウンタ
059 reg[3:0] count10=4'b0;
060 reg sec10_enable = 1'b0;
061 always @( posedge clk0 )begin
062 if( sec_enable )begin
063 if( count10==4'd9 )begin
064 count10<=1'b0;
065 sec10_enable <= 1'b1;
066 end
067 else begin
068 count10 <= count10 + 1'b1;
069 sec10_enable <= 1'b0;
070 end
071 end
072 else begin
073 sec10_enable <= 1'b0;
074 end
075 end
076
077 // 3進カウンタ
078 reg[1:0] count3=2'b0;
079 always @( posedge clk0 )begin
080 if( sec10_enable )
081 if( count3==2'd2 )
082 count3 <= 1'b0;
083 else
084 count3 <= count3 + 1'b1;
085 end
086
087 endmodule
ssatoh@
足立工科大学 工学部 情報通信工学科