FPGA硬件工程师Verilog面试题(基础篇二)

✅作者简介:大家好我是:嵌入式基地,是一名嵌入式工程师,希望一起努力,一起进步!
📃个人主页:嵌入式基地
🔥系列专栏:FPGA Verilog 习题专栏
微信公众号:嵌入式基地

习题一:多功能数据处理器

  • 点击进行在线练习
    描述

  • 根据指示信号select的不同,对输入信号a,b实现不同的运算。输入信号a,b为8bit有符号数,当select信号为0,输出a;当select信号为1,输出b;当select信号为2,输出a+b;当select信号为3,输出a-b.

  • 信号示意图:

  • 使用Verilog HDL实现以上功能并编写testbench验证。

输入描述

  • clk:系统时钟
  • rst_n:复位信号,低电平有效
  • a,b:8bit位宽的有符号数
  • select:2bit位宽的无符号数

输出描述

  • c:9bit位宽的有符号数

代码实现

`timescale 1ns/1ns
module data_select(
	input clk,
	input rst_n,
	input signed[7:0]a,
	input signed[7:0]b,
	input [1:0]select,
	output reg signed [8:0]c
);
	  
always @(posedge clk or negedge rst_n)
	if(!rst_n)
		c <= 9'd0;
	else case(select)
	2'b00:	c <= a;
	2'b01:	c <= b;
	2'b10:	c <= a+b;
	2'b11:	c <= a-b;
	default: c <= 9'd0;
	endcase
endmodule

习题二:求两个数的差值

  • 点击进行在线练习
    描述

  • 根据输入信号a,b的大小关系,求解两个数的差值:输入信号a,b为8bit位宽的无符号数。如果a>b,则输出a-b,如果a≤b,则输出b-a。

  • 接口信号示意图:

输入描述

  • clk:系统时钟
  • rst_n:复位信号,低电平有效
  • a,b:8bit位宽的无符号数

输出描述

  • c:8bit位宽的无符号数

代码实现

`timescale 1ns/1ns
module data_minus(
	input clk,
	input rst_n,
	input [7:0]a,
	input [7:0]b,

	output  reg [8:0]c
);
    
always @ (posedge clk&nbs***bsp;negedge rst_n)
begin
    if( ~rst_n ) begin
        c <= 8'b0;
    end 
    else begin
        if( a > b ) begin
            c <= a - b;
        end 
        else begin
            c <= b - a;
        end 
    end 
end    
    
endmodule

习题三:使用generate…for语句简化代码

  • 点击进行在线练习
    描述
  • 在某个module中包含了很多相似的连续赋值语句,请使用generata…for语句编写代码,替代该语句,要求不能改变原module的功能。
  • 使用Verilog HDL实现以上功能并编写testbench验证。

module template_module(
input [7:0] data_in,
output [7:0] data_out );
assign data_out [0] = data_in [7];
assign data_out [1] = data_in [6];
assign data_out [2] = data_in [5];
assign data_out [3] = data_in [4];
assign data_out [4] = data_in [3];
assign data_out [5] = data_in [2];
assign data_out [6] = data_in [1];
assign data_out [7] = data_in [0];
endmodule

输入描述

  • data_in:8bit位宽的无符号数

输出描述

  • data_out:8bit位宽的无符号数

代码实现

`timescale 1ns/1ns
module gen_for_module( 
    input [7:0] data_in,
    output [7:0] data_out
);
    genvar i;
    generate
        for(i = 0; i < 8; i = i + 1) 
		begin : bit_reverse
            assign data_out[i] = data_in[7 - i];
        end
        
    endgenerate
 
endmodule

习题四:使用子模块实现三输入数的大小比较

  • 点击进行在线练习
    描述

  • 在数字芯片设计中,通常把完成特定功能且相对独立的代码编写成子模块,在需要的时候再在主模块中例化使用,以提高代码的可复用性和设计的层次性,方便后续的修改。

  • 请编写一个子模块,将输入两个8bit位宽的变量data_a,data_b,并输出data_a,data_b之中较小的数。并在主模块中例化,实现输出三个8bit输入信号的最小值的功能。

  • 子模块的信号接口图如下:

  • 主模块的信号接口图如下:

  • 使用Verilog HDL实现以上功能并编写testbench验证。

输入描述

  • clk:系统时钟
  • rst_n:异步复位信号,低电平有效
  • a,b,c:8bit位宽的无符号数

输出描述

  • d:8bit位宽的无符号数,表示a,b,c中的最小值

代码实现

timescale 1ns/1ns
module main_mod(
	input clk,
	input rst_n,
	input [7:0]a,
	input [7:0]b,
	input [7:0]c,
	
	output [7:0]d
);

    wire [7:0] min_ab;
    wire [7:0] min_ac;
    wire [7:0] min_abc;
    
    sub_mod sub_mod_U0(
        .clk      (clk),
        .rst_n    (rst_n),
        .a        (a),
        .b        (b),
        
        .c        (min_ab)
    );
    
    sub_mod sub_mod_U1(
        .clk      (clk),
        .rst_n    (rst_n),
        .a        (a),
        .b        (c),
        
        .c        (min_ac)
    );

    sub_mod sub_mod_U2(
        .clk      (clk),
        .rst_n    (rst_n),
        .a        (min_ab),
        .b        (min_ac),
        
        .c        (min_abc)
    );

    assign d = min_abc;
    
endmodule

module sub_mod(
    input clk,
    input rst_n,
    input [7:0] a,
    input [7:0] b,
    
    output reg [7:0] c
);
    
    always@(posedge clk or negedge rst_n) begin: compare_2_inputs
        if(~rst_n)
            c <= 8'b0;
        else if(a > b)
            c <= b;
        else
            c <= a;
    end
    
endmodule

习题五:使用函数实现数据大小端转换

描述

  • 在数字芯片设计中,经常把实现特定功能的模块编写成函数,在需要的时候再在主模块中调用,以提高代码的复用性和提高设计的层次,分别后续的修改。

  • 请用函数实现一个4bit数据大小端转换的功能。实现对两个不同的输入分别转换并输出。

  • 程序的接口信号图如下:

输入描述

  • clk:系统时钟
  • rst_n:异步复位信号,低电平有效
  • a,b:4bit位宽的无符号数

输出描述

  • c,d:8bit位宽的无符号数

代码实现

````timescale 1ns/1ns
module function_mod(
    input clk,
    input rst_n,
    
	input [3:0]a,
	input [3:0]b,
	
	output [3:0]c,
	output [3:0]d
);
    assign c = rst_n?revrs(a):0;
    assign d = rst_n?revrs(b):0;
 
    function [3:0] revrs;
        input [3:0] datain;
        integer i;
            for (i=0;i<4;i=i+1)
                begin :reverse
                    revrs[i] = datain[3-i];
                end
    endfunction

endmodule

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
verilog是一种硬件描述语言,用于设计与验证数字电子系统。在verilog保研面试中,我们可以从以下几个方面回答问题。 首先,了解verilog的基本概念和原理是很重要的。我们可以介绍verilog的起源、应用领域以及它的基本语法结构和模块化设计原则。这些知识可以展示我们对verilog的理解和掌握程度。 其次,verilog的设计与验证方法是面试官关注的重点。我们可以介绍在verilog中如何进行逻辑门级和RTL级的设计与仿真验证,以及如何进行功能和时序仿真。此外,我们还可以谈谈如何通过约束、时序分析和时序约束的方法来优化设计和提高性能。 另外,项目经验也是考察的重要方面。我们可以谈论自己在verilog设计方面的项目经验,例如使用verilog进行数字电路的设计、优化和验证,或者完成一个verilog的实验项目。 此外,我们还可以谈谈对verilog未来发展的一些看法和预测。例如,我们可以谈论verilog在物联网、人工智能和云计算等领域的应用前景以及对verilog进行进一步优化和发展的建议。 最后,展现对verilog的热情和求知欲也是面试中需要表现出来的。我们可以谈论自己学习verilog的动机和目标,以及通过面试和保研来进一步发展自己的计算机硬件设计和数字电子系统方面的能力。 总结起来,verilog保研面试我们需要准备并展示自己对verilog的基本概念和原理的理解、设计与验证方法的掌握、项目经验的丰富、对verilog未来发展的洞察力以及对verilog的热情和求知欲。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式基地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值