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

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

8712401501e2477dac3303f76406f2c0.png

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


  • 点击进行在线练习
    描述
  • 根据指示信号select的不同,对输入信号a,b实现不同的运算。输入信号a,b为8bit有符号数,当select信号为0,输出a;当select信号为1,输出b;当select信号为2,输出a+b;当select信号为3,输出a-b.
  • 信号示意图:



db14539cb568444bba8d0435d2574f09.png


  • 使用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。


  • 接口信号示意图:


61eb018016fd410a854814eef2bd5b7b.png

输入描述

  • 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输入信号的最小值的功能。


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



80db9ea4929d4c168afa18314a91ffe4.png

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


a0733bd234d84ddf9d3682dbf6a5d576.png


  • 使用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数据大小端转换的功能。实现对两个不同的输入分别转换并输出。
  • 程序的接口信号图如下:

de7df6089461432eaf26a097548aadc1.png


输入描述

  • 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月前
|
编解码 算法 异构计算
基于FPGA的NC图像质量评估verilog实现,包含testbench和MATLAB辅助验证程序
在Vivado 2019.2和Matlab 2022a中测试的图像质量评估算法展示了效果。该算法基于NC指标,衡量图像与原始图像的相似度,关注分辨率、色彩深度和失真。提供的Verilog代码段用于读取并比较两个BMP文件,计算NC值。
|
1月前
|
算法 异构计算
m基于FPGA的MPPT最大功率跟踪算法verilog实现,包含testbench
该内容包括三部分:1) 展示了Vivado 2019.2和Matlab中关于某种算法的仿真结果图像,可能与太阳能光伏系统的最大功率点跟踪(MPPT)相关。2) 简述了MPPT中的爬山法原理,通过调整光伏电池工作点以找到最大功率输出。3) 提供了一个Verilog程序模块`MPPT_test_tops`,用于测试MPPT算法,其中包含`UI_test`和`MPPT_module_U`两个子模块,处理光伏电流和电压信号。
25 1
|
17天前
|
存储 异构计算 内存技术
【硬件工程师面试宝典】常见面试题其一
- Setup时间:时钟前数据需稳定的最小时间。 - Hold时间:时钟后数据需保持稳定的时间。 - 竞争现象:不同路径信号汇合导致输出不稳定。 - 冒险现象:竞争引起的短暂错误状态。 - D触发器实现2倍分频电路。
30 5
|
1月前
|
人工智能 开发工具 Python
2024年利用Python突破验证码限制,2024年最新Python高级开发工程师面试题
2024年利用Python突破验证码限制,2024年最新Python高级开发工程师面试题
2024年利用Python突破验证码限制,2024年最新Python高级开发工程师面试题
|
23天前
|
算法 计算机视觉 异构计算
基于FPGA的图像直方图均衡化处理verilog实现,包含tb测试文件和MATLAB辅助验证
摘要: 在FPGA上实现了图像直方图均衡化算法,通过MATLAB2022a与Vivado2019.2进行仿真和验证。核心程序涉及灰度直方图计算、累积分布及映射变换。算法旨在提升图像全局对比度,尤其适合低对比度图像。FPGA利用可编程增益器和查表技术加速硬件处理,实现像素灰度的均匀重分布,提升视觉效果。![image preview](https://ucc.alicdn.com/pic/developer-ecology/3tnl7rfrqv6tw_a075525027db4afbb9c0529921fd0152.png)
|
27天前
|
安全 网络安全 网络协议
精选30道“渗透测试工程师”面试题
渗透测试 信息收集 网络安全 web安全
37 3
|
1月前
|
分布式计算 监控 大数据
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
40 1
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
|
17天前
【硬件工程师面试宝典】常见面试题其二
检查单片机上电不运行:电源电压、时钟信号、复位电路、程序烧录。三极管特性:输出特性曲线和转移特性曲线。频率响应指系统对不同频率信号的响应,稳定要求幅度和相位不变。改变响应曲线方法:调整反馈、使用滤波器、改变元件参数。差分运放相位补偿通过在反馈回路加电容,波特图显示补偿效果。基本放大电路类型有共射、共集、共基,差分结构用于抗干扰和提高共模抑制比。电阻电容串联,电容电压为低通滤波,电阻电压为高通滤波。选择电阻考虑阻值、功率、温度系数、精度和尺寸。CMOS电路传递低电平用N管。电流偏置电路通过R1、Q1产生稳定电流。施密特电路回差电压由R1、R2决定。LC振荡器的哈特莱、科尔皮兹、克拉
17 0
|
1月前
|
存储 算法 异构计算
m基于FPGA的多功能信号发生器verilog实现,包含testbench,可以调整波形类型,幅度,频率,初始相位等
使用Vivado 2019.2仿真的DDS信号发生器展示了正弦、方波、锯齿波和三角波的输出,并能调整幅度和频率。DDS技术基于高速累加器、查找表和DAC,通过频率控制字和初始相位调整产生各种波形。Verilog程序提供了一个TEST模块,包含时钟、复位、信号选择、幅度和频率控制输入,以生成不同波形。
66 18
|
1月前
|
算法 计算机视觉 异构计算
基于FPGA的图像累积直方图verilog实现,包含tb测试文件和MATLAB辅助验证
该内容展示了FPGA实现图像累积直方图的算法。使用Vivado2019.2和matlab2022a,通过FPGA的并行处理能力优化图像处理。算法基于像素值累加分布,计算图像中像素值小于等于特定值的像素个数。核心代码为`test_image`模块,读取二进制图像文件并传递给`im_hist`单元,生成直方图和累积直方图。