初學fpga, 怎麼從硬體上理解?
先理解組合邏輯和時序邏輯,後面就好說了,這裡先講講狹義的組合邏輯和時序邏輯,時序邏輯一般指的是d觸發器,組合邏輯指的是:與門 或門 非門,比較器,選擇器,編碼器,解碼器,加法器,當然還有兩模擬較特殊的就是三態門和ram,時序邏輯d觸發器需要時鐘來驅動的,也就是必須要有時鐘才會 動作,而組合邏輯不需要時鐘驅動,在時序圖上的表現就是時序邏輯的輸出比輸入晚乙個時鐘週期,而組合邏輯輸入和輸出都是在同乙個時鐘週期,所有的數位電路 都是由組合邏輯和時序邏輯構成,大到cpu,小到電子錶晶元,然後我們看看上面的組合邏輯和時序邏輯怎麼來用硬體描述語言來描述,
1:與門
assign c = a&b;
always@(*)
c=a&b
2:或門
assign c = a|b;
always@(*)
c=a|b
3:非門
assign c = ~a;
always@(*)
c=~a
4:比較器
assign c = (a>=b)?1'b1:1'b0;
always@(*)
if(a>=b)
c=1'b1;
else
c=1'b0;
5:選擇器
assign c = (a>=b)?d:e;
always@(*)
if(a>=b)
c=d;
else
c=e;
6:解碼器
always@(*)
case(a)
2'b0;c=4'b0001;
2'b1;c=4'b0010;
2'b2;c=4'b0010;
2'b3;c=4'b1000;
endcase
7:編碼器
always@(*)
case(a)
4'b0001 :c=2『d0;
4'b0010 :c=2』d1;
4'b0010 :c=2'd2;
4'b1000; c=2'd3;
endcase
8:加法器
assign c= a+b;
時序邏輯d觸發器
alway@(posedge clk or negedge rst_n)
begin
if(rst_n==1'b0)
q<=1'b0;
else
q <=d;
end
描 述完成上面的這些,我基本上可以用上面這些標準的電路和語言描述出90%的數位電路了,先從最簡單的計數器開始吧,計數器在常見不過,我們先寫乙個模10 的計數器,省去模組埠定義和訊號定位,以下就是核心**了,為了讓lz可以看清楚具體的電路,可能剛剛看著**lz可能會有些難懂,不過沒有關係,要學 會硬體的思維這個是必經之路
我 們可以看到乙個簡單的模10計數器實際上是由4部分組成,乙個比較器,乙個加法器,乙個選擇器,和4個d觸發器,所以乙個計數器實際上是由上面最初介紹的 那幾個基本單元組成,我開啟了fpga神器quartus,綜合一些,改正了若干的語法錯誤,然後最終的綜合的rtl電路如下
電 路和**配合的實在是太好了 **描述了4部分的電路,而電路也表現出來了4部分的電路,我們可以看到 adder 加法器,less_than 比較器,mux21 選擇器 最後乙個d觸發器,這就是硬體思維,硬體思維就是認為所有的數位電路都是由基本的組合邏輯和時序邏輯的元件組合而成,寫出來的**都有對應的最小的電路組 件來對應,既然**都寫出來**,那我們就來看看時序圖,來驗證一下 時序邏輯的輸入和輸出總是延遲乙個時鐘週期,組合邏輯的輸入和輸出在同乙個時鐘週期,開始搭建testbench,此處省略一萬字,熟悉的波形終於出來了
可能上面那個也週期內的圖不一定看的清,就看第二幅圖吧,我們可以看到在
這 3行**是同時執行的,是序列的,在cnt_cnr >='d9的那乙個時鐘週期就執行完成,和c語言的執行方式其實是一樣的,但是cnt_cur 的賦值就可以看到雖然是把cnt_nxt 賦值給cnt_cur,但是由於是時序邏輯所以總是要延遲乙個時鐘週期,好乙個最簡單的模10計數器就介紹完了,但是是不是所有的計數器都要寫的這麼複雜 能,不是,還有兩種基本的寫法,一種寫法就是如下,把所有的組合邏輯都寫在了一起,
還有這種最最常見的寫法就是不區分組合邏輯和時序邏輯,所有的都寫在乙個always塊裡面,就當成時序邏輯來寫,這個只不上是上面兩種電路的一種抽象一點的寫法,但是基本的組合邏輯和時序邏輯都還是一樣
不信看看rtl 和上面的一模一樣
一 個基本的電路都是由基本的組合邏輯電路和d觸發器組成,如果不能用著兩個來組成,那你可能是弄錯了,比方說有新手經常寫乙個延時電路,能用# 10麼,#10可以是由選擇器,還是與或非或者是d觸發器來組成麼,綜合器能理解麼,明顯不行,所以在自己寫乙個**的時候一定要想想他最後的電路是什 麼,談完了計數器,這個最最常用的電路,談完了這個我想在談談verilog,對於verilog我的建議是,遇到組合邏輯用阻塞賦值,遇到時序邏輯用非 阻塞賦值,基本的語法就那麼幾條,
always assign if else case ?: >= <= == & | ~ && || !這個幾個搞定了,應該所有的電路都可以描述了,其他的什麼就不用去理會了,你寫rtl是用不著的,亂用反而會用錯,什麼while , initial ,這些都是**用的,寫rtl根本用不到,
至於如何上手比較快些,fpga開發的流程無非就是 ,方案,**,**,後端約束,上板驗證,找乙個專案吧這個流程都走一我相信上手起來應該不難比如說開發乙個簡單的uart,這個最常見的模組,或者乙個 dds,或者sdram控制器,首先把方案做出來,就是把基本的電路和實現方法畫到草稿上面或者電腦上面,考慮多方面,可靠性,可實現性,資源,能不能跑 到要的時鐘頻率,等等,介面的訊號有哪些,時序是什麼樣子的,內部怎麼控制,用狀態機還是計數器,狀態機的狀態轉移圖是什麼樣,有哪些狀態,狀態遷移的條 件有哪些,會不會跑非,等等
FPGA連線不上硬體的問題 解決
attempted to access jtag server internal error code 82 occurred.在altera官網上查詢原因,說是由於防火牆或防毒軟體的原因 但根據該解決方案試過後還是沒有用。之後我換過不同版本的quartus,並把系統公升級為旗艦版的,還是沒有用。最...
初學者從原始碼理解MySQL死鎖問題
通過好多個深夜艱難的單步除錯,終於找到了乙個理想的斷點,可以看到大部分獲取鎖的過程 在lock0lock.c的static enum db err lowww.cppcns.comck rec lock 函式中,這個函式會顯示,獲取鎖的過程,以及獲取鎖成功與否。場景1 通過程式設計客棧主鍵進行刪除 ...
從根上理解MySQL 第二章
mysql.server也是乙個啟動指令碼,它會間接的呼叫mysqld safe,在呼叫mysql.server時在後邊指定start引數就可以啟動伺服器程式了 localhost 127.0.0.1和0.0.0.0和本機ip的區別 localhost localhost其實是網域名稱,一般wind...