#PACE: Start of Constraints generated by PACE
#PACE: Start of PACE I/O Pin Assignments
#NET "clk" LOC = "T9";
#NET "reset" LOC = "L14";
#NET "VGA_BLUE" LOC = "R11" | DRIVE = 8 | SLEW = FAST ;
#NET "VGA_GREEN" LOC = "T12" | DRIVE = 8 | SLEW = FAST ;
#NET "VGA_HSYNC" LOC = "R9" | DRIVE = 8 | SLEW = FAST ;
#NET "VGA_RED" LOC = "R12" | DRIVE = 8 | SLEW = FAST ;
#NET "VGA_VSYNC" LOC = "T10" | DRIVE = 8 | SLEW = FAST ;
#PACE: Start of PACE Area Constraints
#PACE: Start of PACE Prohibit Constraints
#PACE: End of Constraints generated by PACE
NET "clk" TNM_NET = "clk";
TIMESPEC "TS_clk" = PERIOD "clk" 5 ns HIGH 50 %;
----------------------------------------------------------------------------------------------------------
Constraint | Check | Worst Case | Best Case | Timing | Timing
| | Slack | Achievable | Errors | Score
----------------------------------------------------------------------------------------------------------
* TS_clk = PERIOD TIMEGRP "clk" 5 ns HIGH 5 | SETUP | -1.829ns| 6.829ns| 35| 20907
0% | HOLD | 0.806ns| | 0| 0
------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------
Constraint | Check | Worst Case | Best Case | Timing | Timing
| | Slack | Achievable | Errors | Score
----------------------------------------------------------------------------------------------------------
* TS_clk = PERIOD TIMEGRP "clk" 5 ns HIGH 5 | SETUP | -0.638ns| 5.638ns| 43| 12140
0% | HOLD | 0.776ns| | 0| 0
------------------------------------------------------------------------------------------------------

`default_nettype none
`timescale 1ns / 1ps
// 電子サイコロ Verilog2001
module dice_top(
input wire reset_sw,
input wire clk,
input wire roll,
output wire [3:0] an_n,
output wire a_n,
output wire b_n,
output wire c_n,
output wire d_n,
output wire e_n,
output wire f_n,
output wire g_n,
output wire dp_n
);
wire roll_sig;
wire roll_ena;
wire [2:0] binary;
assign an_n = 4'b1110; // AN0のみ点灯
assign dp_n = 1'b1; // ドットの消灯
reject_chatter inst_reject_chatter(
.reset_sw(reset_sw),
.clk(clk),
.roll(roll),
.roll_sig(roll_sig),
.roll_ena(roll_ena)
);
dice_state_machine inst_dice_sm(
.reset_sw(reset_sw),
.clk(clk),
.roll(roll_sig),
.roll_ena(roll_ena),
.spots(binary)
);
seven_seg_dec inst_seven_seg_dec(
.binary(binary),
.a_n(a_n),
.b_n(b_n),
.c_n(c_n),
.d_n(d_n),
.e_n(e_n),
.f_n(f_n),
.g_n(g_n)
);
endmodule
`default_nettype wire
`default_nettype none
`timescale 1ns / 1ps
// スイッチのチャタリング除去とサイコロの表示変更タイミング20msをカウントする
// Verilog2001
module reject_chatter(
input wire reset_sw,
input wire clk,
input wire roll,
output wire roll_sig,
output reg roll_ena
);
reg [17:0] sw_cnt;
reg [1:0] roll_cnt;
reg roll_node;
parameter frequency_KHz = 50000; // KHz単位でのクロック周波数
parameter divided_200Hz = frequency_KHz * 5; // 200Hzに分周するための分周比
// 200Hz, 5ms
always @(posedge clk) begin
if (reset_sw)
sw_cnt <= 18'd0;
else begin
if (sw_cnt == (divided_200Hz-1))
sw_cnt <= 18'd0;
else
sw_cnt <= sw_cnt + 18'd1;
end
end
always @(posedge clk) begin
if (reset_sw)
roll_node <= 1'b0;
else
if (sw_cnt == (divided_200Hz-1))
roll_node <= roll;
end
assign roll_sig = roll_node;
// 50Hz, 20ms
always @(posedge clk) begin
if (reset_sw) begin
roll_cnt <= 2'd0;
roll_ena <= 1'b0;
end else begin
if (sw_cnt==(divided_200Hz-1)) begin
if (roll_cnt==2'b11) begin
roll_cnt <= 2'd0;
roll_ena <= 1'b1;
end else begin
roll_cnt <= roll_cnt + 2'd1;
roll_ena <= 1'b0;
end
end else
roll_ena <= 1'b0;
end
end
endmodule
`default_nettype wire
`default_nettype none
`timescale 1ns / 1ps
// 1から6までのサイコロの目を表すステートマシン, Verilog2001
module dice_state_machine(
input wire reset_sw,
input wire clk,
input wire roll,
input wire roll_ena,
output reg [2:0] spots
);
parameter st_one = 6'b000001,
st_two = 6'b000010,
st_three = 6'b000100,
st_four = 6'b001000,
st_five = 6'b010000,
st_six = 6'b100000;
reg [5:0] current_state, next_state;
always @(posedge clk) begin
if (reset_sw)
current_state <= st_one;
else
current_state <= next_state;
end
always @* begin
case (current_state)
st_one : begin
spots <= 3'd1;
if (roll & roll_ena)
next_state <= st_two;
else
next_state <= st_one;
end
st_two : begin
spots <= 3'd2;
if (roll & roll_ena)
next_state <= st_three;
else
next_state <= st_two;
end
st_three : begin
spots <= 3'd3;
if (roll & roll_ena)
next_state <= st_four;
else
next_state <= st_three;
end
st_four : begin
spots <= 3'd4;
if (roll & roll_ena)
next_state <= st_five;
else
next_state <= st_four;
end
st_five : begin
spots <= 3'd5;
if (roll & roll_ena)
next_state <= st_six;
else
next_state <= st_five;
end
st_six : begin
spots <= 3'd6;
if (roll & roll_ena)
next_state <= st_one;
else
next_state <= st_six;
end
default : begin
spots <= 3'd1;
next_state <= st_one;
end
endcase
end
// synthesis translate_off
reg [20*8:1] DICE_STATE;
always @(current_state) begin
case (current_state)
st_one : DICE_STATE <= "ST_ONE";
st_two : DICE_STATE <= "ST_TWO";
st_three: DICE_STATE <= "ST_THREE";
st_four : DICE_STATE <= "ST_FOUR";
st_five : DICE_STATE <= "ST_FIVE";
st_six : DICE_STATE <= "ST_SIX";
default : DICE_STATE <= "ST_ONE";
endcase
end
// synthesis translate_on
endmodule
`default_nettype wire
`default_nettype none
`timescale 1ns / 1ps
// 7セグメントLEDデコーダ、0で点灯します。
(* bram_map="yes" *)
module seven_seg_dec(
input wire [2:0] binary,
output reg a_n,
output reg b_n,
output reg c_n,
output reg d_n,
output reg e_n,
output reg f_n,
output reg g_n
);
always @* begin
case (binary)
3'd1 : begin
a_n<=1'b1; b_n<=1'b0; c_n<=1'b0; d_n<=1'b1; e_n<=1'b1; f_n<=1'b1; g_n<=1'b1;
end
3'd2 : begin
a_n<=1'b0; b_n<=1'b0; c_n<=1'b1; d_n<=1'b0; e_n<=1'b0; f_n<=1'b1; g_n<=1'b0;
end
3'd3 : begin
a_n<=1'b0; b_n<=1'b0; c_n<=1'b0; d_n<=1'b0; e_n<=1'b1; f_n<=1'b1; g_n<=1'b0;
end
3'd4 : begin
a_n<=1'b1; b_n<=1'b0; c_n<=1'b0; d_n<=1'b1; e_n<=1'b1; f_n<=1'b0; g_n<=1'b0;
end
3'd5 : begin
a_n<=1'b0; b_n<=1'b1; c_n<=1'b0; d_n<=1'b0; e_n<=1'b1; f_n<=1'b0; g_n<=1'b0;
end
3'd6 : begin
a_n<=1'b0; b_n<=1'b1; c_n<=1'b0; d_n<=1'b0; e_n<=1'b0; f_n<=1'b0; g_n<=1'b0;
end
default : begin
a_n<=1'b1; b_n<=1'b0; c_n<=1'b0; d_n<=1'b1; e_n<=1'b1; f_n<=1'b1; g_n<=1'b1;
end
endcase
end
endmodule
`default_nettype wire



