FPGA:Verilog HDL 電子サイコロ
電子サイコロをVivadoで実装して、FPFAで実際に動かしてみる事をめざす。
ここまでと同じで新規プロジェクトを立ち上げ、Add Sourcesでソースを加える。
moduleの定義を行う。(LEDがMSB6、LSB0、上は入れ忘れて手動で入れた)
ひな形が生成されるのでElectronicDice.vをタイプする。
`timescale 1ns / 1ps
module ElectronicDice(
input CLK,
input RST,
input ENABLE,
output [6:0] LED
);
reg [2:0] cnt;
//hexadecimal counter
always @ (posedge CLK) begin
if (RST)
cnt <=3'h1; //start from 1
else if (ENABLE)
if (cnt==3'h6) //when cnt is h6, cnt is back to 1.
cnt <= 3'h1;
else
cnt <=cnt+3'h1;
end
//Dice data
function [6:0] dec;
input [2:0] din;
case (din)
3'h1: dec =7'b0001000;
3'h2: dec =7'b1000001;
3'h3: dec =7'b0011100;
3'h4: dec =7'b1010101;
3'h5: dec =7'b1011101;
3'h6: dec =7'b1110111;
default: dec =7'bxxxxxxx;
endcase
endfunction
assign LED=dec(cnt);
endmodule
手順は前を参考にしてもらってElectronicDice_tbを同じくシュミレーションのために記述する。ElectronicDice_tbがトップになっていない場合(ファイル目いの左に3つの緑の点がついている時トップ)は、右クリックして、Set as topにする。
ElectronicDice_tbは以下のようにする。`timescale 1ps / 1psの部分は1psにしている。
`timescale 1ps / 1ps
module ElectronicDice_tb;
reg CLK,RST,ENABLE;
wire [6:0] LED;
parameter STEP =1000;
//Definition of a CLK
always begin
CLK=0; #(STEP/2);
CLK=1; #(STEP/2);
end
ElectronicDice Dice(CLK,RST,ENABLE, LED);
//test input
initial begin
RST=0;ENABLE=0;
#STEP RST=1;
#STEP RST=0;
#STEP ENABLE=1;
#(STEP*5)
ENABLE=0;//wehn
#STEP ENABLE=1;
#(STEP*5)
$finish;
end
//test
endmodule
RSTが1にセットさえるとサイコロの目が1になる。
その後ENABLEがセットされるとクロックの度に、数字が1、2・・・とあがっていく。
真ん中がLED[3]だけがついているのが1で、両側LED[0]とLED[6]がついているのが2で・・・ENABLEがゼロになるとその状態を維持して、再度ENABLEがセットされると1から再開して大きくなっていく
という動作がシュミレーションで確認できる。
続いてシュミレーションができたので実際のFPGAボードに実装する。
https://github.com/Digilent/digilent-xdc/blob/master/Arty-A7-35-Master.xdc
からXDCファイルのマスターを開いて、必要箇所をコピーして編集する。
・クロックはCLK100MHZとマスターは記載されているのをCLKに。
・Resetはマスタには単なるボタンスイッチなので加える。
・LEDは3色のうち青だけを使いLED[0]からLED[3]の4つ、単色LEDはLED[4]から[6]の3つを割りあえてる。
押しボタンは、ENABLEとして押している間はダイスの目がまわるようにしている。
## Clock signal
set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { CLK }]; #IO_L12P_T1_MRCC_35 Sch=gclk[100]
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports { CLK }];
#Reset
set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { RST }]; # BTN[3]
## RGB LEDs
set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { LED[0] }]; #IO_L18N_T2_35 Sch=led0_b
#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { led0_g }]; #IO_L19N_T3_VREF_35 Sch=led0_g
#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { led0_r }]; #IO_L19P_T3_35 Sch=led0_r
set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { LED[1] }]; #IO_L20P_T3_35 Sch=led1_b
#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { led1_g }]; #IO_L21P_T3_DQS_35 Sch=led1_g
#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { led1_r }]; #IO_L20N_T3_35 Sch=led1_r
set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { LED[2] }]; #IO_L21N_T3_DQS_35 Sch=led2_b
#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { led2_g }]; #IO_L22N_T3_35 Sch=led2_g
#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { led2_r }]; #IO_L22P_T3_35 Sch=led2_r
set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { LED[3] }]; #IO_L23P_T3_35 Sch=led3_b
#set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { led3_g }]; #IO_L24P_T3_35 Sch=led3_g
#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { led3_r }]; #IO_L23N_T3_35 Sch=led3_r
## LEDs
set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { LED[4] }]; #IO_L24N_T3_35 Sch=led[4]
set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { LED[5] }]; #IO_25_35 Sch=led[5]
set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { LED[6] }]; #IO_L24P_T3_A01_D17_14 Sch=led[6]
#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L24N_T3_A00_D16_14 Sch=led[7]
## Buttons
set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { ENABLE }]; #IO_L6N_T0_VREF_16
Sch=btn[0]
Sch=btn[0]
ボタン0を押して離すと目がかわるのが確認できる。
コメント
コメントを投稿