设为首页 加入收藏

TOP

【牛客】2 组合逻辑(一)
2023-07-23 13:25:08 】 浏览:111
Tags:牛客

VL11 4位数值比较器电路

根据题目真值表把情况全部列出来,纯体力活。

`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[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]);

assign Y1 = (~A[3]^B[3])&&(~A[2]^B[2])&&(~A[1]^B[1])&&(~A[0]^B[0]);

assign 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]));

endmodule

VL12 4bit超前进位加法器电路

最直接的方法:把题目给的公式直接翻译成Verilog。

`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 [2:0]C;

assign G = A_in & B_in;
assign P = A_in ^ B_in;
assign S = P ^ {C,C_1};
assign {CO,C} = G | (P&{C,C_1});
endmodule

VL13 优先编码器电路①

注意I1~I9的顺序。

`timescale 1ns/1ns

module encoder_0(
   input      [8:0]         I_n   ,
   
   output reg [3:0]         Y_n   
);
always@(*)
begin
    casex(I_n)
    9'b111_111_111:Y_n=4'b1111;
    9'b0xx_xxx_xxx:Y_n=4'b0110;
    9'b10x_xxx_xxx:Y_n=4'b0111;
    9'b110_xxx_xxx:Y_n=4'b1000;
    9'b111_0xx_xxx:Y_n=4'b1001;
    9'b111_10x_xxx:Y_n=4'b1010;
    9'b111_110_xxx:Y_n=4'b1011;
    9'b111_111_0xx:Y_n=4'b1100;
    9'b111_111_10x:Y_n=4'b1101;
    9'b111_111_110:Y_n=4'b1110;
    default:Y_n=0;
    endcase
end

endmodule

VL14 用优先编码器①实现键盘编码电路

将9-4编码器拓展成10-4编码器。因为高位优先级更高,所以高9位直接输入优先编码器,最低位等于0且其余位全部为1时,输出为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]Y;
encoder_0 u0(
    .I_n(S_n[9:1]),
    .Y_n(Y)
);
assign GS = !(Y==4'b1111&&S_n[0]);
assign L = (~S_n[0]&&Y==4'b1111)?0:~Y;

endmodule

VL15 优先编码器Ⅰ

也是纯体力活。。。

`timescale 1ns/1ns

module encoder_83(
   input      [7:0]       I   ,
   input                  EI  ,
   
   output wire [2:0]      Y   ,
   output wire            GS  ,
   output wire            EO    
);
assign Y[2] = EI & (I[7] | I[6] | I[5] | I[4]);
assign Y[1] = EI & (I[7] | I[6] | (~I[7]&~I[6]&~I[5]&~I[4]&I[3])|(~I[7]&~I[6]&~I[5]&~I[4]&~I[3]&I[2]));
assign Y[0] = EI & (I[7] |(~I[7]&~I[6]&I[5])|(~I[7]&~I[6]&~I[5]&~I[4]&I[3])|(~I[7]&~I[6]&~I[5]&~I[4]&~I[3]&~I[2]&I[1]));
assign GS = ~((~EI)|(I==0));
assign EO = (I==0);
endmodule

VL16 使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器

这题有点意思,数电里其实学过,但是有点不太记得了。

分析可知:高位优先级更高,所以当高位有效时,低位肯定是全0,所以此时需要关断低位使能,也就是把高位编码器的EO接到低位编码器的EI。

不难看出GS代表编码器正常工作,所以可以把两个编码器的GS相或输出。

高位正常工作时,最高位为1,与此编码器输出一致,所以可以把高位编码器的GS作为最高位。

低位时两个编码器输出相或,因为两个都是8位编码器,高八位有效时也只是最高位为1,其他位行为与低位一致。

`timescale 1ns/1ns
module
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【牛客】3 时序逻辑 下一篇【牛客】4 序列检测&时序逻辑

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目