• 【Verilog刷题篇】硬件工程师从0到入门3|组合逻辑复习+时序逻辑入门


    前言

    • 硬件工程师近年来也开始慢慢吃香,校招进大厂年薪总包不下30-40w的人数一大把!而且大厂人数并没有饱和!
      - 本期是【Verilog刷题篇】硬件工程师从0到入门3|组合逻辑复习+时序逻辑入门,有不懂的地方可以评论进行讨论!
    • 推荐给大家一款刷题、面试的神器,我也是用这一款神器进行学习Verilog硬件代码的!
    • ~链接如下:刷题面试神器跳转链接
    • 也欢迎大家去牛客查看硬件工程师招聘职位的各类资料,并进行提前批投递面试!
    • 小白新手可以通过该神器进行日常的刷题、看大厂面经、学习计算机基础知识、与大牛面对面沟通~ 刷题的图片已经放在下面了~

    在这里插入图片描述

    Q1:数据选择器实现逻辑电路

    问题描述:请使用此4选1数据选择器和必要的逻辑门实现下列表达式。
    L=A∙B+A∙~C+B∙C 数据选择器的逻辑符号如下图:
    在这里插入图片描述
    数据选择器代码如下,可在本题答案中添加并例化此数据选择器。

    module data_sel(
       input             S0     ,
       input             S1     ,
       input             D0     ,
       input             D1     ,
       input             D2     ,
       input             D3     ,
       
       output wire        Y    
    );
    
    assign Y = ~S1 & (~S0&D0 | S0&D1) | S1&(~S0&D2 | S0&D3);
         
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    示例输入:
    input A ,
    input B ,
    input C

    示例输出:
    output wire L

    参考代码:

    `timescale 1ns/1ns
    
    module data_sel(
       input             S0     ,
       input             S1     ,
       input             D0     ,
       input             D1     ,
       input             D2     ,
       input             D3     ,
       
       output wire        Y    
    );
    assign Y = ~S1 & (~S0&D0 | S0&D1) | S1&(~S0&D2 | S0&D3);
         
    endmodule
    
    module sel_exp(
       input             A     ,
       input             B     ,
       input             C     ,
       
       output wire       L            
    );
        data_sel m1(C,1'b0,A,B,1'b0,1'b0,L);
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    Q2:根据状态转移表实现时序电路

    问题描述:某同步时序电路转换表如下,请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。
    在这里插入图片描述
    电路的接口如下图所示。
    在这里插入图片描述

    示例输入:
    input A ,
    input clk ,
    input rst_n

    示例输出:
    output wire Y

    参考代码:

    `timescale 1ns/1ns
    
    module seq_circuit(
          input                A   ,
          input                clk ,
          input                rst_n,
     
          output  wire       Y   
    );
        reg[1:0]Q;
        initial Q=2'b00;
        always @(posedge clk or negedge rst_n)
            begin
                if(~rst_n)
                begin
                    Q<=2'b00;
                end
                else 
                begin
                    Q[0]<=~Q[0];
                    Q[1]<=(~A)&(Q[1]^Q[0])|A&(~Q[1]^Q[0]);
                end
            end
        assign Y=Q[1]&Q[0]; 
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    Q3:根据状态转移图实现时序电路

    问题描述:某同步时序电路的状态转换图如下,→上表示“C/Y”,圆圈内为现态,→指向次态。
    请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。
    在这里插入图片描述
    电路的接口如下图所示,C是单bit数据输入端。
    在这里插入图片描述

    示例输入:
    input C ,
    input clk ,
    input rst_n

    示例输出:
    output wire Y

    参考代码:

    `timescale 1ns/1ns
    
    module seq_circuit(
       input                C   ,
       input                clk ,
       input                rst_n,
     
       output   reg        Y   
    );
        parameter [1:0] st0 = 2'b00,
                        st1 = 2'b01,
                        st2 = 2'b10,
                        st3 = 2'b11;
        
        reg [1:0] cst,nst;
        always@(posedge clk or negedge rst_n) begin
            if(!rst_n)begin
                cst <= 2'b00;
                nst <= 2'b00;
            end
            else
                cst <= nst;
        end
        always@(*) begin
                case(cst)
                    st0:begin
                        nst = (C==1) ? st1 : st0; 
                    end
                    st1:begin
                        nst = (C==1) ? st1 : st3; 
                    end
                    st2:begin
                        nst = (C==1) ? st2 : st0; 
                    end
                    st3:begin
                        nst = (C == 1) ? st2 : st3; 
                    end
                    default:
                        nst = st0;
                endcase
        end
        always @(*) begin
            if(((cst == st2) && C) || (cst == st3) )
                Y = 1'b1;
            else
                Y = 1'b0;
        end
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    Q4:ROM的简单实现

    问题描述:实现一个深度为8,位宽为4bit的ROM,数据初始化为0,2,4,6,8,10,12,14。可以通过输入地址addr,输出相应的数据data。

    接口信号图如下:
    在这里插入图片描述

    输入描述:
    clk:系统时钟
    rst_n:异步复位信号,低电平有效
    addr:8bit位宽的无符号数,输入到ROM的地址

    输出描述:
    data:4bit位宽的无符号数,从ROM中读出的数据

    参考代码:

    `timescale 1ns/1ns
    module rom(
    	input clk,
    	input rst_n,
    	input [7:0]addr,
    	
    	output [3:0]data
    );
     
        reg [3:0] romreg[7:0];
        integer i;
        always @ (posedge clk or negedge rst_n)
            begin
                if (~rst_n) begin
                    romreg[0]<=4'd0;
                    romreg[1]<=4'd2;
                    romreg[2]<=4'd4;
                    romreg[3]<=4'd6;
                    romreg[4]<=4'd8;
                    romreg[5]<=4'd10;
                    romreg[6]<=4'd12;
                    romreg[7]<=4'd14;
                end
                else begin
                    for (i=0 ; i<8 ; i=i+1) begin : rom_i
                        romreg[i]<=romreg[i];    //保持不变
                    end
                end
            end
                    
        assign data = romreg[addr];  //异步输出
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    Q5:边沿检测

    问题描述:有一个缓慢变化的1bit信号a,编写一个程序检测a信号的上升沿给出指示信号rise,当a信号出现下降沿时给出指示信号down。
    注:rise,down应为单脉冲信号,在相应边沿出现时的下一个时钟为高,之后恢复到0,一直到再一次出现相应的边沿。
    在这里插入图片描述

    示例输入:
    clk:系统时钟信号
    rst_n:异步复位信号,低电平有效
    a:单比特信号,作为待检测的信号

    示例输出:
    rise:单比特信号,当输入信号a出现上升沿时为1,其余时刻为0
    down:单比特信号,当输入信号a出现下降沿时为1,其余时刻为0

    参考代码:

    `timescale 1ns/1ns
    module edge_detect(
    	input clk,
    	input rst_n,
    	input a,
    	
    	output wire rise,
    	output wire down
    );
        reg a1,a2;
        always@(posedge clk or negedge rst_n)
            begin
                if(!rst_n)
                    begin
                        a1<='b0;
                        a2<='b0;
                    end
                else 
                    begin
                        a1<=a;
                        a2<=a1;
                    end
            end
        assign rise = ((a1 & !a2)===1);
        assign down = ((!a1 & a2)===1);
    
    endmodule
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

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

    • 硬件工程师近年来也开始慢慢吃香,校招进大厂年薪总包不下30-40w的人数一大把!而且大厂人数并没有饱和!
      - 本期是【Verilog刷题篇】硬件工程师从0到入门3|组合逻辑复习+时序逻辑入门,有不懂的地方可以评论进行讨论!

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

    另外这里不仅仅可以刷题,你想要的这里都会有,十分适合小白和初学者入门学习~
    1、算法篇(398题):面试必刷100题、算法入门、面试高频榜单
    2、数据结构篇(300题):都是非常经典的链表、树、堆、栈、队列、动态规划等
    3、语言篇(500题):C/C++、java、python入门算法练习
    4、SQL篇(82题):快速入门、SQL必知必会、SQL进阶挑战、面试真题
    5、大厂笔试真题:字节跳动、美团、百度、腾讯…掌握经验不在惧怕面试!

    在这里插入图片描述

  • 相关阅读:
    ServletConfig、ServletContext概述、配置及ServletContext的三个作用
    国泰君安 191 Alpha 因子的流批一体实现
    开源大模型与闭源大模型那个更好?
    spark任务,使用 repartition 对数据进行了重新分区,但任务输入数据大小仍存在不均衡
    Hbase和Hive整合
    Redis主从复制,哨兵和Cluster集群
    现代图片性能优化及体验优化指南
    Firefly RK3399 PC pro Android 10下载验证
    基于ssm教学评价管理系统获取(java毕业设计)
    uniapp读取和写入文件
  • 原文地址:https://blog.csdn.net/weixin_51484460/article/details/126482589