2016-12-16 40 views
0

我使用BASYS 3 8x8的LED矩陣實現的俄羅斯方塊遊戲的初始值。分配REG具有

reg [7:0]redBlock; 
reg [7:0]backupRed= 8'b00011000; 
reg [7:0]temp; 

assign redBlock=(toRight& oe) ? backupRed>> 1 : backupRed; 

此代碼工作redblock上的LED矩陣順利,當我按下按鈕toRight但病程的它可以追溯到它的初始位置,因爲條件0等於backupRed

我真正想要的是

reg [7:0]redBlock = 8'b00011000;; 
reg [7:0]backupRed; 
reg [7:0]temp; 

assign redBlock=(toRight& oe) ? redBlock>> 1 : redBlock; 

應該更新redBlock以前的位置,但它給錯誤

變量redBlcok是連續和程序assigments

我使用Vivado爲implemantion

這裏寫的是我的意思

http://sendvid.com/ei5bfqc3

+0

查看答案[here](http://stackoverflow.com/questions/36527671/when-should-i-use-reg-instead-of-wire/36527832#36527832)和[here](http:// stackoverflow.com/questions/39344169/why-i-can-not-input-value-to-inout-type/39345924#39345924)。 –

回答

2

您使用的是連續10秒的視頻分配assign來描述您希望存儲的數據。

連續賦值用於描述組合邏輯,但您在這裏需要的是順序邏輯,即寄存器(觸發器)。

這些方針的東西:

reg [7:0]redBlock = 8'b00011000; 

always @(posedge ck or posedge rst) begin 
    if(rst) 
    redBlock <= 8'b00011000; 
    else 
    redBlock <= (toRight& oe) ? redBlock>> 1 : redBlock; 
end 

編輯:什麼樣的麻煩,你可能會遇到的一些想法。

不知道什麼樣的信號toRight的是,假設toRight是原始按鈕輸入:

首先,你需要synchronize您的按鈕輸入。

如果您的時鐘相對於toRight的持續時間較慢,則可能需要捕獲短脈衝並生成一個時鐘週期長脈衝。

如果您的時鐘與toRight的持續時間相比較快,則可能需要添加一個計數器,以確保每按一次按鈕按鈕的次數就不會增加太多redBlock

此外,您可能需要處理redBlock已到達顯示器邊緣的情況。

+0

非常感謝你真的工作。 – Emre