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的仿真结果:

出现的问题:为什么昨天功能仿真是对的,而今天时序仿真得到的商却是零?

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注