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]


青い光LED0がかなり明るいので写真だとわかりずらい。赤色のLEDの横に黄色がついているのがLED6、0と6ついているのでこれは2で止まった状態。
ボタン0を押して離すと目がかわるのが確認できる。










コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

CH9329で日本語キーボード109で正しく表示する方法