① crc16校驗的c語言程序
下面我們以CRC-16為例來說明任意長度數據流的CRC校驗碼生成過程。我們採用將數據流分成若干個8bit字元,並由低位元組到高位元組傳送的並行方法來求CRC校驗碼。具體計算過程為:用一個16bit的寄存器來存放CRC校驗值,且設定其初值為0x0000;將數據流的第一個8bit與16bit的CRC寄存器的高位元組相異或,並將結果存入CRC寄存器高位元組;CRC寄存器左移一位,最低1bit補零,同時檢查移出的最高1bit,若移出的最高1bit為0,則繼續按上述過程左移,若最高1bit為1,則將CRC寄存器中的值與生成多項式碼相異或,結果存入CRC寄存器值;繼續左移並重復上述處理方法,直到將8bit數據處理完為止,則此時CRC寄存器中的值就是第一個8bit數據對應的CRC校驗碼;然後將此時CRC寄存器的值作為初值,用同樣的處理方法重復上述步驟來處理下一個8bit數據流,直到將所有的8bit字元都處理完後,此刻CRC寄存器中的值即為整個數據流對應的CRC校驗碼。
下面示出了其計算過程的流程圖:
在用C語言編寫CRC校驗碼的實現程序時我們應該注意,生成多項式 對應的十六進制數為0x18005,由於CRC寄存器左移過程中,移出的最高位為1時與 相異或,所以與16bit的CRC寄存器對應的生成多項式的十六進制數可用0x8005表示。下面給出並行處理8bit數據流的C源程序:
unsigned short crc_dsp(unsigned short reg, unsigned char data_crc)
//reg為crc寄存器, data_crc為將要處理的8bit數據流
{
unsigned short msb; //crc寄存器將移出的最高1bit
unsigned short data;
unsigned short gx = 0x8005, i = 0; //i為左移次數, gx為生成多項式
data = (unsigned short)data_crc;
data = data << 8;
reg = reg ^ data;
do
{
msb = reg & 0x8000;
reg = reg << 1;
if(msb == 0x8000)
{
reg = reg ^ gx;
}
i++;
}
while(i < 8);
return (reg);
}
以上為處理每一個8bit數據流的子程序,在計算整個數據流的CRC校驗碼時,我們只需將CRC_reg的初值置為0x0000,求第一個8bit的CRC值,之後,即可將上次求得的CRC值和本次將要處理的8bit數據作為函數實參傳遞給上述子程序的形參進行處理即可,最終返回的reg值便是我們所想得到的整個數據流的CRC校驗值。
② keil4 同樣的源程序, 每次編譯生成的hex文件crc校驗碼都不一樣,為什麼如何使生成的hex文件校驗碼一樣
這個沒什麼奇怪的,編譯後的Hex文件和CRC校驗碼一定是不一察茄謹樣的,因為編譯器在編譯的時候,會自動插入一些隨機數,進行冗餘計算,這個是為了保密的需要,試想,如果一個編譯器不進行保密的冗餘計算,那麼,稍微有點知識的人,就可以很容易的從HEX文件反推回匯編語言,這樣的編譯器,哪個廠家敢用?自己辛苦寫的軟體,很容易的就被人盜版了。
所以,敗基這個是沒有辦法的事納答情。
③ 有關ISE使用Verilog編程時的問題
我的工程也全是黃色感嘆號,做的大了在所難免的。。比如有時候你做個計數器,給的位寬比用到的計數值大了,高幾位用不到,他就會提示你這沒用到的給你綜合掉了,稍微看下,不影響的就無所謂了。。。
如果是做自動售貨機這種的,不妨用時序邏輯來編,比這種組合邏輯做起來簡單還省心,而且效果一樣的。。。真值表什麼的算起來多麻煩 @_@
你的那些ibuf是怎麼產生的,除了貼出來的程序有沒有在別的地方用ibuf原語。。如果沒有的話額也不清楚了,沒在FPGA里用過D觸發器,是D觸發器的內部產生的信號么。。。
④ 在ise中,當編寫好某一元件的代碼後,怎麼生成原理圖
直接用vhdl寫吧,原理圖做大型邏輯工程的話還是勉強一些的