Verilog HDL程式設計心得(持續記錄)
1. 高速設計時可把輸出直接指定為狀態的某幾位
parameter
IDLE=5'b0_000_0,
START=5'b1_001_1;
assign K2=state[4];
assign K1=state[0];
//K1,K2為輸出,直接與每個狀態高位和地位對應起來(在state增加兩位,作為輸出碼)
2. 把狀態的變化和輸出開關的控制分開寫,採用多個always,分別控制一個輸出訊號
always @ (state or A) //state為狀態,A為輸入
case(state)
//
//
endcase
3. 自動包含所有電平敏感列表
always @ (*)
4. 接收外部時鐘和資料時採用組合邏輯,提高實時性。
assign data_out=(flag==1'b0)?data_in:2'b0; //資料接收
assign fifo_wrclk=(flag==1'b0)? ~clk_in:1'b0; //時鐘接收作為FIFO時鐘
assign fifo_wr=(flag==1'b0)? 1'b1:1'b0; //門控接收
5. 把狀態的變化和輸出開關的控制分開寫,採用多個always,分別控制一個輸出訊號。
6. 模組之間工作的協調方式:採用請求應答機制
a) 請求舉例:(滿872位元組傳送請求訊號)
assignre q1=(fifo_rcv1_rdusedw>=16'd436)?1'b1:1'b0;
…
…
b)應答舉例
(1)3小節中的循查模組的Check_over,循查完之後給資料寫入模組傳送check_over標誌;
(2)接收的資料寫入FIFO完畢之後給後續模組傳送data_ready標誌。
always @(posedge clkor negedge rst)
if(!rst)
data_ready<=1'b0;
else case (state)
WAIT: data_ready<=1'b1;
default:data_ready<=1'b0;
endcase
(3)資料傳送完畢之後給循查模組傳送t_over標誌表示可以繼續響應其他的請求訊號了;
7. 分析清楚是採用電平觸發還是邊沿觸發。比如之前的應答機制採用邊沿觸發較好,如果採用電平觸發可能造成時序的混亂。
關於邊沿檢測的方法:
(1)宣告check_over_old;
always @ (posedge clkor negedge rst)
if(!rst)
check_over_old<=1'b0;
else
check_over_old<=check_over;
(2)檢測 見3小節中。
8.對於相對複雜的邏輯,狀態與訊號控制分離,即採用多個always結構,分別控制狀態和每一個輸出訊號,便於分析程式和修改維護。
9.關於FIFO使用注意事項總結:
(1) 讀寫時鐘一直給,通過讀寫使能來控制。在讀寫時鐘的下降沿給讀寫使能訊號賦值。
---主要體現在:除錯時,讀寫時鐘停止後rdusedw和wrusedw不更新了,原因是先使能讀或者寫有效,然後才給時鐘,然後讀寫使能無效後也停止給時鐘了,導致FIFO裡面的存有的位元組數不能及時更新,對讀寫造成影響,造成滿872位元組這個條件無法判斷。
(2) rdempty為低時,rdusedw才更新
(3) 在rdempty為高時,從FIFO裡面讀出來的前兩個數總是一樣的。
-----解決辦法:
a) 在rdempty為低時再使用讀出的資料,這樣第一次讀出來的數會因為rdempty為高而當做無效資料跳過。
b) 採用1中的方法讀寫時鐘一直給,只控制讀寫使能,這樣rdempty會在寫資料的時候就被更新,變成低電平,這樣讀出來的數就可以直接用。
建議:採用以上兩種方法合用,因為資料更新要延後一個時鐘週期,在使用讀取的資料時候判斷下rdempty能夠有效防止這樣的問題。
(4) 關於rdusedw和wrusedw更新的延後的理解,可以看做是先在每個讀寫的時鐘上升沿到來時,先更新rdusedw和wrusedw再讀寫資料。
相關文章
- 串列埠收發UART(Verilog HDL)串列埠
- 程式設計師持續學習之道程式設計師
- 程式設計師要有持續產出程式設計師
- Verilog HDL迴圈語句簡介
- 如何持續對程式設計保持熱情程式設計
- 程式設計師的Windows工具(持續更新)程式設計師Windows
- linux使用心得(持續更新)Linux
- HDL/FPGA學習筆記八:verilog中task與function的使用FPGA筆記Function
- 程式設計心得程式設計
- 勝因沙龍 - 程式設計競賽(持續更新)程式設計
- html5經驗記錄持續更新HTML
- vmware+ubuntu 踩坑記錄,持續更新Ubuntu
- 個人IDEA使用記錄(持續維護)Idea
- 常用程式碼筆記-持續更新筆記
- JavaScript高階程式設計(讀後感-持續更新)JavaScript程式設計
- React SSR重構踩坑記錄(持續更新)React
- Jenkins+iOS持續整合細節記錄JenkinsiOS
- iOS開發常用小技巧記錄(持續更新)iOS
- hadoop 安裝錯誤記錄(持續更新)Hadoop
- 學程式設計的記錄程式設計
- 多程式多執行緒程式設計彙總(持續更新中)執行緒程式設計
- 7月程式設計心得程式設計
- 持續記函式函式
- 面試心得與總結-——答案整理_4 持續更新面試
- 擁抱變化——持續整合(CI)實踐心得
- 堅持程式設計程式設計
- 前端程式設計輔助網站彙總(將持續更新)前端程式設計網站
- 學習記錄|Socket程式設計程式設計
- 持續整合、持續部署、持續交付、持續釋出
- js函數語言程式設計術語總結 - 持續更新JS函數程式設計
- 程式設計師為什麼要持續學習(升級版)程式設計師
- 踩坑記[持續更新]
- litepal筆記(持續更新)筆記
- 技術掃盲:關於低程式碼程式設計的可持續性交付設計和分析程式設計
- 計算機程式設計心得總結計算機程式設計
- 程式設計學習打卡記錄貼程式設計
- 圖形程式設計問題記錄程式設計
- 記錄資料相關的演算法整理(持續更新)演算法