第三章练习题

1.题目:用循环语句设计一个逻辑电路模块,用以统计一个8位二进制数(8bit并行输入)中含1的数量

module for_cnt_1(a,b);
    input [8:1] a;//定义输入8位二进制数
    output [4:1] b;//定义求和输出变量,因最多8个1相加,故要求四位位宽
    reg [8:1] c;//输入信号的中间变量
    reg [4:1] b,r;//求和中间变量
    integer i;//for循环变量
    
    always @(a)//敏感信号a,当a发生变化,进入模块
        begin
            c=a;
            r=0;
            for(i=1;i<=8;i=i+1)
                begin 
                    if(c[1])//判断最低位为1则求和
                        r=r+1;
                     c=c>>1;//右移一位
                end
            b=r
        end
endmodule

2.题目:给出1位全减器的Verilog描述;最终实现8位全减器。

要求:首先设计1位半减器,然后用例化语句将其连接起来构成1位全减器

(1)1位半减器

真值表

x y diff=\(\mid\) x-y\(\mid\)(差值输出) s_out=1,x<y(借位输出)
0 0 0 0
0 1 1 1
1 0 1 0
1 1 0 0

assign语句实现

module s_diff(x,y,diff,sout);
    input x,y;
    output diff,sout;
    
    assign diff=x^y;//异或操作
    assign sout=(~x)&y;
endmodule

case语句实现

module s_diff(x,y,diff,sout);
    input x,y;
    output diff,sout;
    reg diff,sout;
    
    always@(x,y)
        case({x,y})//并位操作,下抄真值表
            2'b00: diff=0,sout=0;end
            2'b01: diff=1,sout=1;end
            2'b10: diff=1,sout=0;end
            2'b11: diff=0,sout=0;end
        endcase
endmodule

(2)1位全减器(由两个1位半减器级联构成)

module f_suber(xin,yin,sub_in,sub_out,diff);
    input xin,yin,sub_in;
    output diff_out,sub_out;
    wire a,b,c;
    
    h_suber u1(.x(xin),.y(yin),.diff(a),.s_out(b));//
    h_suber u2(.x(a),.y(sub_in),.diff(diff_out),.s_out(c));
    assign sub_out =c|b;

endmodule

(3)8位串行全减器(由8个1位全减器级联构成)

module suber_8(x,y,sin,diff,sout);
    input [7:0] x;
    input [7:0] y;
    input sin;
    output [7:0] diff;
    output sout;
    wire [6:0] a;
    
    f_suber u0(.xin(x[0]),.yin(y[0]),.diff_out(diff[0]),.sub_in(sin),.sub_out(a[0]),);
    f_suber u1(.xin(x[1]),.yin(y[1]),.diff_out(diff[1]),.sub_in(a[0]),.sub_out(a[1]),);
    f_suber u2(.xin(x[2]),.yin(y[2]),.diff_out(diff[2]),.sub_in(a[1]),.sub_out(a[2]),);
    f_suber u3(.xin(x[3]),.yin(y[3]),.diff_out(diff[3]),.sub_in(a[2]),.sub_out(a[3]),);
    f_suber u4(.xin(x[4]),.yin(y[4]),.diff_out(diff[4]),.sub_in(a[3]),.sub_out(a[4]),);
    f_suber u5(.xin(x[5]),.yin(y[5]),.diff_out(diff[5]),.sub_in(a[4]),.sub_out(a[5]),);
    f_suber u6(.xin(x[6]),.yin(y[6]),.diff_out(diff[6]),.sub_in(a[5]),.sub_out(a[6]),);
    f_suber u7(.xin(x[7]),.yin(y[7]),.diff_out(diff[7]),.sub_in(a[6]),.sub_out(a[7]),);     
endmodule
//每一位x,y输入一位全减器,构成并联输入,借位从第一位传递到第八位构成串联结构,输出为八位diff差值
posted @ 2022-06-07 21:01  JsDakey  阅读(435)  评论(0)    收藏  举报