【Verilog刷题篇】硬件工程师从0到入门2|组合逻辑

简介: 硬件工程师近年来也开始慢慢吃香,校招进大厂年薪总包不下30-40w的人数一大把!而且大厂人数并没有饱和!

前言


硬件工程师近年来也开始慢慢吃香,校招进大厂年薪总包不下30-40w的人数一大把!而且大厂人数并没有饱和!

- 本期是【Verilog刷题篇】硬件工程师从0到入门1|基础语法入门,有不懂的地方可以评论进行讨论!

推荐给大家一款刷题、面试的神器,我也是用这一款神器进行学习Verilog硬件代码的!

~链接如下:刷题面试神器跳转链接

也欢迎大家去牛客查看硬件工程师招聘职位的各类资料,并进行提前批投递面试!

小白新手可以通过该神器进行日常的刷题、看大厂面经、学习计算机基础知识、与大牛面对面沟通~ 刷题的图片已经放在下面了~

Q1:4位数值比较器电路

问题描述:某4位数值比较器的功能表如下。请用Verilog语言采用门级描述方式,实现此4位数值比较器。

输入描述:input [3:0] A ,input [3:0] B

输出描述:

output wire Y2 , //A>B

output wire Y1 , //A=B

output wire Y0 //A<B


示例代码:

`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
);
    wire [3:0]y2;
    wire [3:0]y1;
    wire [3:0]y0;
    genvar i;
    generate
        for(i=0;i<4;i=i+1)begin:my_lable//使用for进行模块例化
            bit_cmp cmp_1_u(
                .A(A[i]),
                .B(B[i]),
                .Y2(y2[i]),
                .Y1(y1[i]),
                .Y0(y0[i])
            );
        end
    endgenerate
    assign Y2=y2[3] || (y1[3] && y2[2]) || (y1[3] && y1[2] && y2[1]) || (y1[3] && y1[2] && y1[1] && y2[0]);
    assign Y1=y1[3] && y1[2] && y1 [1] && y1[0] ;
    assign Y0=y0[3] || (y1[3] && y0[2]) || (y1[3] && y1[2] && y0[1]) || (y1[3] && y1[2] && y1[1] && y0[0]);
endmodule
module bit_cmp(
    input A,
    input B,
    output Y2,//大于
    output Y1,//等于
    output Y0//小于
);
    //注意这里比较大小的方式,很经典********************************
    assign Y2=A&(!B);//门级表示,不能用大于等于异或同或
    assign Y1=!(Y2|Y0);
    assign Y0=(!A)&B;
endmodule


Q2:4bit超前进位加法器电路

问题描述:


输入描述:

输入信号:
A_in[3:0],
B_in[3:0]
C_1
类型:wire


输出描述:

输出信号:
S[3:0]
CO
类型:wire


示例代码:

`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;
    assign G = A_in & B_in;
    assign P = A_in ^ B_in;
    assign C = G | (P & {C[2:0], C_1});
    assign S = P ^ {C[2:0], C_1};
    assign CO = C[3];
endmodule


Q3:优先编码器电路①

问题描述:

输入描述:input [8:0] I_n

输出描述:output reg [3:0] Y_n


示例代码:

`timescale 1ns/1ns
module encoder_0(
   input      [8:0]         I_n   ,
   output reg [3:0]         Y_n   
);
    always @(*) begin
        casex(I_n)
             9'b 0xxxxxxxx : Y_n=4'b0110;
             9'b 10xxxxxxx : Y_n=4'b0110;
             9'b 110xxxxxx : Y_n=4'b1000;
             9'b 1110xxxxx : Y_n=4'b1001;
             9'b 11110xxxx : Y_n=4'b1010;
             9'b 111110xxx : Y_n=4'b1011;
             9'b 1111110xx : Y_n=4'b1100;
             9'b 11111110x : Y_n=4'b1101;
             9'b 111111110 : Y_n=4'b1110;
             9'b 111111111: Y_n=4'b1111;
            default: Y_n=4'bxxxx;
        endcase
    end  
endmodule


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

问题描述:


输入描述:input [9:0] S_n

输出描述:

output wire[3:0] L ,

output wire GS


示例代码:

`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
);//11_1111_1111  L:0000   GS:0
  //11_1111_1110  L:0000   GS:1
    wire [3:0] L_temp
    encoder_0 encoder(S_n[9:1],L_temp);
    assign L = ~L_temp;
    assign GS = ~((S_n[0])&(&L_temp));
endmodule


Q5:优先编码器Ⅰ

问题描述:

输入描述:

input [7:0] I ,

input EI

输出描述:

output wire [2:0] Y ,

output wire GS ,

output wire EO


示例代码:

`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_reg;
    always@(*)begin
        casex(I)
            8'b1xxx_xxxx:Y_reg = 3'd7;
            8'b01xx_xxxx:Y_reg = 3'd6;
            8'b001x_xxxx:Y_reg = 3'd5;
            8'b0001_xxxx:Y_reg = 3'd4;
            8'b0000_1xxx:Y_reg = 3'd3;
            8'b0000_01xx:Y_reg = 3'd2;
            8'b0000_001x:Y_reg = 3'd1;
            8'b0000_0001:Y_reg = 3'd0;
            8'b0000_0000:Y_reg = 3'd0;
            default:Y_reg = 3'd0;
        endcase
    end
    assign Y = (EI == 1'b1)?Y_reg:3'd0;
    assign GS = ((EI == 1'b1)&&(I != 8'b0000_0000))?1'b1:1'b0;
    assign EO = ((EI == 1'b1)&&(I == 8'b0000_0000))?1'b1:1'b0;
endmodule


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

问题描述:请使用2片该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。

可将优先编码器Ⅰ的代码添加到本题答案中,并例化。

优先编码器Ⅰ的代码如下:

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[5]&~I[4]&I[3] | ~I[5]&~I[4]&I[2]);
assign Y[0] = EI & (I[7] | ~I[6]&I[5] | ~I[6]&~I[4]&I[3] | ~I[6]&~I[4]&~I[2]&I[1]);
assign EO = EI&~I[7]&~I[6]&~I[5]&~I[4]&~I[3]&~I[2]&~I[1]&~I[0];
assign GS = EI&(I[7] | I[6] | I[5] | I[4] | I[3] | I[2] | I[1] | I[0]);
//assign GS = EI&(| I);
endmodule

输入描述:

input [15:0] A ,

input EI

输出描述:

output wire [3:0] L ,

output wire GS ,

output wire EO


示例代码:

`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[5]&~I[4]&I[3] | ~I[5]&~I[4]&I[2]);
assign Y[0] = EI & (I[7] | ~I[6]&I[5] | ~I[6]&~I[4]&I[3] | ~I[6]&~I[4]&~I[2]&I[1]);
assign EO = EI&~I[7]&~I[6]&~I[5]&~I[4]&~I[3]&~I[2]&~I[1]&~I[0];
assign GS = EI&(I[7] | I[6] | I[5] | I[4] | I[3] | I[2] | I[1] | I[0]);
//assign GS = EI&(| I);        
endmodule
module encoder_164(
   input      [15:0]      A   ,
   input                  EI  , 
   output wire [3:0]      L   ,
   output wire            GS  ,
   output wire            EO    
);
    wire E_conect;//定义中间量
    wire [2:0] Y1;
    wire [2:0] Y0;
    wire GS0;wire GS1;
    encoder_83 U0(//低位
        .I(A[7:0]),
        .EI(E_conect),
        .Y(Y0),
        .GS(GS0),
        .EO(EO)
    );
    encoder_83 U1(//高位
        .I(A[15:8]),
        .EI(EI),//因为是从高位开始查找不为零的数,所以EI先给高位芯片
        .Y(Y1),
        .GS(GS1),
        .EO(E_conect)
    );
    assign GS= GS1|| GS0;
    assign L[3]=GS1;
    assign L[2] = Y1[2] | Y0[2];
    assign L[1] = Y1[1] | Y0[1];
    assign L[0] = Y1[0] | Y0[0];
endmodule


总结:小白跟大牛都在用的好平台!


硬件工程师近年来也开始慢慢吃香,校招进大厂年薪总包不下30-40w的人数一大把!而且大厂人数并没有饱和!

- 本期是【Verilog刷题篇】硬件工程师从0到入门1|基础语法入门,有不懂的地方可以评论进行讨论!

快来点击链接进行跳转注册,开始你的保姆级刷题之路吧!刷题打怪码神之路


另外这里不仅仅可以刷题,你想要的这里都会有,十分适合小白和初学者入门学习~

1、算法篇(398题):面试必刷100题、算法入门、面试高频榜单

2、数据结构篇(300题):都是非常经典的链表、树、堆、栈、队列、动态规划等

3、语言篇(500题):C/C++、java、python入门算法练习

4、SQL篇(82题):快速入门、SQL必知必会、SQL进阶挑战、面试真题

5、大厂笔试真题:字节跳动、美团、百度、腾讯…掌握经验不在惧怕面试!


相关文章
|
8月前
|
JavaScript Java 关系型数据库
基于springboot的家政服务预约系统
随着社会节奏加快与老龄化加剧,家政服务需求激增,但传统模式存在信息不对称、服务不规范等问题。基于Spring Boot、Vue、MySQL等技术构建的家政预约系统,实现服务线上化、标准化与智能化,提升用户体验与行业效率,推动家政服务向信息化、规范化发展。
|
安全 网络协议 Shell
渗透测试工具用法技巧入门到进阶
零基础网盘 百度网盘-19****394的分享 新手入门过程 看完 后面有进阶过程 简单工具
551 0
|
人工智能 监控 安全
开源AI守护后厨——餐饮厨房视频安全系统的技术解析
餐饮厨房视频安全系统是一套融合开源AI技术与视频监控的智能化解决方案,涵盖实时检测、行为监测、数据分析、公众透明化及反馈闭环五大模块。系统通过YOLOv8、ResNet等算法实现后厨卫生与操作规范的精准监控,识别率达97%,问题响应时间缩短至秒级。同时支持后厨直播与监管对接,提升消费者信任和管理效率。其灵活开源的特点,为食品行业安全管理提供了高效、透明的新路径,未来可扩展至食品加工等领域。
1214 0
|
监控 数据可视化 安全
Zabbix 主要功能特点
Zabbix 主要功能特点
707 8
|
自然语言处理 测试技术 Serverless
Qwen3开源发布:Think Deeper, Act Faster!社区推理、部署、微调、MCP调用实战教程来啦!
Qwen3开源发布:Think Deeper, Act Faster!社区推理、部署、微调、MCP调用实战教程来啦!
3080 22
|
C语言
计算一个数的 n 次方
【10月更文挑战第23天】计算一个数的 n 次方。
175 3
|
设计模式 网络协议 Java
05.静态代理设计模式
《静态代理设计模式》详细介绍了静态代理的基本概念、原理与实现、应用场景及优缺点。主要内容包括静态代理的由来、定义、使用场景、实现方式、结构图与时序图,以及其在降低耦合、保护对象权限等方面的优势。同时,文章也指出了静态代理的局限性,如缺乏灵活性、难以复用、难以动态添加功能等,并介绍了动态代理如何弥补这些不足。最后,通过多个实际案例和代码示例,帮助读者更好地理解和应用静态代理模式。
227 4
|
Ubuntu 数据安全/隐私保护
蓝易云 - ubuntu设置系统代理
以上就是在Ubuntu系统中设置系统代理的步骤,希望对你有所帮助。
1062 0
|
缓存 安全 Java
【揭秘】String vs StringBuilder vs StringBuffer:三大字符串类的秘密较量!你真的知道何时该用哪个吗?
【8月更文挑战第19天】探讨Java中`String`、`StringBuilder`与`StringBuffer`的区别及应用场景。`String`不可变,适合做哈希表键或多线程共享。`StringBuilder`支持动态修改字符串,适用于单线程环境以提高性能。`StringBuffer`与`StringBuilder`功能相似,但线程安全。示例代码展示各类型的基本用法。选择哪种类型取决于具体需求和性能考量。
291 0