Verilog 从0到60——数电基础

前言-此页面还在更新

第一次尝试写一个长系列。芯片前端开发是一个非常复杂繁琐的过程,受限于家里没有公司的一整套环境,且没有验证和支持人员的配合,因此虽然工作是ASIC芯片,但在家只能用Quartus进行代码编写和仿真,以及玩一玩FPGA。本文和实际尚有出入,主要是为了帮助自己深化基础功力,同时分享心得。

转载请注明来源并获得我的同意。email: xinb@outlook.it

二进制数

二进制数和16进制数的转换

一般来说,4位二进制数恰好能表示一位16进制数,因此16进制是硬件描述语言中第二常用的进制。16 进制的 f 即为 二进制的1111。转换方法属于基础知识,不在此赘述。

二进制数的编码

这里主要需要掌握二进制数的原码、补码。因为在verilog中有符号数是用补码保存的,同时补码也能非常方便的求负数,如下:neg是pos的负数,true_signed和false_signed展示了有、无符号数的区别。其实,verilog中有符号数和无符号数的区别在于扩位方式不同。

reg signed [3:0] pos,neg;
reg  [10:0] false_signed;
reg [10:0] true_signed;
reg signed [3:0] num_true_signed;
reg [3:0] num_false_signed;
always @(posedge clk or negedge rst_n) begin
    if (!rst_n)begin
      pos <= 4'b0;
      neg <= 4'b0;
      false_signed <= 'b0;
      true_signed <= 'b0;
      num_true_signed <= 'b0;
      num_false_signed <= 'b0;
    end
    else begin
        pos <= 1101; //对其直接赋值二进制,等效pos = -2
        neg <= ~(pos) + 1;
        num_true_signed <= 4'b1101;
        num_false_signed <= 4'b1101;
        true_signed <= num_true_signed;

%title插图%num

逻辑操作

包括逻辑操作按位操作归约操作

逻辑操作

A = 3;
B = 0;
C = 2'b1x ;


A && B    //     为假
A || B    //     为真
! A       //     为假
! B       //     为真
A && C    //     为X,不确定
A || C    //     为真,因为A为真
(A==2) && (! B)  //为真,此时第一个操作数为表达式

按位操作

A = 4'b0101 ;
B = 4'b1001 ;
C = 4'bx010 ;

~A        //4'b1010
A & B     //4'b0001
A | B     //4'b1101
A^B       //4'b1100 异或
A ~^ B    //4'b0011 同或
B | C     //4'b1011
B&C       //4'bx000

规约操作

A = 4'b1010 ;
&A ;      //结果为 1 & 0 & 1 & 0 = 1'b0,可用来判断变量A是否全1
~|A ;     //结果为 ~(1 | 0 | 1 | 0) = 1'b0, 可用来判断变量A是否为全0
^A ;      //结果为 1 ^ 0 ^ 1 ^ 0 = 1'b0
THE END