《電子技術應用》
您所在的位置:首頁 > EDA與制造 > 解決方案 > EDA簡介

EDA簡介

2015-10-14
關鍵詞: EDA CAM CAT CAD

       EDA是電子設計自動化(ElectrONic Design AUTOMATION)的縮寫,在20世紀90年代初從計算機輔助設計(CAD)、計算機輔助制造(CAM)、計算機輔助測試(CAT)和計算機輔助工程(CAE)的概念發(fā)展而來的。EDA技術就是以計算機為工具,設計者在EDA軟件平臺上,用硬件描述語言HDL完成設計文件,然后由計算機自動地完成邏輯編譯、化簡、分割、綜合、優(yōu)化、布局、布線和仿真,直至對于特定目標芯片的適配編譯、邏輯映射和編程下載等工作。EDA技術的出現(xiàn),極大地提高了電路設計的效率和可操作性,減輕了設計者的勞動強度。

EDA設計方法

前端設計(系統(tǒng)建模RTL 級描述)后端設計(FPGAASIC)系統(tǒng)建模

  IP 復用

  前端設計

  系統(tǒng)描述:建立系統(tǒng)的數學模型。

  功能描述:描述系統(tǒng)的行為或各子模塊之間的數據流圖。

  邏輯設計:將系統(tǒng)功能結構化,通常以文本、原

  理圖、邏輯圖、布爾表達式來表示設計結果。

  仿真:包括功能仿真和時序仿真,主要驗證系統(tǒng)功能的正確性及時序特性。

EDA常用軟件

EDA工具層出不窮,目前進入我國并具有廣泛影響的EDA軟件有:multiSIM7(原EWB的最新版本)、PSPICE、OrCAD、PCAD、Protel、Viewlogic、Mentor、Graphics、Synopsys、LSIIogic、Cadence、MicroSim,ISE,modelsim等等。這些工具都有較強的功能,一般可用于幾個方面,例如很多軟件都可以進行電路設計與仿真,同進還可以進行PCB自動布局布線,可輸出多種網表文件與第三方軟件接口。

NIOS II常用函數整理

 

IO操作函數
函數原型:IORD(BASE, REGNUM)
輸入參數:BASE為寄存器的基地址,REGNUM為寄存器的偏移量
函數說明:從基地址為BASE的設備中讀取寄存器中偏移量為REGNUM的單元里面的值。寄存器的值在地址總線的范圍之內。
返回值:  -

函數原型:IOWR(BASE, REGNUM, DATA)
輸入參數:BASE為寄存器的基地址,REGNUM為寄存器的偏移量,DATA為要寫入的數據
函數說明:往偏移量為REGNUM寄存器中寫入數據。寄存器的值在地址總線的范圍之內。
返回值:  -

函數原型:IORD_32DIRECT(BASE, OFFSET)
輸入參數:BASE為寄存器的基地址,OFFSET為寄存器的的偏移量
函數說明:從地址位置為BASE+OFFSET的寄存器中直接讀取32Bit的數據
返回值:  -

函數原型:IORD_16DIRECT(BASE, OFFSET)
輸入參數:BASE為寄存器的基地址,OFFSET為寄存器的的偏移量
函數說明:從地址位置為BASE+OFFSET的寄存器中直接讀取16Bit的數據
返回值:  -

函數原型:IORD_8DIRECT(BASE, OFFSET)
輸入參數:BASE為寄存器的基地址,OFFSET為寄存器的的偏移量
函數說明:從地址位置為BASE+OFFSET的寄存器中直接讀取8Bit的數據
返回值:  -

函數原型:IOWR_32DIRECT(BASE, OFFSET, DATA)
輸入參數:BASE為寄存器的基地址,REGNUM為寄存器的偏移量,DATA為要寫入的數據
函數說明:往地址位置為BASE+OFFSET的寄存器中直接寫入32Bit的數據
返回值: -

函數原型:IOWR_16DIRECT(BASE, OFFSET, DATA)
輸入參數:BASE為寄存器的基地址,REGNUM為寄存器的偏移量,DATA為要寫入的數據
函數說明:往地址位置為BASE+OFFSET的寄存器中直接寫入16Bit的數據
返回值: -

函數原型:IOWR_8DIRECT(BASE, OFFSET, DATA)
輸入參數:BASE為寄存器的基地址,REGNUM為寄存器的偏移量,DATA為要寫入的數據
函數說明:往地址位置為BASE+OFFSET的寄存器中直接寫入8Bit的數據
返回值: -

Dma:
函數原型:int alt_dma_rxchan_close (alt_dma_rxchan rxchan)
輸入參數:rxchan為接收信道
函數說明:函數 alt_dma_rxchan_close ()通知系統(tǒng):應用程序已經完成DMA
接收信道rxchan,目前執(zhí)行是成功的
返回值: 成功返回為0,反之為-1

 

函數原型:alt_dma_rxchan_depth(alt_dma_rxchan dma)
輸入參數:dma
函數說明:函數alt_dma_rxchan_depth ()返回傳送到特別DMA的最大數量(深度)的接收請求
返回值: DMA的最大數量

函數原型:int alt_dma_rxchan_ioctl (alt_dma_rxchan dma, int req, void* arg)
輸入參數:dma直接存儲器名, req為請求操作的列舉, arg由請求決定
函數說明:通過DMA接收信道執(zhí)行設備的具體I/O操作
返回值: 成功返回請求具體值,反之返回為負數
請求類型
請求類型 請求類型說明
ALT_DMA_SET_MODE_8 傳輸以8Bit為單位的數據,arg值忽略
ALT_DMA_SET_MODE_16 傳輸以16Bit為單位的數據,arg值忽略
ALT_DMA_SET_MODE_32 傳輸以32Bit為單位的數據,arg值忽略
ALT_DMA_SET_MODE_64 傳輸以64Bit為單位的數據,arg值忽略
ALT_DMA_SET_MODE_128 傳輸以128Bit為單位的數據,arg值忽略
ALT_DMA_TX_ONLY_ON (1) 軟件控制下只能發(fā)送
ALT_DMA_TX_ONLY_OFF (1) 自定義模式,軟件控制下可以接收,發(fā)送
ALT_DMA_RX_ONLY_ON (1) 軟件控制下只能接收
ALT_DMA_RX_ONLY_OFF (1) 自定義模式,軟件控制下可以接收,發(fā)送

函數原型:alt_dma_rxchan alt_dma_rxchan_open (conST char* name)
輸入參數:name為常數字符指針,如/dev/dma_0
函數說明:為DMA接收信道獲得一個alt_dma_rxchan描述符
返回值: 成功返回非0,反之返回為0

函數原型:int alt_dma_rxchan_prepare (alt_dma_rxchan dma, void* data,
alt_u32 length, alt_rxchan_done * done, void* handle)
輸入參數:dma使用的信道;data接收數據位置的指針;length最大的接收數據長度;done一旦數據被接收,調用返回函數;handle,非透明值傳到done
函數說明:發(fā)送一個接收請求到DMA接收信道,
返回值: 成功返回0,反之返回為負數

函數原型:int alt_dma_rxchan_reg (alt_dma_rxchan_dev * dev)
輸入參數:dev接收信道設備名
函數說明:給系統(tǒng)寄存DMA接收信道
返回值: 成功返回0,反之返回為負數

函數原型:int alt_dma_txchan_close (alt_dma_txchan txchan)
輸入參數:txchan發(fā)送信道名
函數說明:通知系統(tǒng):應用程序已經完成DMA發(fā)送信道txchan
返回值: 成功返回0,反之返回為負數

函數原型:int alt_dma_txchan_ioctl (alt_dma_txchan dma, int req, void* arg)
輸入參數:dma直接存儲器名;req為請求操作的列舉;arg請求的額外參數,由請求決定
函數說明:通過DMA發(fā)送信道執(zhí)行設備的具體I/O操作
返回值: 成功返回請求具體值,反之返回為負數

函數原型:alt_dma_txchan alt_dma_txchan_open (const char* name)
輸入參數:name為常數字符指針,如/dev/dma_0
函數說明:為DMA發(fā)送信道獲得一個alt_dma_rxchan描述符
返回值: 成功返回非0,反之返回為0

函數原型:int alt_dma_txchan_reg (alt_dma_txchan_dev* dev)
輸入參數:dev接收信道設備名
函數說明:給系統(tǒng)寄存DMA發(fā)送信道
返回值: 成功返回0,反之返回為負數

函數原型:int alt_dma_txchan_send (alt_dma_txchan dma, const void* from,
alt_u32 length, alt_txchan_done* done, void* handle)
輸入參數:dma使用的信道;data接收數據位置的指針;length最大的接收數據長度;done一旦數據被接收,調用返回函數;handle,非透明值傳到done
函數說明:發(fā)送一個發(fā)送請求到DMA發(fā)送信道,
返回值: 發(fā)送成功返回0,反之返回為負數

函數原型:nt alt_dma_txchan_space (alt_dma_txchan dma)
輸入參數:dma 直接存儲器名
函數說明:返回被傳送到具體DMA發(fā)送信道的發(fā)送請求數目
返回值: 返回發(fā)送請求數目

Flash
函數原型:int alt_erase_flash_block(alt_flash_fd* fd, int offset, int length)
輸入參數:fd為具體的flash設備;offset擦除的flash模塊的偏移量;length擦除的flash模塊的長度
函數說明:擦除單獨的一個flash模塊
返回值: 發(fā)送成功返回0,反之返回為負數

 

函數原型:void alt_flash_close_dev(alt_flash_fd * fd)
輸入參數:fd為具體的flash設備
函數說明:關閉flash設備
返回值: -

函數原型:alt_flash_fd * alt_flash_open_dev(const char* name)
輸入參數:
函數說明:打開flash設備。一旦打開,函數alt_write_flash()用來寫入,函數alt_read_flash()用來讀取數據,或者使用函數alt_get_flash_info(), alt_erase_flash_block(), alt_write_flash_block(),控制單個模塊
返回值: 失敗返回0,成功其他值

函數原型:int alt_get_flash_info(alt_flash_fd* fd, flash_region ** info,
int* number_of_regions)
輸入參數:fd flash設備;info指向flash_region結構體的指針;number_of_regions
函數說明:得到擦除flash區(qū)域的細節(jié)
返回值: 發(fā)送成功返回0,反之返回為負數

函數原型:int alt_read_flash(alt_flash_fd* fd, int offset, void* dest_addr, int length)
輸入參數:dest_addr目標地址指針
函數說明:從flash偏移量為offset字節(jié)開始讀取數據,寫入到目標地址dest_addr中
返回值: 成功返回0,反之為非0

函數原型:int alt_write_flash(alt_flash_fd* fd, int offset, const void* src_addr,
int length)
輸入參數:src_addr源地址;fd,flash設備;offset 偏移量;length字節(jié)長度
函數說明:寫數據到flsah中,要寫的數據在源地址src_addr中
返回值: 成功返回0,反之為非0

函數原型:int alt_write_flash_block(alt_flash_fd* fd, int block_offset, int data_offset,
const void *data, int length)
輸入參數:fd;data_offset起始寫數據的偏移量;length為要寫數據的長度
函數說明:寫入到一個已擦除的flash模塊
返回值: 成功返回0,反之為非0


函數原型:alt_irq_context alt_irq_disable_all (void)
輸入參數:void
函數說明:禁止所有中斷
返回值: 傳遞的值作為隨后的函數調用的輸入參數

 


函數原型:void alt_irq_enable_all (alt_irq_context context)
輸入參數:先前調用函數alt_irq_disable_all (void)的返回值,
函數說明:啟動所有中斷
返回值: -

函數原型:int alt_irq_enabled (void)
輸入參數:void
函數說明:啟動中斷
返回值: 禁止中斷返回0,反之為非0

函數原型:int alt_irq_register (alt_u32 id, void* context, void (*isr)(void*, alt_u32))
輸入參數:id,32位無符號數,中斷使能;context和id是isr的兩個輸入參數;中斷激活時調用isr
函數說明:寄存一個isr
返回值: 成功返回0,反之為非0

函數原型:int alt_write_flash(alt_flash_fd* fd, int offset, const void* src_addr,
int length)
輸入參數:src_addr源地址;fd,flash設備;offset 偏移量;length字節(jié)長度
函數說明:寫數據到flsah中,要寫的數據在源地址src_addr中
返回值: 成功返回0,反之為非0

函數原型:int alt_write_flash_block(alt_flash_fd* fd, int block_offset, int data_offset,
const void *data, int length)
輸入參數:fd;data_offset起始寫數據的偏移量;length為要寫數據的長度
函數說明:寫入到一個已擦除的flash模塊
返回值: 成功返回0,反之為非0

函數原型:int close (int filedes)
輸入參數:filedes,描述符
函數說明:標準的UNIX函數close(),關閉文件描述符filedes
返回值: 成功返回0,反之為-1

函數原型:int open (const char* pathname, int flags, mode_t mode)
輸入參數:pathname, 路徑名;flags,O_RDONLY或O_WRONLY 或O_RDWR,分別對應著只讀,只寫,或讀寫操作;mode,使用許可說明
函數說明:打開文件或設備,返回一個文件描述符(讀寫中使用的非負整數)
返回值: 成功返回文件描述符,反之返回-1

函數原型:int read(int file, void *ptr, size_t len)
輸入參數:file文件描述符;ptr為讀數據的位置指針,len讀數據的長度,單位為字節(jié)
函數說明:從文件或設備中讀取數據塊
返回值: 成功返回讀取的字節(jié)數,反之返回-1

函數原型:clock_t times (struct tms *buf)
輸入參數:buf結構體指針
函數說明:兼容newlib,tms的結構體指針如下:
type struct
{clock_t tms_utime;
clock_t tms_stime;
clock_t tms_cutime;
clock_t tms_sutime;
};
tms_utime: CPU索取用戶指令的執(zhí)行時間
tms_stime: CPU索取由系統(tǒng)表示的過程的執(zhí)行時間
tms_cutime:所有子進程tms_utime和tms_cutime的時間之和
tms_sutime:所有子進程tms_stime和tms_sutime的時間之和
返回值: 返回時鐘數,沒有時鐘則返回0

函數原型:int usleep (int us)
輸入參數:us,單位為微秒
函數說明:直到us微秒后才解除阻塞,即其功能相當于延時us微秒
返回值: 成功返回0,反之為-1,有錯誤發(fā)生顯示錯誤發(fā)生原因

函數原型:int wait(int *status)
輸入參數: status 進程狀態(tài)指針
函數說明:功能是等候所有子進程退出,由于HAL不支持分散子進程,函數立即返回
返回值: status內容清0,表明沒有子進程;返回值為-1,且errno置為ECHILD, 表明沒有子進程等候

函數原型:int write(int file, const void *ptr, size_t len)
輸入參數:file文件描述符;ptr為讀數據的位置指針,len讀數據的長度,單位為字節(jié)
函數說明:往文件或設備寫入數據塊,
返回值: 成功返回寫入的字節(jié)數,也可能少于請求的長度;反之返回-1,萬一有錯誤發(fā)生,errno被設置為發(fā)生的原因


類型 說明
alt_8 符號8位整數
alt_u8 無符號8位整數
alt_16 符號16位整數
alt_u16 無符號16位整數
alt_32 符號32位整數
alt_u32 無符號32位整數

 

 

下面為自己整理
函數原型:int fopen (char * file_name, way_use);
輸入參數:file_name文件名,way_use使用文件方式,比如r,w分別對應著讀寫
函數說明:打開文件,對其進行某種文件操作
返回值: 打不開則出錯,返回一個空指針NULL

 

函數原型:int fclose (fp)
輸入參數:fp的定義為:FILE *fp
函數說明:關閉文件fp
返回值: 成功返回0,反之為-1(EOF)

函數原型:int fread(void *ptr, int size, int count, FILE * fp);
輸入參數:buffer為指針;是讀入數據地存放地址;size讀字節(jié)數;count讀字節(jié)數地數目;fp文件型指針
函數說明:從一個流中讀取數據
返回值: 成功返回值為count

函數原型:int fwrite(void *ptr, int size, int count, FILE *fp)
輸入參數:buffer為指針;是讀入數據地存放地址;size讀字節(jié)數;count讀字節(jié)數地數目;fp文件型指針,
函數說明:寫內容到流中
返回值: 成功返回值為count

函數原型:int fprintf(FILE *fp, char *format[, argument,...]);
輸入參數:fp文件型指針;format格式字符串;[, argument,...]輸出列表,如:
fprintf(fp,“%d,%f”,i,t)
函數說明:傳送格式化輸出到一個流中
返回值: -

函數原型:int fscanf(FILE * fp, char *format[,argument...])
輸入參數:fp文件型指針;format格式字符串;[, argument,...]輸入列表,如:
fscanf(fp,“%d,%f”,i,t)
函數說明:從一個流中執(zhí)行格式化輸入
返回值: -

函數原型:int fputc(int ch, FILE *fp)
輸入參數:ch字符;fp:文件型指針
函數說明:送一個字符到一個流中
返回值: 成功返回字符,反之返回-1(EOF)

函數原型:int fgetc(FILE *fp);
輸入參數:fp:文件型指針
函數說明:從流中讀取字符
返回值: 遇到文件結束返回-1(EOF)

函數原型:int putw(int w, FILE *fp)
輸入參數:w: 字符或字; fp:文件型指針
函數說明:把一字符或字送到流中
返回值: -

函數原型:int getw(FILE *fp)
輸入參數:fp:文件型指針
函數說明:從流中取一整數
返回值: -

函數原型:int rewind(FILE *fp)
輸入參數:fp:文件型指針
函數說明:將文件指針重新指向一個流的開頭
返回值: -

函數原型:int fseek(FILE *fp, long offset, int fromwhere);
輸入參數:fp:文件型指針;offset:long型偏移量;fromwhere:起始點
起始點為0,1,2分別代表文件開始,當前位置,文件末尾
函數說明:重定位流上的文件指針
返回值: -

函數原型:int ferror(FILE *fp)
輸入參數:fp:文件型指針
函數說明:檢測流上的錯誤
返回值: 未出錯返回值為0,反之為非0

函數原型:long ftell(FILE *fp)
輸入參數:fp:文件型指針
函數說明:返回當前文件指針,得到當前位置
返回值: 返回值為-1表示出錯,反之為非0

函數原型:void clearerr(FILE *fp)
輸入參數:fp:文件型指針
函數說明:復位錯誤標志
返回值: 出錯為非0,反之為0

函數原型:char *fgets(char *string, int n, FILE *fp)
輸入參數:string:字符串指針;fp:文件型指針
函數說明:從流中讀取一字符串,但只從文件輸入n-1個字符,后一個為‘\0’結束標志位
返回值: -

函數原型:nt fputs(char *string, FILE *fp)
輸入參數:string:字符串指針;fp:文件型指針
函數說明:送一個字符串到一個流中
返回值: -

函數原型:int feof(FILE *fp)
輸入參數:fp:文件型指針
函數說明:檢測流上的文件結束符
返回值: -

 

IRQ

 

IORD_16DIRECT(BASE, OFFSET)
從地址位置為BASE+OFFSET的寄存器中直接讀取16Bit的數據
IORD_8DIRECT(BASE, OFFSET)
從地址位置為BASE+OFFSET的寄存器中直接讀取8Bit的數據

IOWR_32DIRECT(BASE, OFFSET, DATA)
往地址位置為BASE+OFFSET的寄存器中直接寫入32Bit的數據

IOWR_16DIRECT(BASE, OFFSET, DATA)
往地址位置為BASE+OFFSET的寄存器中直接寫入16Bit的數據
IOWR_8DIRECT(BASE, OFFSET, DATA)
往地址位置為BASE+OFFSET的寄存器中直接寫入8Bit的數據
IORD(BASE, REGNUM)
從基地址為BASE的設備中讀取偏移量為REGNUM的寄存器里面的值。寄存器的值在地址總線的范圍之內。
IOWR(BASE, REGNUM, DATA)
BASE為基地址,往偏移量為REGNUM寄存器中寫入數據。寄存器的值在地址總線的范圍之內。
IORD_32DIRECT(BASE, OFFSET)
BASE為寄存器的基地址,OFFSET為寄存器的的偏移量。
從地址位置為BASE+OFFSET的寄存器中直接讀取32Bit的數據
IORD_16DIRECT(BASE, OFFSET)
從地址位置為BASE+OFFSET的寄存器中直接讀取16Bit的數據
IORD_8DIRECT(BASE, OFFSET)
從地址位置為BASE+OFFSET的寄存器中直接讀取8Bit的數據

IOWR_32DIRECT(BASE, OFFSET, DATA)
往地址位置為BASE+OFFSET的寄存器中直接寫入32Bit的數據

IOWR_16DIRECT(BASE, OFFSET, DATA)
往地址位置為BASE+OFFSET的寄存器中直接寫入16Bit的數據
IOWR_8DIRECT(BASE, OFFSET, DATA)
往地址位置為BASE+OFFSET的寄存器中直接寫入8Bit的數據

Nios II IDE Command Line Tools
Tool Descriptor
nios2-create-system-library 創(chuàng)建一個新系統(tǒng)庫工程
nios2-create-application-project 創(chuàng)建一個C/C++應用庫工程
nios2-build-project 使用Nios II IDE編譯工程,創(chuàng)建或更新文件編寫來編譯工程,該操作工程必須是存在當前的Nios II IDE工作區(qū)間
nios2-import-project 導入一個以前創(chuàng)建的Nios II IDE工程到當前的工作區(qū)間
nios2-delete-project 從Nios II IDE工作區(qū)間刪除工程

Altera Command-Line Tools
Tool Descriptor
nios2-download 為調試或運行下載代碼到目標處理器
nios2-flash-programmer 編程數據到目標板的flash存儲器上
nios2-gdb-server 通過TCP,用目標Nios II處理器把GNU調試器遠程的串口協(xié)議分組翻譯為共同測試行動小組(JTAG)的事務
nios2-terminal 用JTAG通用異步收發(fā)機(UART)執(zhí)行終止Nios II系統(tǒng)里面的I/O
validate_zip 核實指定的zip文件是否兼容Altera只讀zip文件系統(tǒng)

File Conversion Utilities
Utility Descriptor
bin2flash 為下載到flash存儲器上,將二進制文件轉換為.flash文件
elf2dat 為適應Verilog HDL硬件仿真,將.elf可執(zhí)行文件格式轉換為.dat文件格式
elf2flash 為下載到flash存儲器上,將.elf可執(zhí)行文件格式轉換為.flash文件
elf2hex 將.elf可執(zhí)行文件格式轉換為Intel.hex文件格式
elf2mem 在指定的Nios II系統(tǒng)中為存儲設備生成存儲內容
elf2mif 將.elf可執(zhí)行文件格式轉換為Quartus II內存初始化文件(.mif)格式
flash2dat 為適應Verilog HDL硬件仿真,將.flash可執(zhí)行文件格式轉換為.dat文件格式
mk-nios2-signaltap-mnemonic-table 獲得一個.elf文件和SOPC Builder 系統(tǒng)文件(.ptf),創(chuàng)建一個.stp包含Nios II子令集記憶表和Altera’s SignalTap? II logic分析儀符號的文件
sof2flash 為下載到flash存儲器上,將FPGA配置文件(.sof)轉換為.flash文件

Backward Compatibility Tools
Tool Descriptor
nios2-build 基于傳統(tǒng)SDK庫的編譯和鏈接軟件工程
nios2-run 下載程序到Nios II處理器,終止I/O的變成
nios2-debug 下載程序到Nios II處理器,啟動洞察力的調試器
nios2-console 打開FS2命令行接口(CLI),連接到Nios II處理器,(有選擇地下載代碼)

《淡邏輯設計的學習》

學習邏輯設計首先要有項目掛靠,如果你覺得未來一段時間你都不可能有的話,接下來的內容你就沒有必要再看了,花的時間再多也只能學到皮毛--很多細節(jié)的問題光寫代碼是發(fā)現(xiàn)不到的。而且要真正入門,最好要多做幾個項目(這三年大大小小的項目我做有七八個),總線型的和數字信號處理型的最好都要接觸一些,因為這兩個方向的邏輯設計差異比較大:前者主要是控制型的,會涉及到狀態(tài)機等控制邏輯;后者主要是計算型的,難點主要在對符號、浮點數轉定點數、位寬等方面的處理上。
     
     第二要有好的師父。這里說的好的師父并不是指畫原理圖畫了幾十年的老師傅,而是指曾在專業(yè)IC公司做過一段時間的人,好的專業(yè)IC公司可以接觸國內外最新的設計思想,在他們的幫助下,起點就可以比其他人高不少,更重要的是你可以學習邏輯設計思想性的東西!如果你的師傅經常跟你說畫原理圖的好處,你還是重新找過師父算了--用原理圖設計是一種很落后的方式,即使他們可能會說可以系統(tǒng)級設計(專業(yè)的IC設計公司系統(tǒng)級設計絕對是由方案保證的,而不會靠原理圖這鬼東西)更為清淅。
     
     第三要看一些好的資料。RTL級的書中《Verilog 硬件描述語言》、EDA先鋒寫的那幾本書都還可以,還有不得不提的是cliff的一些paper;驗證方面入門可以看下《Writting Testbenches》, 提高可以看下snug(Synopsys的用戶論壇,里面的文章基本上反映了業(yè)界的領先水平)的paper;系統(tǒng)級的可以看看《片上系統(tǒng)-可重用性設計方法學》。
     
     第四要自己多總結,多動腦筋。邏輯設計的東西其實本質上的東西并不多:把RTL級的常用的D觸發(fā)器、計數器、移位寄存器、狀態(tài)機、多路選擇器等基本的電路標準化、固定化;先做方案再寫代碼;設計時序;知道約束原理及怎么加約束;劃分模塊時知道怎么做到時序收斂;做驗證的時候熟悉相應語言的行為級描述(這個肯定比RTL級好學多了)然后就是理解testbench的結構化設計。把這些東西的本質都搞清楚了做個合格的邏輯工程師應該是綽綽有余了,呵呵。
     
     在接下來的部分我主要就第四點隨便說點自己的經驗,說的不好還請大家批評指正。

入門前
                                            
     剛才開始接觸邏輯設計很多人會覺得很簡單:因為verilog的語法不多,半天就可以把書看完了。但是很快許多人就發(fā)現(xiàn)這個想法是錯誤的,他們經常埋怨綜合器怎么和自己的想法差別這么大:它竟然連用for循環(huán)寫的一個計數器都不認識!
     
     相信上一段的經歷大部分人都曾有,原因是做邏輯設計的思維和做軟件的很不相同,我們需要從電路的角度去考慮問題。
     
     在這個過程中首先要明白的是軟件設計和邏輯設計的不同,并理解什么是硬件意識。
     
     軟件代碼的執(zhí)行是一個順序的過程,編繹以后的機器碼放在存儲器里,等著CPU一條一條的取指并執(zhí)行;因此軟件設計中經常會帶有順序處理的思維。而邏輯設計則不同,我們設計的是數字電路,它是由很多很多的與非門及D觸發(fā)器構成的,上電之后所有與非門和D觸發(fā)器都同時工作,不會因為A觸發(fā)器的代碼描述在B觸發(fā)器之前A觸發(fā)器就是先工作,事實上,RTL級代碼的代碼先后順序在綜合成網表文件后這種順序就消失了,取代的是基本邏輯電路之間的互聯(lián)關系描述;因此邏輯設計需要的是一種并發(fā)的思維,我們也需要用并發(fā)的思維去考慮電路的設計。
     
     當然,我們設計的電路功能一般都有先后順序的關系,如果這種順序不能通過代碼的先后順序來實現(xiàn),那么要怎么完成這一功能呢?在邏輯設計中,我們所說的先后順序都是基于時間軸來實現(xiàn):它的承載體就是時序邏輯,也就是那些觸發(fā)器。
     
     硬件意識的東西網上談論的已經很多,這里就不再多說了。
     
     其次就是要熟悉基本電路的設計。
     
     基本的電路不是很多,也就是D觸發(fā)器、計數器、移位寄存器、狀態(tài)機、多路選擇器、譯碼器等幾種,所有復雜的電路都可由這些基本的電路構成。高手水平高的體現(xiàn)并不是他能寫出一些很奇特的電路,相反,水平高是體現(xiàn)在他們總能將復雜的電路用這些很樸素的基本電路去描述。甚至,你會發(fā)現(xiàn)他們的代碼基本上是由if...else、case這些語句構成的,樸素的讓你覺得奇怪。
     
     我認為,初學者在入門

本站內容除特別聲明的原創(chuàng)文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創(chuàng)文章及圖片等內容無法一一聯(lián)系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。