經(jīng)過一周的課程設計,小盆友們對Verilog應該也有了一定的了解了,VerilogHDL是經(jīng)過國際電子工程師協(xié)會認證的硬件描述語言,個人認為它的勢頭有超過VHDL的趨勢,它廣泛應用于FPGA和CPLD的編程,小弟有幸在大二接觸這門語言,并在Altera的CPLD上做過一些簡單編程,繪制了一塊簡單的EPM240核心板,不過一直以來都是歷程看得多,但親自動手編程少,對語法認識很淺薄,這次課設親自動手編寫了盡300行程序,有了一些小體會。
關于Verilog的賦值,我個人傾向于是用非阻塞賦值方法,網(wǎng)上說這樣不容易出現(xiàn)競爭和冒險,我覺得非阻塞是同步賦值,穩(wěn)定性比較高,不會相互干擾。在同一個always語句中不能同時是用非阻塞和阻塞賦值,這一點是課設期間發(fā)現(xiàn)的。關于不能在多個always語句中給同一個變量賦值,在不久以前我編寫超聲波調(diào)制程序時發(fā)現(xiàn)這個問題,其實仔細想想也是有道理的,就像門電路輸出不能直接并聯(lián)一樣,如果兩個激勵對一個網(wǎng)點提供了不同的電平,那不就相當于短路了嗎。收特權同學的教程影響,我一般習慣為每個線變量定義一個寄存器變量對應,在always語句中一般只給寄存器變量賦值,在always外用assign語句把寄存器值映射到線變量上。在今天驗箱時候發(fā)現(xiàn)我的數(shù)碼管掃描效果有問題,兩個數(shù)碼管中多有對方顯示數(shù)字的殘影,這個問題在早期用單片機調(diào)數(shù)碼管的時候很常見,因為單片機執(zhí)行指令時串行的,段位賦值不能同時進行,所以段值可能會殘留到下次位賦值,造成每一位數(shù)碼管都有上一位的數(shù)值殘影,我在狀態(tài)機執(zhí)行的時候是以clk為敏感信號的,位切換在另一個always中以clk四分頻為時鐘,由于都是非阻塞賦值,在位切換后有一個clk周期的時間段值是保持不變的,這就造成了殘影,解決方法很簡單,段譯碼過程的always中醫(yī)段值變化為敏感信號,段值一變立刻譯碼,為段輸出賦值。一下附代碼
wire nclk; //位切換時鐘 assign nclk=cnt[1]; //cnt是分頻計數(shù)寄存器,記clk上升沿 以自己每一位作為時鐘輸出 always @(posedge nclk) begin if(!rst) show=show0; else if(cnt[2]==0) begin show=show0; //段寄存器賦值 wei=3'b001; //位切換 end else if(cnt[2]==1) begin show=show1; wei=3'b000; end end always @(show) begin //原本的敏感信號時 posedge clk if(!rst) seg_r<=8'd0; else begin case(show) 4'h0: seg_r <= seg0; //seg0……等都是之前定義的參量 parameter 4'h1: seg_r <= seg1; 4'h2: seg_r <= seg2; 4'h3: seg_r <= seg3; 4'h4: seg_r <= seg4; 4'h5: seg_r <= seg5; 4'h6: seg_r <= seg6; 4'h7: seg_r <= seg7; 4'h8: seg_r <= seg8; 4'h9: seg_r <= seg9; default: ; endcase end end assign seg=seg_r; //通過寄存器為線變量賦值
當然,如果在case里同時為輸出和位切換賦值 那就更好了 也是同步的。
目前也就想起這么多,有新的內(nèi)容等我領悟了再加上,文章有不足之處歡迎童鞋們指正。接下來說點別的。
咱們用的那個MAX Plus II是Altera很久以前出的,現(xiàn)在已近很少人使用了,QuartusII是目前Altera的主流,由于功能龐大,編譯仿真都比較慢,而最新的版本不支持仿真,因為ModelSim仿真軟件可以與QuartusII無縫對接,仿真效果也很好,所以Altera就放棄了這部分的功能,還有一個叫Xilinx的公司是在可編程邏輯器件上與Altera并駕齊驅的,它提供的ISE是針對它本公司器件所研發(fā)的編譯器,這個我也沒用過,Altera是亞太地區(qū)編程邏輯器件的主流。
FPGA是現(xiàn)場可編程邏輯門陣列,CPLD是復雜可編程邏輯器件,都是目前比較熱門的技術,電氣的童鞋很可能要用到CPLD設計邏輯代替門芯片,這一點張純江老師上課時候說過,如果用CPLD做時序邏輯控制電機,可以精確控制死區(qū)時間,大量驅動邏輯都可以編寫在其中,減小驅動電路體積,提高穩(wěn)定性,當然這只是簡單應用,F(xiàn)PGA/CPLD通常應用于時序要求高,速度要求高的地方,用來作AD采集的控制時最合適的了,可以完整獲得采集到的波形,不會像處理器那樣受到中斷的限制(這好像是趙永科掌門說的),更高端還可以在FPGA中編寫CPU甚至DSP的IP核,當然這不是一個人能搞定的,Altera為我們提供了一些免費授權的IP核還有一些高端的需要付費的IP核,用戶只需要直接調(diào)用IP就能在自己的芯片中生成相關結構,這樣可以將CPU DSP PLL RAM FIFO IO做在一個芯片里,減小體積,降低功耗。當然啦,這些高端的東西小弟也不懂,有待繼續(xù)研究。
有對這方面感興趣的童鞋可以看看北航博客系列叢書中吳厚航寫的那本《深入淺出玩轉FPGA》,作者網(wǎng)名:特權同學,他還有個視頻教程,就是普通話說得慘點。這只是一本入門級書,配合Altera的官方教程可以對FPGA有些初步認識,如果想深入研究那就要*自己不斷查閱資料了,親自實踐了。Living今天就說到這里,歡迎大家轉載。