|
趣味+メモ用のブログです。
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) |