打印
[Verilog HDL]

VERILOG基础知识

[复制链接]
8746|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaochy1126|  楼主 | 2023-5-29 14:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定点数原码表示

MSB是符号位,0表示正数,1表示负数。

[color=rgba(0, 0, 0, 0.75)]D=(−1)aB−1∑i=0B−2ai2i−B+1�=(−1)��−1∑�=0�−2��2�−�+1


[color=rgba(0, 0, 0, 0.75)]比如,二进制[color=rgba(0, 0, 0, 0.75)]0.110=(−1)0∗(1∗2−1+1∗2−2)=+0.750.110=(−1)0∗(1∗2−1+1∗2−2)=+0.75[color=rgba(0, 0, 0, 0.75)][color=rgba(0, 0, 0, 0.75)]1.110=(−1)1∗(1∗2−1+1∗2−2)=−0.751.110=(−1)1∗(1∗2−1+1∗2−2)=−0.75[color=rgba(0, 0, 0, 0.75)]

反码表示(1’S COMPLEMENT)

正数的反码与原码相同,负数的反码是原码除符号位的所有位取反。

补码表示(2’S COMPLEMENT)

正数的原码、反码、补码相同;负数的补码等于反码加1,负数的原码与补码之间的相互转化关系均为除了符号位取反再加1。

补码的好处在于加减运算不需要判断符号位。B-A=B+(-A),-A的补码是A的补码所有位取反再加1

三种数制之间转换关系

正数原码、反码、补码相同;
负数补码为原码除符号位取反加1;
相反数数补码转换为所有位取反加1.

VERILOG中的常量类型



verilog中常量编译为二进制,均为补码(整数与原码相同,负数为除符号为取反加1)

在verilog中声明端口或者信号时,默认是无符号数,

wire [7:0] number;reg [7:0] number;
  • 1
  • 2

转换为十进制为

[color=rgba(0, 0, 0, 0.75)]D=∑i=0B−1ai2i�=∑�=0�−1��2�


如果需要指定为有符号数,需要特殊声明,则在硬件底层的二进制数均为补码形式

wire signed [7:0] number;reg signed [7:0] number;
  • 1
  • 2

转换为十进制为

[color=rgba(0, 0, 0, 0.75)]D=∑i=0B−1ai2i−2B×aB−1�=∑�=0�−1��2�−2�×��−1


在verilog2001中可以特别地用’s来声明符号数,比如-4表示成一个3bit十六进制数位-3’sh4。[color=rgba(0, 0, 0, 0.75)]
十进制的数永远都是有符号数.

使用特权

评论回复

相关帖子

沙发
gaochy1126|  楼主 | 2023-5-29 14:37 | 只看该作者
比如产生一个三角波,无符号8bit能产生0-255之间的数
module counter(
    clk,
    rst,

    out,
    );

input clk;    //clk
input rst;    //reset, high active

output reg [7:0] out;

reg [7:0] cnt;
reg state;

always @(posedge clk or posedge rst) begin
    if (rst) begin
        cnt <= 0;
        state <= 1'b0;
    end
    else begin
        case(state)
            1'b0: begin
                if(cnt==255) begin
                    cnt <= cnt;
                    state <= 1'b1;
                end
                else begin
                    cnt <= cnt+1;
                    state <= 1'b0;
                end
            end
            1'b1: begin
                 if(cnt==0) begin
                    cnt <= cnt;
                    state <= 1'b0;
                end
                else begin
                    cnt <= cnt-1;
                    state <= 1'b1;
                end
            end
        endcase
    end
end

always @(posedge clk or posedge rst) begin
    if (rst) begin
        out <= 0;    // reset
    end
    else
        out <= cnt;
end

endmodule


使用特权

评论回复
板凳
gaochy1126|  楼主 | 2023-5-29 14:37 | 只看该作者
一个有符号的8bit三角波发生器
module signed_counter(
    clk,
    rst,

    out,
    );

input clk;    //clk
input rst;    //reset, high active

output reg signed [7:0] out;

reg signed [7:0] cnt;
reg state;

always @(posedge clk or posedge rst) begin
    if (rst) begin
        cnt <= -128;
        state <= 1'b0;
    end
    else begin
        case(state)
            1'b0: begin
                if(cnt==127) begin
                    cnt <= cnt;
                    state <= 1'b1;
                end
                else begin
                    cnt <= cnt+1;
                    state <= 1'b0;
                end
            end
            1'b1: begin
                 if(cnt==-128) begin
                    cnt <= cnt;
                    state <= 1'b0;
                end
                else begin
                    cnt <= cnt-1;
                    state <= 1'b1;
                end
            end
        endcase
    end
end

always @(posedge clk or posedge rst) begin
    if (rst) begin
        out <= -128;    // reset
    end
    else
        out <= cnt;
end

endmodule


使用特权

评论回复
地板
gaochy1126|  楼主 | 2023-5-29 14:38 | 只看该作者

可以看到输出是从8’b1000_0001(-8d’127)到8’b0000_0000(8d’127)这样的补码形式变化的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:这个社会混好的两种人:一是有权有势,二是没脸没皮的。

1050

主题

11299

帖子

26

粉丝