牛客网verilog题解(快速入门—组合逻辑)

VL11 4位数值比较器电路
一位比较器逻辑式(列真值表推出)

F3(A>B)=AB'
F3(A<B)=A'B
F3(A=B)=AB+A'B'
二位
F2(A>B)=A2B2'+(A2B2+A2'B2')F3(A>B)
F2(A<B)=A2'B2+(A2B2+A2'B2')F3(A<B)
F2(A=B)=(A2B2+A2'B2')F3(A=B)
三位
F1(A>B)=A1B1'+(A1B1+A1'B1')F2(A>B)
F1(A<B)=A1‘B1+(A1B1+A1'B1')F2(A<B)
F1(A=B)=(A1B1+A1'B1')F2(A=B)

代码表达式就是

Y2=A[3]·~B[3]+(A[3]⊙B[3]) ·A[2] ·~B[2]+ (A[3]⊙B[3]) ·(A[2]⊙B[2]) ·A[1] ·~B[1]+ (A[3]⊙B[3]) · (A[2]⊙B[2]) · (A[1]⊙B[1]) · A[0] ·~B[0];

Y0=~A[3] ·B[3]+(A[3]⊙B[3]) ·~A[2] ·B[2]+ (A[3]⊙B[3]) ·(A[2]⊙B[2]) ·~A[1] ·B[1]+ (A[3]⊙B[3]) · (A[2]⊙B[2]) · (A[1]⊙B[1]) ·~A[0] ·B[0];

Y1=(A[3]⊙B[3]) ·(A[2]⊙B[2]) · (A[1]⊙B[1]) · (A[0]⊙B[0])

各种门的代码:

//类型 实例名     输出   输入
   and  a1      (OUTX,  IN1, IN2) ;            //与门
   nand na1     (OUTX1, IN1, IN2) ;            //与非门
   or   or1     (OUTY,  IN1, IN2) ;            //或门
   nor  nor1    (OUTY1, IN1, IN2) ;            //或非门
   xor xor1     (OUTZ,  IN1, IN2, IN3) ;       //异或门
   xnor         (OUTZ1, IN1, IN2) ;            //同或门
   not          (OUTZ3, IN3) ;                 //非门

然后我选择相信科技的力量,开摆!

`timescale 1ns/1ns

module comparator_4(
	input		[3:0]       A   	,
	input	   [3:0]		B   	,
 
 	output	 wire		Y2    , //A>B
	output   wire        Y1    , //A=B
    output   wire        Y0      //A<B
);
    assign Y2 = (A>B) ? 1:0;
    assign Y1 = (A==B)? 1:0;
    assign Y0 = (A<B) ? 1:0;
endmodule

VL12 4bit超前进位加法器电路
我对超前进位加法器的理解是:同时进行每一位的无前置工作的加法运算,只考虑前置位的进位和当前位的加法而不考虑对下一位的进位

`timescale 1ns/1ns

module lca_4(
	input		[3:0]       A_in  ,
	input	    [3:0]		B_in  ,
    input                   C_1   ,
 
 	output	 wire			CO    ,
	output   wire [3:0]	    S
);
    wire [3:0] G;
    wire [3:0] P;
    wire [3:0] C;
    genvar i;
    generate
        for(i=0;i<4;i=i+1) begin
            assign G[i] = A_in[i] & B_in[i];
            assign P[i] = A_in[i] ^ B_in[i];
            if(i == 0) begin
                assign C[i] = G[i] | (P[i] & C_1);
                assign S[i] = P[i] ^ C_1;
            end else begin
                assign C[i] = G[i] | (P[i] & C[i-1]);
                assign S[i] = P[i] ^ C[i-1];
            end
        end
    endgenerate
            assign CO = C[3];
endmodule

VL13 优先编码器电路①
Verilog语言中case、casex、casez的用法和区别
case是全等匹配,casez忽略?或z对应的位进行匹配,casez忽略x、?或z对应的位进行匹配。

`timescale 1ns/1ns
module encoder_0(
   input      [8:0]         I_n   ,
   
   output reg [3:0]         Y_n   
);
always@(*) begin
        casez (I_n)
            9'b111111111 : Y_n = 4'b1111;
            9'b0???????? : Y_n = 4'b0110;
            9'b10??????? : Y_n = 4'b0111;
            9'b110?????? : Y_n = 4'b1000;
            9'b1110????? : Y_n = 4'b1001;
            9'b11110???? : Y_n = 4'b1010;
            9'b111110??? : Y_n = 4'b1011;
            9'b1111110?? : Y_n = 4'b1100;
            9'b11111110? : Y_n = 4'b1101;
            9'b111111110 : Y_n = 4'b1110;
            default : Y_n = 4'b1111;
        endcase
    end
endmodule

VL14 用优先编码器①实现键盘编码电路
注意取反,区分没有按键按下和按键0按下

`timescale 1ns/1ns
module encoder_0(
   input      [8:0]         I_n   ,
    
   output reg [3:0]         Y_n  
);
 
always @(*)begin
   casex(I_n)
      9'b111111111 : Y_n = 4'b1111;
      9'b0xxxxxxxx : Y_n = 4'b0110;
      9'b10xxxxxxx : Y_n = 4'b0111;
      9'b110xxxxxx : Y_n = 4'b1000;
      9'b1110xxxxx : Y_n = 4'b1001;
      9'b11110xxxx : Y_n = 4'b1010;
      9'b111110xxx : Y_n = 4'b1011;
      9'b1111110xx : Y_n = 4'b1100;
      9'b11111110x : Y_n = 4'b1101;
      9'b111111110 : Y_n = 4'b1110;
      default      : Y_n = 4'b1111;
   endcase   
end
      
endmodule
 
module key_encoder(
      input      [9:0]         S_n   ,        
  
      output wire[3:0]         L     ,
      output wire              GS
);
    wire [3:0] L_temp;
     
    encoder_0 encoder (S_n[9:1], L_temp);
     
    assign GS = ~((&(~L)) & S_n[0]);
     
    assign L = ~L_temp;
         
endmodule

VL15 优先编码器Ⅰ
和13题一样

`timescale 1ns/1ns

module encoder_83(
   input      [7:0]       I   ,
   input                  EI  ,
   
   output wire [2:0]      Y   ,
   output wire            GS  ,
   output wire            EO    
);
    reg [2:0] Y_1;
    reg GS_1,EO_1;
    
    always@(*) begin
        casez({EI,I})
            9'b0???????? : {Y_1,GS_1,EO_1} = 5'b00000;
            9'b100000000 : {Y_1,GS_1,EO_1} = 5'b00001;
            9'b11??????? : {Y_1,GS_1,EO_1} = 5'b11110;
            9'b101?????? : {Y_1,GS_1,EO_1} = 5'b11010;
            9'b1001????? : {Y_1,GS_1,EO_1} = 5'b10110;
            9'b10001???? : {Y_1,GS_1,EO_1} = 5'b10010;
            9'b100001??? : {Y_1,GS_1,EO_1} = 5'b01110;
            9'b1000001?? : {Y_1,GS_1,EO_1} = 5'b01010;
            9'b10000001? : {Y_1,GS_1,EO_1} = 5'b00110;
            9'b100000001 : {Y_1,GS_1,EO_1} = 5'b00010;
            default        {Y_1,GS_1,EO_1} = 5'b00000;
        endcase
    end
    
    assign Y = Y_1;
    assign GS = GS_1;
    assign EO = EO_1;
            
    
endmodule

16-20题都是数电知识,照书连线就行,咕了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值