忍者ブログ
趣味+メモ用のブログです。 GNU/Linux関連、OSS関連情報、調査事項になるでしょうが、何を書くか分かりません。
[103] [102] [101] [100] [99] [98] [97] [96]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

AZPR EvBoardの取説にある サイコロプログラムの動作を確認したのでメモ


■ ダイスプログラム(取説よりコピー)






module dice (
    input wire        clk,	                   // クロック
    input wire        reset_,                 // リセット
    input wire        sw_,                    // プッシュスイッチ
    output reg [6:0]  led_                    // 7seg LED
);

    /* 内部信号 */
    // 汎用パラメータ
    localparam    LOW         = 1'b0;         // LOWレベル
    localparam    HIGH        = 1'b1;         // HIGHレベル
    // LED点灯パラメータ
    localparam    LED_INIT    = 7'b111_1111;  // 全消灯
    localparam    LED_1       = 7'b111_1001;  // 1:     cb  を点灯 
    localparam    LED_2       = 7'b010_0100;  // 2: g ed ba を点灯
    localparam    LED_3       = 7'b011_0000;  // 3: g  dcba を点灯
    localparam    LED_4       = 7'b001_1001;  // 4: gf  cb  を点灯
    localparam    LED_5       = 7'b001_0010;  // 5: gf dc a を点灯
    localparam    LED_6       = 7'b000_0010;  // 6: gfedc a を点灯
    // サイコロ状態
    localparam    STATE_STOP  = 1'b0;         // 停止状態
    localparam    STATE_ROLL  = 1'b1;         // 回転状態
    reg           state;                      // 状態変数
    // 表示用の分周カウンタ
    localparam    DIV_RATIO   = 200000 - 1;   // 分周比 = 10MHz / 50 Hz - 1
    reg [17:0]    div_cnt;                    // 分周カウンタ
    // サイコロ用カウンタ
    reg [17:0]    dice_cnt;                   // カウンタ
    // スイッチ用ラッチ
    reg           sw_l;                       // ラッチ
    reg           sw_dl;                      // ダブルラッチ
    
    /* LED点灯制御 */
    always @(*) begin
        case (dice_cnt)
            3'd1    : led_ = LED_1;     // 1
            3'd2    : led_ = LED_2;     // 2
            3'd3    : led_ = LED_3;     // 3
            3'd4    : led_ = LED_4;     // 4
            3'd5    : led_ = LED_5;     // 5
            3'd6    : led_ = LED_6;     // 5
            default : led_ = LED_INIT;  // 全消灯
        endcase
    end
    
    /* スイッチ用のラッチ制御 */
    always @ (posedge clk or negedge reset_) begin
        if (reset_ == LOW) begin // 非同期リセット
            sw_l   <= #1 HIGH;
            sw_dl  <= #1 HIGH;
        end else begin
            sw_l   <= #1 sw_;    // ラッチ
            sw_dl  <= #1 sw_l;   // ダブルラッチ
        end
    end
    
    /************* 状態制御 *************/
    always @ (posedge clk or negedge reset_ ) begin
        if (reset_ == LOW) begin // 非同期リセット
            state    <= #1 STATE_STOP;
            dice_cnt <= #1 3'd1;
            div_cnt  <= #1 'h0;
        end else begin
            case (state)
                STATE_STOP : begin // 停止状態
                    if ((sw_dl == HIGH) && (sw_l == LOW)) begin // スイッチON
                        state    <= #1 STATE_ROLL;
                    end
                end
                STATE_ROLL : begin // 回転状態
                    if ((sw_dl == HIGH) && (sw_l == LOW)) begin // スイッチOFF
                        state    <= #1 STATE_STOP;
                    end else begin
                        /* 表示用分周カウンタの制御 */
                        if (div_cnt == DIV_RATIO) begin // カウンタ満了
                            div_cnt  <= #1 'h0;
                            /* サイコロ用カウンタの制御 */
                            if (dice_cnt == 3'd6) begin // カウンタ満了
                                dice_cnt <= #1 3'd1;
                            end else begin                 // カウントアップ
                                dice_cnt <= #1 dice_cnt + 1'b1;
                            end
                        end else begin
                            div_cnt  <= #1 div_cnt + 1'b1;
                        end
                    end
                end
           endcase
       end
   end

endmodule


■ UCFファイル(自作)
NET "clk" TNM_NET = "CLK";
TIMESPEC "TS_CLK" = PERIOD "CLK" 100 ns HIGH 50%;

NET "clk"      LOC = "P83";
NET "reset_"     LOC = "P85";
NET "sw_"   LOC = "P22";
# p91: seg_1_a
NET "led_<0>"  LOC = "P91";
# p92: seg_1_b
NET "led_<1>"  LOC = "P92";
# p12: seg_1_c
NET "led_<2>"  LOC = "P12";
# p15: seg_1_d
NET "led_<3>"  LOC = "P15";
# p16: seg_1_e
NET "led_<4>"  LOC = "P16";
# p90: seg_1_f
NET "led_<5>"  LOC = "P90";
# p86: seg_1_g
NET "led_<6>"  LOC = "P86";


ISE Project navigator でコンパイルして
iPACKで bin -> svfにコンバートして
UrJTAGで、ボードに書き込んで、動作を確認。



PR


忍者ブログ [PR]
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
フリーエリア
最新コメント
最新トラックバック
プロフィール
HN:
一乗寺 又兵衛
性別:
男性
職業:
コンパイル
趣味:
コンパイル
バーコード
ブログ内検索