`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 18:07:20 03/02/2009 // Design Name: // Module Name: slot // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module slot( clk, sw_1, sw_2, sw_3, reset, seg7_led_in, seg7 ); //*******************入出力定義****************// input clk; //クロック input sw_1; //スイッチ1 input sw_2; //スイッチ2 input sw_3; //スイッチ3 input reset; //リセットスイッチ output [3:0] seg7_led_in; //4つの7セグ output reg [7:0] seg7; //1つの7セグの棒部分 //*****************内部ノード****************// parameter [31:0] timing = 32'h00278A40; reg [31:0] count_1sec; reg time_1sec; reg [3:0] number_1; //数字(0-9)のレジスタ1 reg [3:0] number_2; //数字(0-9)のレジスタ2 reg [3:0] number_3; //数字(0-9)のレジスタ3 reg [7:0] node_seg1; //7セグLEDに表示するためのレジスタ1 reg [7:0] node_seg2; //7セグLEDに表示するためのレジスタ2 reg [7:0] node_seg3; //7セグLEDに表示するためのレジスタ3 reg [17:0] OEN_counter; //7セグLEDを点灯させるためのもの wire [1:0] OE_DIGIT; //7セグLEDを点灯させるためのもの reg sw_1_reg; //スイッチ1の変化保持用レジスタ reg sw_2_reg; //スイッチ2の変化保持用レジスタ reg sw_3_reg; //スイッチ3の変化保持用レジスタ reg [3:0] seg7_in; //*****************内部回路*****************// //***********************************************************// //カウント //***********************************************************// always @(posedge clk) begin if( reset == 1'b1) begin time_1sec <= 1'b0; count_1sec <= 32'h00000000; end else begin if(count_1sec == timing) begin time_1sec <= 1'b1; count_1sec <= 32'h00000000; end else begin if( count_1sec == 32'h00000000 ) begin time_1sec <= 1'b0; end count_1sec <= count_1sec + 1; end end end //**************************************************// //7セグに表示させるための数字を決める(右) //**************************************************// always @(posedge clk or posedge reset) begin if( reset == 1'b1) begin number_1 <= 4'b0101; sw_1_reg <= 1'b0; end else begin if( sw_1 == 1'b1 ) begin sw_1_reg <= 1'b1; end if( time_1sec == 1'b1) begin if( sw_1_reg == 1'b0) begin if( number_1 == 4'b1001 ) begin number_1 <= 4'b0000; end else begin number_1 <= number_1 + 1; end end end end end //**************************************************// //7セグに表示させるための数字を決める(中) //**************************************************// always @(posedge clk or posedge reset) begin if( reset == 1'b1) begin number_2 <= 4'b0001; sw_2_reg <= 1'b0; end else begin if( sw_2 == 1'b1 ) begin sw_2_reg <= 1'b1; end if( time_1sec == 1'b1) begin if( sw_2_reg == 1'b0 ) begin if( number_2 == 4'b1001 ) begin number_2 <= 4'b0000; end else begin number_2 <= number_2 + 1; end end end end end //**************************************************// //7セグに表示させるための数字を決める(左) //**************************************************// always @(posedge clk or posedge reset) begin if( reset == 1'b1) begin number_3 <= 4'b0000; sw_3_reg <= 1'b0; end else begin if( sw_3 == 1'b1 ) begin sw_3_reg <= 1'b1; end if( time_1sec == 1'b1) begin if( sw_3_reg == 1'b0 ) begin if( number_3 == 4'b1001 ) begin number_3 <= 4'b0000; end else begin number_3 <= number_3 + 1; end end end end end //******************************************************// //7セグ表示部 //******************************************************// always @(posedge clk) begin case ( number_1 ) 4'b0000 : node_seg1 <=8'b00111111; //'0'表示 4'b0001 : node_seg1 <=8'b00000110; //'1'表示 4'b0010 : node_seg1 <=8'b01011011; //'2'表示 4'b0011 : node_seg1 <=8'b01001111; //'3'表示 4'b0100 : node_seg1 <=8'b01100110; //'4'表示 4'b0101 : node_seg1 <=8'b01101101; //'5'表示 4'b0110 : node_seg1 <=8'b01111101; //'6'表示 4'b0111 : node_seg1 <=8'b00100111; //'7'表示 4'b1000 : node_seg1 <=8'b01111111; //'8'表示 4'b1001 : node_seg1 <=8'b01101111; //'9'表示 default : node_seg1 <=8'b11000000; //'-'表示 endcase case ( number_2 ) 4'b0000 : node_seg2 <=8'b00111111; //'0'表示 4'b0001 : node_seg2 <=8'b00000110; //'1'表示 4'b0010 : node_seg2 <=8'b01011011; //'2'表示 4'b0011 : node_seg2 <=8'b01001111; //'3'表示 4'b0100 : node_seg2 <=8'b01100110; //'4'表示 4'b0101 : node_seg2 <=8'b01101101; //'5'表示 4'b0110 : node_seg2 <=8'b01111101; //'6'表示 4'b0111 : node_seg2 <=8'b00100111; //'7'表示 4'b1000 : node_seg2 <=8'b01111111; //'8'表示 4'b1001 : node_seg2 <=8'b01101111; //'9'表示 default : node_seg2 <=8'b11000000; //'-'表示 endcase case ( number_3 ) 4'b0000 : node_seg3 <=8'b00111111; //'0'表示 4'b0001 : node_seg3 <=8'b00000110; //'1'表示 4'b0010 : node_seg3 <=8'b01011011; //'2'表示 4'b0011 : node_seg3 <=8'b01001111; //'3'表示 4'b0100 : node_seg3 <=8'b01100110; //'4'表示 4'b0101 : node_seg3 <=8'b01101101; //'5'表示 4'b0110 : node_seg3 <=8'b01111101; //'6'表示 4'b0111 : node_seg3 <=8'b00100111; //'7'表示 4'b1000 : node_seg3 <=8'b01111111; //'8'表示 4'b1001 : node_seg3 <=8'b01101111; //'9'表示 default : node_seg3 <=8'b11000000; //'-'表示 endcase end //*******************************************************// //ダイナミック点灯方式 //*******************************************************// always @(posedge clk) begin OEN_counter <= OEN_counter + 1; end assign OE_DIGIT = OEN_counter[17:16]; always @(posedge clk) begin case( OE_DIGIT ) 2'b00 : seg7 <= ~node_seg1; 2'b01 : seg7 <= ~node_seg2; 2'b10 : seg7 <= ~node_seg3; default : seg7 <= ~(8'b01000000); endcase end always @(posedge clk) begin case ( OE_DIGIT ) 2'b00 : seg7_in <= 4'b0001; 2'b01 : seg7_in <= 4'b0010; 2'b10 : seg7_in <= 4'b0100; default: seg7_in <= 4'b1000; endcase end assign seg7_led_in[0] = !seg7_in[0]; assign seg7_led_in[1] = !seg7_in[1]; assign seg7_led_in[2] = !seg7_in[2]; assign seg7_led_in[3] = !seg7_in[3]; endmodule