verilog中有符號整數說明及除法實現


  1、以8位短整數為例,短整數的最高位是符號位,符號位的正負表示了該值是“正還是負”?。正值的表示方法是以0開始的8位二進制數,反之負值的表示方法是用正數的補碼來表示。例如:+127 亦即8'b0111_1111;那么-127 亦即8'b1000_0001(通過相應正數的按位取反加1得到,符號位也要取反);

  2、正值可以進行求反又加一之后成為負值。那么負值如何變成正值?同樣的一個道理“負值求反又加一后,成為正值”。

  3、我們知道短整數的位寬為,8 ,亦即取值范圍是0~255。但是符號位的出現吃掉了最高位,所以造成取值范圍變成2^7=128,即0到127。

  4、在Modelsim中顯示數據時,數據格式Decimal表示有符號數(-128~+127),Unsigned表示無符號數(0~255)(二者最終都是整數方式顯示)。也即:Modelsim只能對最終結果實現轉化,在數據處理過程中則需要人為編程實現正數或者負數。

 

除法實現及仿真:

 1 module divider(Reset,Clock,Start_sig,Done_sig,A,B,C,D);
 2 
 3 input Reset,Clock,Start_sig;
 4 output Done_sig;
 5 input [7:0] A,B;
 6 output [7:0] C,D;
 7 
 8 reg [7:0] A_temp,B_temp,C,D;
 9 reg Symbol,Done_sig;
10 reg [2:0] i;
11 
12 always@(posedge Clock or negedge Reset)
13 begin
14     if(!Reset)
15     begin
16         C<=8'b0;
17         D<=8'b0;
18         i<=3'b0;
19         Done_sig<=1'b0;
20     end
21     else if(Start_sig)
22     case(i) 
23         0:begin
24             Symbol<=A[7]^B[7];
25             A_temp<=A[7]?(~A+8'b1):A;
26             B_temp<=B[7]?B:(~B+8'b1);
27             i<=i+1'b1;
28           end
29         1:begin
30             if(A_temp<(~B_temp+8'b1)) begin D<=A_temp;i<=i+1'b1;C<=Symbol?(~C+1'b1):C;end
31             else begin A_temp<=A_temp+B_temp;C<=C+8'b1;end
32           end
33         2:begin
34             Done_sig<=1'b1;i<=i+1'b1;
35           end
36         3:begin
37             Done_sig<=1'b0;i<=1'b0;
38           end
39     endcase
40 end 
41 
42 endmodule 
divider.v
 1 `timescale 1ns/1ps
 2 module divider_tb();
 3 reg Reset,Clock,Start_sig;
 4 reg [7:0] A,B;
 5 wire Done_sig;
 6 wire [7:0] C,D;
 7 
 8 divider U(
 9 .Reset(Reset),
10 .Clock(Clock),
11 .Start_sig(Start_sig),
12 .A(A),
13 .B(B),
14 .C(C),
15 .D(D),
16 .Done_sig(Done_sig));
17 
18 initial
19 begin
20 Reset=0;#10 Reset=1;
21 Clock=0;forever #10 Clock=~Clock;
22 end
23 
24 
25 always@(posedge Clock or negedge Reset)
26 if(!Reset)
27 begin
28     A<=8'b0;
29     B<=8'b0;
30     Start_sig<=1'b0;
31 end
32 else
33     if(Done_sig)
34     
35     Start_sig<=1'b0;
36 
37     else 
38     begin 
39     A<=8'b00110110;
40     B<=8'b11111001;
41     Start_sig<=1'b1;
42     end
43     
44 endmodule
divider_tb.v

Q9.0,M6.4a的仿真結果:

 

出現的問題:為什么昨天功能仿真是對的,而今天時序仿真得到的商卻是零?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM