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

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


示例输入:

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


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


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


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


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


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


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

- 本期是【Verilog刷题篇】硬件工程师从0到入门3|组合逻辑复习+时序逻辑入门,有不懂的地方可以评论进行讨论!

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


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

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

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

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

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

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




相关文章
|
存储 开发工具 异构计算
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑(下)
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑
904 0
第三章 硬件描述语言verilog(二) 功能描述-组合逻辑(下)
|
1月前
|
人工智能 数据挖掘 程序员
探索编程的奥秘:从逻辑到实践
在这篇文章中,我将分享我的技术感悟,特别是关于编程的学习与实践。通过通俗易懂的语言和条理清晰的结构,希望能启发编程新手,帮助他们理解编程的本质,并激发他们进一步探索的兴趣。
【期末不挂科-单片机考前速过系列P7】(第七章:11题速过串行口基本概念/结构/工作方式/双机通信例题)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P7】(第七章:11题速过串行口基本概念/结构/工作方式/双机通信例题)经典例题盘点(带图解析)
|
4月前
|
存储 关系型数据库 Java
LDO产品的基础知识解析
低压降稳压器 (LDO)是一种用于调节较高电压输入产生的输出电压的简单方法。在大多数情况下,低压降稳压器都易于设计和使用。然而,如今的现代应用都包括各种各样的模拟和数字系统,而有些系统和工作条件将决定哪种LDO最适合相关电路,因此,现在我们需要关注这些决定性因素。 压降电压VDO,是指为实现正常稳压,输入电压VIN必须高出所需输出电压VOUT(nom) 的最小压差。 如果 VIN 低于此值,线性稳压器将以压降状态工作,不再调节所需的输出电压。在这种情况下,输出电压 VOUT(dropout)将等于 VIN 减去压降电压的值 以调节后电压为 3.3V 的 TPS799 等 LDO 为例:当
|
6月前
|
存储 自然语言处理 编译器
<大厂面试高频考点>程序环境和预处理
<大厂面试高频考点>程序环境和预处理
44 1
【期末不挂科-单片机考前速过系列P5】(第五章:11题速过中断系统和中断系统结构)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P5】(第五章:11题速过中断系统和中断系统结构)经典例题盘点(带图解析)
|
6月前
|
C++ 内存技术
【期末不挂科-单片机考前速过系列P8】(第八章:21题速过AT89S51单片机的内部硬件结构)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P8】(第八章:21题速过AT89S51单片机的内部硬件结构)经典例题盘点(带图解析)
|
芯片 异构计算
第三章 硬件描述语言verilog(三)功能描述-时序逻辑
第三章 硬件描述语言verilog(三)功能描述-时序逻辑
266 0
第三章 硬件描述语言verilog(三)功能描述-时序逻辑
|
存储 算法 Linux
Linux驱动面试高频考点
Linux驱动面试高频考点
|
存储 程序员 开发工具
第三章 硬件描述语言verilog(一)
第三章 硬件描述语言verilog(一)
423 0
第三章 硬件描述语言verilog(一)