CPLD调试记录
問題:開發板上電后,串口一直發數據。
解決方式:將電平觸發改為邊沿觸發。
Error (10327): VHDL error at top.vhd(113): can’t determine definition of operator “”="" – found 3 possible definitions
中文:無法確定運算符“” =“的定義-找到3個可能的定義
錯誤代碼
解決方式:去掉std_logic類型數專用的雙引號”“。
Error (10028): Can’t resolve multiple constant drivers for net “rev_ready” at top.vhd(89)
錯誤(10028):無法解析top.vhd(89)的網絡“ rev_ready”的多個常量驅動程序
原因:在多個進程中,給一個信號賦值,那么這個信號到底是多少沒法確定,所以去掉其他進程中的賦值。
常見問題:改變輸出信號的值
再建一個子模塊或process,定義一對新的輸入、輸出信號。新輸入信號接收輸出信號的值,幾個時鐘計數(或其他條件)之后,給新輸出信號賦值。
Error (10822): HDL error at top.vhd(119): couldn’t implement registers for assignments on this clock edge
在這個時鐘邊緣,不能給寄存器賦值。
解決辦法:rising_edge()在進程中只能使用一次。而且在一個“IF”語句中不能有else。而且一定要在進程的最外層。如下圖所示。
Error (10028): Can’t resolve multiple constant drivers for net usartTransferRequestOut" at top.vhd(191)
不能解析usartTransferRequestOut信號的多個常量驅動。
意思是有多個進程使用都給一個信號賦值了。不能同時給一個信號賦值導致數據共享困難。
警告:如果沒有時序驅動,那么電路就成了組合邏輯電路了,會報警告。
術語 :“可綜合”和“不可綜合”
可綜合:可以生成實際電路的。不可綜合與其相反,即不能生成實際電路的,通常用于測試文件。
術語:封裝 模型中封裝可重用代碼的一種方法。是在整個模型中存儲并使用信息的最方便的方式。VHDL有兩個內置封裝,即為“標準”和“TEXTIO”。
關鍵字:package
封裝包括:
- 封裝聲明(需要)
類型聲明
子程序聲明 - 封裝題(可選)
子程序定義
術語:庫: 含有封裝或者封裝集。
包括
資源庫
- 標準封裝
- IEEE開發的封裝
- ALTERA組件封裝
- 設計中 所引用的任意設計單元庫
工作庫 - 單元所編譯的庫
線連接的關系是可以1對多但不可以多對1
原因:因為cpld是并行執行的,所以如果多對1的話,當前時刻這個wire的值是多少無法確定。
wire 和reg 的區別
字面理解,線型和寄存器型。
數據保存的區別:線型表示直連,即輸入有變化,輸出立即有變化。寄存器型能保持其值不改變直到觸發條件發生。
使用場景
定義端口時:input 、inout只能使用wire型,output 可以使用wire 或 reg.定義對外信號時,默認是wire型,定義內部信號時,必須聲明是什么型。
賦值使用時:wire只能用在assign 賦值,reg只能用在initial和always環境中。
阻塞(block)/非阻塞性賦值
阻塞賦值:可以認為只有1個步驟的操作,即計算RHS(右手側,表達式右邊)并更新LHS,強調計算、更新兩個動作同時性,是一個操作.
非阻塞賦值:每個時鐘上升沿計算、更新一次。所以這種n個變量連續傳遞的數據會有n個時鐘延時。
CPLD資源消耗:CPLD中“==”全等比較非常耗費資源,因此盡量少用。
module參數傳遞:
1、module_name #( parameter1, parameter2) inst_name( port_map);
2、module_name #( .parameter_name(para_value), .parameter_name(para_value)) inst_name (port map);
inout用法:
默認狀態是輸出狀態,如果需要將輸出轉換為輸入,需要首先將其配置為高阻狀態,然后再讀取。
組合邏輯應該做的事情
1、取脈沖。
2、狀態轉換。
Warning (21074): Design contains 4 input pin(s) that do not drive logic
** Warning (15610): No output dependent on input pin “sys_clk”**
** Warning (15610): No output dependent on input pin “sys_rst_n”**
警告:沒有輸出依賴這兩個輸入引腳,通常是程序錯誤造成的。程序錯誤多種多樣,可以阻塞賦值改非阻塞賦值或者其他。。
always塊中語句執行時間:一次觸發條件滿足,所有符合條件的語句都會執行一遍,其實就是某一條符合條件的電路通了。這個特點決定了在邊沿觸發的時序邏輯電路中,不適合用阻塞賦值,使用阻塞賦值可能會導致無法預料的錯誤或不可綜合。阻塞賦值的特點是執行完某條語句之前,后面的語句不能執行,和always塊的執行邏輯有沖突的地方。阻塞賦值一般用在組合邏輯電路。
串口調試輸出丟數據 SPI的速度太快,串口沒來的及發送之前的數據,新的數據又來了,所以會丟失。
verilog數據發送方法:數據更新和發送標志同時更新,下個時刻發送標志關閉,可以保證數據發送一次且發送正確。
連續賦值情況避免:在verilog中,一定要注意連續賦值,可能會出現數據更新不及時的情況。導致這種情況的原因是非阻塞性賦值,數據會在塊結束后更新數據。舉例如下:會導致地址沒有生效,發送暫存字節會拿到一個不是上面計算出地址的數據。
address <= spi_recv_data[6:1]; // 取接收地址; send_byte_temp <= time_register[address ]; // 發送數據更新 spi_send_status <= 1'd1; // 啟動發送 st_done <= 1'b1; // 該狀態下處理完畢注意信號的同時性 :比如賦值和啟動同時進行。
begin…end語句之間連續多條語句給某個寄存器賦值:盡量避免這種寫法,可能會導致不可預知的錯誤。
FPGA 引腳模式:如果選擇LVCOMS可能會報警告,警告不能消除。
verilog 清0操作:清零操作可能會有中間值,可能會觸發‘>’或‘<’號。
統一條件下不要對某個變量多次賦值 : 這樣最后讓邏輯變得混亂。例如下,在一個begin 里面,多次對ctrl_reg_temp賦值。
#
NIOS II 是什么?
NIOS II 是FPGA 把沒有利用的邏輯單元做成了一個小的MCU單元,從而不需要再外接一個MCU。NIOS 核調用各個IP核。
IP軟核是什么
IP軟核是altera 已經定義好的邏輯塊,省的自己浪費時間寫了,如PLL IP核,USART IP 核,定時器IP核,SDRAM IP核等。
總結
- 上一篇: 《炬丰科技-半导体工艺》半导体单晶片旋转
- 下一篇: 威胁快报|首爆,新披露Jenkins R