趣味+メモ用のブログです。
GNU/Linux関連、OSS関連情報、調査事項になるでしょうが、何を書くか分かりません。
× [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 |
カレンダー
カテゴリー
フリーエリア
最新コメント
最新記事
(05/02)
(01/25)
(01/15)
(12/04)
(12/01)
最新トラックバック
ブログ内検索
最古記事
(02/21)
(07/12)
(07/12)
(07/18)
(07/20) |