草庐IT

笔试题-2023-禾赛-FPGA【个人解答版】

lu-ming.xyz 2024-01-22 原文

题目背景

  • 笔试时间:2022.06.22
  • 应聘岗位:FPGA开发工程师

题目评价

  • 难易程度:★★☆☆☆
  • 知识覆盖:★☆☆☆☆
  • 超纲范围:☆☆☆☆☆
  • 值得一刷:★☆☆☆☆

文章目录

1. 使用最少的电路实现二分频,给出原理图。



2. 解释环形振荡器的构成和原理


环形振荡器的构成:
奇数个反相器首尾连接而成。

环形振荡器的原理:
利用门电路的固有传输延迟。电路没有稳态,静态下(假定没有振荡时)任何一个反相器的输入和输出都不可能稳定在高电平或低电平,只能处于高低电平之间,处于放大状态。


3. 什么是建立时间和保持时间?


建立时间:有效时钟沿到来之前数据必须保持稳定的时间。
保持时间:有效时钟沿到来之后数据必须保持稳定的时间。


4. 建立时间和保持时间哪个和时钟速率有关?列出建立时间和保持时间违例的情况。


建立关系:与工作频率有关
t l a u n c h + t c l k 2 q + t l o g i c + t s e t u p < t c a p t u r e + t c y c l e t_{launch} + t_{clk2q} + t_{logic} + t_{setup}< t_{capture} + t_{cycle} tlaunch+tclk2q+tlogic+tsetup<tcapture+tcycle

保持关系:
t l a u n c h + t c l k 2 q + t l o g i c > t c a p t u r e + t h o l d t_{launch} + t_{clk2q} + t_{logic} > t_{capture} + t_{hold} tlaunch+tclk2q+tlogic>tcapture+thold

题目问法有点问题,理论上建立时间和保持时间都是时序器件固有属性,与时钟频率都无关,应该是想问建立关系和保持关系哪个和时钟速率有关。

建立时间违例的情况:从建立关系就可以推断

  • 组合逻辑过于复杂,时延较大。
  • 负时钟偏斜较大。
  • 时钟频率过大。时序关系太严格。
  • 工艺库较落后。

保持时间违例的情况:

  • 正时间偏斜较大。
  • 工艺库较落后。

5. 详细给出建立时间和保持时间裕量的计算方法


图片来源:《Static timing analysis for nanometer designs_ a practical approach》 Figure 8-2 Data and clock signals for setup timing check


对于max延迟分析(setup/recovery):
- 裕量 = 数据需要的时间 - 数据到达的时间
对于min延迟分析(hold/removal):
- 裕量 = 数据到达的时间 - 数据需要的时间

建立时间裕量:
( t c a p t u r e + t c y c l e − t s e t u p ) − ( t l a u n c h + t c l k 2 q + t l o g i c ) (t_{capture} + t_{cycle} - t_{setup}) - (t_{launch} + t_{clk2q} + t_{logic} ) (tcapture+tcycletsetup)(tlaunch+tclk2q+tlogic)

保持时间裕量:
( t l a u n c h + t c l k 2 q + t l o g i c ) − ( t c a p t u r e + t h o l d ) (t_{launch}+ t_{clk2q}+t_{logic})-(t_{capture} +t_{hold}) (tlaunch+tclk2q+tlogic)(tcapture+thold)


6. 介绍FPGA SLICEL 的基本构成单元。


参考:可配置逻辑块(configurable logic block,CLB)资源学习

SLiceL的基本构成单元:

  • LUT6*4:每个LUT有六个独立的输入(A1-A6),两个独立的输出(O5-O6)。一个SLice中的四个LUT分别以A B C D编号。
  • 多路选择器*3: 用于查找表的尾款拓展
  • 进位链*1:时间超前进位逻辑。
  • 触发器*8:每个slice有8个存储单元。四个可以配置为边沿触发D型触发器或电平敏感的锁存器。

7. 不需要流水线。给出两种8bit a/b 的实现方法。


参考:除法器的实现(恢复余数、不恢复余数、级数展开、Newton-Raphson)


8. 介绍同步复位和异步复位的优缺点,写出异步复位同步释放的代码。


复位类型优点缺点
同步复位①抗干扰性能强,可以剔除复位信号中周期短于时钟周期的毛刺。①占用更多的逻辑资源。
②有利于STA工具分析。②对复位信号脉宽有要求,必须大于时钟周期,很难保证复位信号到达各寄存器的时序。
③有利于基于周期的仿真工具的仿真。③复位信号依赖于时钟,如果电路时钟出现问题无法复位。
异步复位①无需额外逻辑资源,实现简单。可保证复位引脚到个寄存器始终偏斜最小。①复位信号易受外界干扰,对毛刺敏感。
②复位信号不依赖于时钟。②复位信号释放的随机性,产生时序违例导致电路处于亚稳态。

异步复位同步释放的代码:

reg R_rstn;
reg R1_rstn;

always @(posedge clk or negedge rstn)
begin
    if(~rstn)
    begin
        R_rstn <= 1'b0;
        R1_rstn <= 1'b0;
    end
    else   
    begin
        R_rstn <= 1'b1;
        R1_rstn <= R_rstn;
    end
end

always @(posedge clk or negedge R1_rstn)
begin
    if(~R1_rstn)
    begin
        // 用户逻辑 
    end
    else  
    begin 
        // 用户逻辑 
    end
end

9. 分析如下电路可能产生的问题,解决?


类似多bit数据跨时钟域问题,可能会导致亚稳态或数据无法正确跨时钟域。
不能直接采样,需要加入对于处理电路,首先将多bit信号组合逻辑输出在CLK_a寄存一拍,然后进行单bit跨时钟域处理。

如果CLK_a比CLK_b慢,可以采用打两拍的方法。
如果CLK_a比CLK_b快,可以采用脉冲同步器或者握手处理。


10.统计1024个连续 8bit 输入数据的直方图,实时输出当前出现次数最多的数字。


题目没有限制要用尽量少的逻辑资源,简单的写法可以generate 256 个寄存器,来一个对应数据就加一,这样在实现上是比较简单的。如果考虑到综合实现,用一个ram来存比较合适。

实时输出当前出现次数最多的数字?这个有点难,意味着要持续完成256个出现次数的比较,并且还要得到最大次数对应的地址。

每帧数据输出最大值还差不多?T_T

这里只实现了直方图统计,比较简单

实现RTL:

`timescale 1ns/1ps  

module histogram(
    input       clk   ,
    input       rstn  ,
    input       en_i  ,
    input [7:0] data_i
);
//--- internal signal definitions ---
//=== parameter definitions ===			
                                
//=== reg definitions ===  
reg            en_r     ;
reg  [7:0]     data_r	;  	
reg            en_r1     ;
reg  [7:0]     data_r1	; 		
reg            wr_en_r  ;
reg  [7:0]     wr_addr_r;
reg  [9:0]     wr_din_r ;    
reg            rd_en_r  ;
reg  [7:0]     rd_addr_r; 


//=== wire definitions === 				
wire  [9:0]    rd_dout_w;                                      
                                    
//--- Main body of code ---
always @(posedge clk or negedge rstn)
begin
    if(~rstn) 
    begin
        en_r   <= 1'd0;
        data_r <= 8'd0;
        en_r   <= 1'd0;
        data_r <= 8'd0;
    end 
    else
    begin
        en_r   <= en_i  ;
        data_r <= data_i;
        en_r1   <= en_r  ;
        data_r1 <= data_r;
    end
end

always @(posedge clk or negedge rstn)
begin
    if(~rstn) 
    begin
        rd_en_r   <= 1'b0;
        rd_addr_r <= 8'b0;
    end 
    else
    begin
        rd_en_r   <= en_i;
        rd_addr_r <= data_i;
    end
end

always @(posedge clk or negedge rstn)
begin
    if(~rstn) 
    begin
        wr_en_r   <= 1'b0;
        wr_addr_r <= 8'b0;
        wr_din_r  <= 10'b0;
    end 
    else
    begin
        wr_en_r   <= en_r1;
        wr_addr_r <= data_r1;
        wr_din_r  <= rd_dout_w + 1'b1;
    end
end

dpram dpram_u(
    .clk    (clk      ),
    .rstn   (rstn     ),
    .wr_en  (wr_en_r  ),
    .wr_addr(wr_addr_r),
    .wr_din (wr_din_r ),
    .rd_en  (rd_en_r  ),
    .rd_addr(rd_addr_r),
    .rd_dout(rd_dout_w)
);


endmodule 

//只是模拟RAM,代码不可综合。
module dpram(
    input            clk,
    input            rstn,
    input            wr_en,
    input  [7:0]     wr_addr,
    input  [9:0]     wr_din,
    input            rd_en,
    input  [7:0]     rd_addr,
    output reg [9:0] rd_dout
);

reg [9:0] mem [0:255] ;

always @(posedge clk)
begin
    if (wr_en)
    begin
        mem[wr_addr] <= wr_din;
    end
end

always @(posedge clk)
begin
    if (rd_en)
    begin
        rd_dout <= mem[rd_addr];
    end
end

always @(negedge rstn) begin
    if (~rstn)
    begin
        data_rst();
    end
end

task data_rst();
begin:data_rst
    integer i;
    for (i = 0; i < 256; i = i + 1) begin
        mem[i] = 0;
    end
end
endtask  

endmodule

testbench:

`timescale 1ns/1ps   

module histogram_tb ();

parameter T = 10;

reg       clk   ;
reg       rstn  ;
reg       en_i  ;
reg [7:0] data_i;


initial begin
    clk    = 'd1;
    rstn   = 'd0;
    en_i   = 'd0;
    data_i = 'd0;
    #(T*10) 
    rstn   = 'd1;
    #(T*5)
    data_gen();
    $finish();
end
always #(T/2) clk <= ~clk;

task data_gen();
begin:data_gen
    integer i;
    for (i = 0; i < 1024; i = i + 1) begin
        @(negedge clk);
        en_i   <= 'd1;
        data_i <= {$random} % 256;
    end
    @(posedge clk);
    en_i   <= 'd0;
end
endtask

histogram histogram_u(
    .clk   (clk   ),
    .rstn  (rstn  ),
    .en_i  (en_i  ),
    .data_i(data_i)
);


endmodule

Modelsim脚本:

vlib work  
vlog histogram.v  histogram_tb.v 
vsim -novopt work.histogram_tb 


Rivision

时间修改内容
2023.01.27修改 4 题中保持关系的错误

有关笔试题-2023-禾赛-FPGA【个人解答版】的更多相关文章

  1. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  2. 华为OD机试真题 C++ 实现【带传送阵的矩阵游离】【2023 Q2 | 200分】 - 2

            所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。

  3. IDEA 2023.1 正式发布,新特性简介 - 2

     昨晚看到IDEA官推宣布IntelliJIDEA2023.1正式发布了。简单看了一下,发现这次的新版本包含了许多改进,进一步优化了用户体验,提高了便捷性。至于是否升级最新版本完全是个人意愿,如果觉得新版本没有让自己感兴趣的改进,完全就不用升级,影响不大。软件的版本迭代非常正常,正确看待即可,不持续改进就会慢慢被淘汰!根据官方介绍:IntelliJIDEA2023.1针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施,使得Maven导入更快,并且在打开项目时IDE功能更早地可用。由于后台提交检查,新版本提供了简化的提交流程。IntelliJIDEA

  4. FPGA 之 时钟,时钟域, 以及复位系统的设计 - 2

    FPGA时钟和时钟域时钟树所谓时钟树为FPGA内部资源,分:全局时钟树,区域时钟树,IO时钟树原则上优先使用全局时钟树,在GT接口上使用IO时钟树,一般工具也会对GT时钟加以限制;时钟树使用方式正确的物理连接FPGA会由物理管脚专门用于全局时钟设置,通过查询数据手册可以在PCB设计阶段进行确认,当外部时钟接入此管脚时,工具会自动占有全局时钟树资源,当接入普通信号时不会分配时钟树资源;恰当的代码描述原语的使用,即BUFG的使用,可以将PLL的输出等内部时钟进行全局时钟资源的分配;IO时钟资源需要参考相应接口手册,以ultrascale的GTH为例,其JESD204的时钟方案针对不同的子类会由不同

  5. 2023爱分析·流程中台市场厂商评估报告:微宏科技 - 2

     目录1. 研究范围定义2. 流程中台市场分析3. 厂商评估:微宏科技4. 入选证书 1.   研究范围定义近年来,随着外部市场环境快速变化、客户需求愈发多样,企业逐渐意识到,自身业务需要更加敏捷、高效,具备根据市场需求快速迭代的能力。业务流程的自动化能够帮助企业实现业务的敏捷高效,因此受到越来越多企业的关注。企业的“自动化武器库”品类丰富,包括低/零代码平台、RPA、BPM、AI等。企业可以使用多项自动化工具,但结果往往是各项自动化工具处于各自的“自动化烟囱”之中,仅能实现碎片式自动化。例如,某企业的IT团队可能在使用低代码平台、财务团队可能在使用RPA、呼叫中心则可能在使用聊天机器人。自动

  6. 连续3天3场分享,KubeVela@KubeCon EU 2023 抢鲜看! - 2

    自从2019年OpenApplicationModel诞生以来,KubeVela已经经历了几十个版本的变化,并向现代应用程序交付先进功能的方向不断发展。最近,KubeVela完成了向CNCF孵化项目的晋升,标志着社区的发展来到一个新的里程碑。今天,KubeVela社区内活跃着大量来自全球的开发者,共同推动KubeVela项目的落地和发展。在即将开幕的KubeCon+CloudNatvieConEurope2023上,我们惊喜地发现,连续3天,KubeVela项目的贡献者、企业用户和来自阿里云的核心维护者,将从不同角度展对KubeVela项目的分享。让我们先睹为快!🎙️BuildingaPlat

  7. MicroBlaze在纯FPGA下 Xilinx SDK固化程序到外部SPI FLASH - 2

    外部SPIFLASH:MicronN25Q128A13ESE40G(128Mbit(16MByte))FPGA:XC7A100T CPU:Microblaze第一种情况:Microblaze在简单的应用,比如运行LED,IIC,SPI,UART之类的低俗接口驱动,或做一些简单的辅助型工作时,一般生成的applicationelf文件都不大,在10几KB或者几十,百几KB,此时使用FPGA内部的BRAM资源已经足够。XC7A100T本身就有600几KB的BRAM资源。这种情况下直接将硬件流文件和elf文件合并为download.bit文件,在直接烧录到外部SPIFLAH即可。1.Xilinx--

  8. 华为OD机试 -旋转骰子(Python) | 机试题算法思路 【2023】 - 2

    最近更新的博客华为OD机试-卡片组成的最大数字(Python)|机试题算法思路华为OD机试-网上商城优惠活动(一)(Python)|机试题算法思路华为OD机试-统计匹配的二元组个数(Python)|机试题算法思路华为OD机试-找到它(Python)|机试题算法思路华为OD机试-九宫格按键输入(Python)|机试算法备考思路华为OD机试-身高排序(Python)|备考思路使用说明参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。华为OD清单查看地址:blog.csdn.net/hihell/catego

  9. MQTTX工具上的 mqtt mqtts ws wss的区别,以及常见问题解答 - 2

    ws --> WebSocket非加密(端口8083)wss-->WebSocketSSL加密(端口8084)mqtt-->mqtt非加密(端口1883)mqtts-->mqtt加密 (端口8884)WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据初学者容易出现以下几个错误:连接地址没有指明协议:WebSocket作为一种通信协议,其使用 ws (非加密)、wss(SSL加密)作为协议标识。MQTT.js客户端支持多种协议,连接地址需指明协议类型;连接地址没有指明端口:MQTT并未对WebSocket接入端口做出规定,EMQX上默认使用 8083 

  10. FPGA配置之SelectMAP总线 - 2

    1FPGA启动流程图1 7SerialsFPGA配置流程1.1DevicePower-Up1.2ClearConfigurationMemory在上电后的任何时间内,可以对Slave-FPGA配置存储器(BlockRAM)进行复位处理。复位方式是将PROGRAM_B信号拉低(下降沿有效)。1.3SampleModePins当复位完成后,INIT_B恢复高电平,Slave-FPGA对M[2:0]模式引脚进行采样,然后开始在CCLK上升沿接收配置数据。1.4Synchronization在接收配置数据前,Slave-FPGA首先进行总线位宽检测。主机发送的配置文件中,“BusWidthAutoDe

随机推荐