4月4清明假期修改了一天的project依舊實作不了,RTL視圖只能出來一個模塊,另外兩個設計的模塊出不來,管腳更是沒有辦法配置,是代碼問題嗎?我改了改,改了改,依舊不行,而另一個project里我用同樣的代碼檔案(.v),同樣的BDF,就成功做出來了,我不禁懷疑,真是玄學?于是又經過4月6號的一天摸索,開始另一個實驗,依舊是改bug改到再也不想看見那塊板子和那個螢屏,晚飯后回到實驗室,我把實驗室電腦上做出來的project打開,對比筆記本上沒有做出來的project,突然想起好像是要把哪個設為頂層檔案來著,這一對比,恍然大悟!BDF應該設為頂層檔案的!
在做出來的project里,我誤打誤撞把BDF設定成頂層檔案(然而我自己并沒有意識到),就比較幸運地成功了,而后面的幾個project里我都是把(.v)檔案設定成了頂層檔案,
經過此番折騰,我終于深刻記住了把BDF設定成頂層檔案這句話,果然是實踐出真知,在緊接著的實驗中,同樣的代碼檔案造成一個出結果一個不出結果的靈異現象果真沒有再發生,OK,搞定!
正如師哥所說:硬體開發中,設計和敲代碼的作業量和開發時間僅占三成,剩下七成都是debug,此次所犯的低級錯誤也讓我識訓了一些debug的技能,鍛煉了一番強大的心理耐受力,
昨兒朋友說:*我們可能是bug的制造機!*哈哈哈,這實在是太形象了!
寫一個今早完成的小實驗:
實驗題目:讓四個數碼管穩定顯示“E”“E”“1”“1”
所用設備:terasic DE0
所用軟體:quartus II 9.1
實驗程序:
1、( .v)檔案程式
module testthree(
OUT1,
OUT2,
OUT3,
OUT4);
output [7-1:0] OUT1;
output [7-1:0] OUT2;
output [7-1:0] OUT3;
output [7-1:0] OUT4;
reg [7-1:0] OUT1;
reg [7-1:0] OUT2;
reg [7-1:0] OUT3;
reg [7-1:0] OUT4;
always @(*) begin
OUT1 = 7'b 1111001;
OUT2 = 7'b 1111001;
OUT3 = 7'b 0000110;
OUT4 = 7'b 0000110;
end
endmodule
2、BDF

3、RTL視圖

4、管腳配置

5、下載到板子上

很快就做好了(?′0`?)
根據這個程式,只需要修改數碼管對應的代碼,就可以顯示任何你想顯示的數字,如下圖顯示的“1234”,

注意“0”為“亮”,“1”為“滅”,代碼順序為OUT = 7’b 6543210(數字代表對應的管子,每個管子有0、 1兩個邏輯值),是倒著寫的,下圖是position and index of each segment in a 7-segment display,因為我的程式中沒有用到DP,所以我只定義了7個輸出,
如果要用DP,可以設定output [8-1:0] OUT; 對應的代碼順序就是OUT = 8’b DP6543210,

實驗二(1):讓七段LED發光管以1HZ的頻率閃爍起來,從全1到全E來回切換
實驗軟體:quartus II 9.1
實驗板子:terasic DE0
實驗程序:
1、(.v)verilog HDL代碼
module clk(
CLK , // clock
CNTVAL, // counter value
OV ); // overflow
input CLK;
output [32-1:0] CNTVAL;
output OV;
parameter MAX_VAL = 50_000_000;
reg [32-1:0] CNTVAL;
reg OV;
always @ (posedge CLK) begin
if(CNTVAL >= MAX_VAL)
CNTVAL <= 0;
else
CNTVAL <= CNTVAL + 1'b1;
end
always @ (CNTVAL) begin
if(CNTVAL == MAX_VAL)
OV = 1'b1;
else
OV = 1'b0;
end
endmodule
///
module cnt_en_0to1(
CLK , // clock
CNTVAL, // counter value
EN ,);
input CLK;
input EN;
output CNTVAL;
reg CNTVAL;
reg OV;
always @ (posedge CLK) begin
if(EN) begin // work enable
if(CNTVAL >= 1)
CNTVAL <= 0;
else
CNTVAL <= CNTVAL + 1'b1;
end
else
CNTVAL <= CNTVAL ; // hold same value
end
endmodule
///
module dec_1to7(
IN ,
OUT1,
OUT2,
OUT3,
OUT4);
input IN;
output [7-1:0] OUT1 ;
output [7-1:0] OUT2 ;
output [7-1:0] OUT3 ;
output [7-1:0] OUT4 ;
reg [7-1:0] OUT1 ;
reg [7-1:0] OUT2 ;
reg [7-1:0] OUT3 ;
reg [7-1:0] OUT4 ;
always @ (IN) begin
case(IN)
1'b0: OUT1 = 7'b 1111001;
1'b1: OUT1 = 7'b 0000110;
endcase
case(IN)
1'b0: OUT2 = 7'b 1111001;
1'b1: OUT2 = 7'b 0000110;
endcase
case(IN)
1'b0: OUT3 = 7'b 1111001;
1'b1: OUT3 = 7'b 0000110;
endcase
case(IN)
1'b0: OUT4 = 7'b 1111001;
1'b1: OUT4 = 7'b 0000110;
endcase
end
endmodule
程式中posedge clk意思是clk上升沿觸發(與此對應negedge clk意思是clk下降沿觸發),兩者都是邊沿觸發
2、BDF

3、RTL視圖

4、管腳配置

5、實驗結果
可以看到板子上“1”和“E”以1HZ頻率,即1秒的周期不斷跳躍,


6、實驗總結
本實驗最關鍵的地方就是parameter MAX_VAL值的設定,因為時鐘模塊(labtwo)的代碼邏輯就是:當計數到parameter MAX_VAL時,輸出OV為1,否則OV為0,在這里我們把parameter MAX_VAL的值設定為50M,這樣一來經過變換,時鐘頻率就由輸入的50MHZ變慢為輸出的1HZ,
我最開始設定的parameter MAX_VAL = 25M,因為我覺得在第二個模塊0-1轉換時速度會繼續下降一倍,那樣才會最終呈現1HZ的頻率,實驗證明并不是這樣,所以cnt_en_0to1模塊并不具備延時功能,
實驗二(2):增加閃爍頻率,使用實驗來測定,到什么頻率時,你分不清1和E,此時你看到的是什么圖樣?
答:當引數MAX_VAL = 500_000時,頻率為100HZ時,即周期為100ms,分不清1和E,此時看到的是8888,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/273803.html
標籤:其他
