原文:
在verilog中,乙個簡單的的運算 "f <= d + e;" ,但是當d,e,f的長度不同時,verilog是如何綜合實現的呢?
為了實驗,d,e採用3bit長度,f的長度根據不同的實驗場景重新確定。「+」、「-」、「>>」這三種運算應該是都符合同一種規則,下面實驗更多的是利用「>>」操作來驗證這種規則。
整體**如下:
`timescale 1ns/1ns
module test();
reg[2:0] d = 3'b100;
reg[2:0] e = 3'b100;
reg[3:0] f;
initial begin
//f <= d + e;
//f <= ((d + e) >> 3);
//f <= (2'b00 & 3'b000) + ((d + e)>>3);
//f <= 3'b000 + ((d + e)>>3);
//f <= 4'b0000 + ((d + e)>>3);
f <= (2'b00 & 4'b0000) + ((d + e)>>3);
$strobe("f:%b",f);
#5 $finish;
endendmodule
實驗一 (d,e,f均為3bit)
step1:(普通"+")
**更改:
同上結果:
f: 000
說明:這個結果是顯而易見的,並沒有得到預期正確的結果
右端 d + e,本身兩個都是3bit,因此運算就是在3bit上進行,結果不會超出3bit
左端 f 也為3bit,結果只取後3bit
step2:(移位情況)
**更改:
f <= ((d + e) >> 3);
結果:f: 000
說明:該結果與上一步結果相符,仍是在3bit上運算,因此右移3位,還是0
step3:(移位情況+額外位操作(3-bit))
**更改:
f <= (2'b00 & 3'b000) + ((d + e)>>3); //或改為 f <= 3'b000 + ((d + e)>>3);
結果:f: 000
說明:並沒有獲得想要的結果
因為這兩種更改,雖然加入了額外的位操作,但是額外的位操作仍在3bit上進行,因此整體仍然在3bit上進行運算
step4:(移位情況+額外位操作(4-bit))
**更改:
f <= (2'b00 & 4'b0000) + ((d + e)>>3); //或改為 f <= 4'b0000 + ((d + e)>>3);
結果:f: 001
說明:獲得了想要的結果
這兩種更改,加入了4-bit的位操作,將右端改為了在4位上的運算
因為 f 還是定義為3bit,所以取後3bit,結果為001
實驗二 (d,e為3bit,f為4bit)
step1:(普通"+")
**更改:
reg[3:0] f;//將f的長度改為4bit f <= d + e;
結果:f: 1000
說明:得到了正確的結果
雖然右端 d + e,本身兩個都是3bit,但因為 f 是4bit,因此運算就是在4bit上進行,獲得正確的結果
step2:(移位情況)
**更改:
f <= ((d + e) >> 3); f <= 3'b000 + ((d + e)>>3); f <= (2'b00 & 4'b0000) + ((d + e)>>3);
結果:f: 0001
說明:
不同長度的字串的大小比較
今天好不容易做個pta上的題,真是太久沒有寫 了,連最基本的字串比較都忘得一乾二淨了,真是丟人.1 只有數字的情況 這就是今天讓我懷疑人生的情況 當兩個純數字的字串比較時,是乙個乙個數字的ascii碼比過去的,一旦發生不相等的情況,便停止未完成的後面的對比,而直接給出結果 除非所有的數字的碼值都樣大...
演算法導論 8 3 排序不同長度的資料項
分類 演算法導論 2012 06 23 15 14 298人閱讀收藏 舉報演算法 delete stringc測試 ie 目錄 a 給定乙個整數陣列,其中不同的整數中包含的數字個數可能不同,但是該陣列中,所有整數中總的數字數為n。說明如何在o n 時間內對該陣列進行排序 b 給定乙個字串陣列,其中不...
演算法導論習題8 3 排序不同長度的資料項
題目 a 給定乙個整數陣列,其中不同的整數中包含的數字個數可能不同,但是該陣列中,所有整數中總的數字數為n。說明如何在o n 時間內對該陣列進行排序 b 給定乙個字串陣列,其中不同的串包含的字元個數可能不同,但所有串中總的字元個數為n。說明如何在o n 時間內對該陣列進行排序 注意此處的順序是指標準...