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

news2025/1/12 23:05:12

题目背景

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

题目评价

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

文章目录

        • 1. 使用最少的电路实现二分频,给出原理图。
        • 2. 解释环形振荡器的构成和原理
        • 3. 什么是建立时间和保持时间?
        • 4. 建立时间和保持时间哪个和时钟速率有关?列出建立时间和保持时间违例的情况。
        • 5. 详细给出建立时间和保持时间裕量的计算方法
        • 6. 介绍FPGA SLICEL 的基本构成单元。
        • 7. 不需要流水线。给出两种8bit a/b 的实现方法。
        • 8. 介绍同步复位和异步复位的优缺点,写出异步复位同步释放的代码。
        • 9. 分析如下电路可能产生的问题,解决?
        • 10.统计1024个连续 8bit 输入数据的直方图,实时输出当前出现次数最多的数字。

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 c a p t u r e + t h o l d ) − ( t l a u n c h + t c l k 2 q + t l o g i c ) (t_{capture} + t_{hold}) - (t_{launch} + t_{clk2q} + t_{logic}) (tcapture+thold)(tlaunch+tclk2q+tlogic)


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 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《机器学习实战》chap1 机器学习概览

《机器学习实战》chap1 机器学习概览 Chap1 The Machine Learning Landscape 这本书第三版也已经出版了:https://github.com/ageron/handson-ml3 Hands-on Machine Learning with Scikit-Learn,Keras & TensorFlow 引入 很早的应用&#xff1a;光学字符识别(OCR&#xff0…

远程办公之怎样在外网登录在线答题网站

很多学校或企业因为教学、测试需要&#xff0c;为学生或员工提供了在线答题平台网站&#xff0c;但弊端是这种在线答题平台只能在校内或在企业内网访问使用&#xff0c;在外网是无法登录访问的。在无公网Ip服务器上部署的web&#xff0c;默认情况下只能内网访问&#xff0c;公网…

TLE4943C/CH505C轮速传感器芯片的输出协议介绍

Infineon公司的TLE4943是一款集成式有源磁场传感器&#xff0c;适用于基于霍尔技术的车轮速度应用。它的基本功能是测量磁极轮或铁磁齿轮的速度。它具有使用AK协议进行通信的两线电流接口。该协议除了提供速度信号外&#xff0c;还提供其他信息&#xff0c;如车轮旋转方向和气隙…

java安装教程-windows

检查是否已经安装过jav打开cmd命令窗口 输入 java -v下载java安装包网址&#xff1a;https://www.oracle.com/java/technologies/downloads/安装java双击运行程序jdk-19_windows-x64_bin.exe&#xff0c;点击下一步进行安装可以更改安装路径&#xff0c;注意安装路径不能有中文…

【TypeScript】TS类型守卫(六)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

独立开发变现周刊(第86期):月收入4000美元的日程规划器

分享独立开发、产品变现相关内容&#xff0c;每周五发布。目录1、NotionReads: 在Notion中管理你的阅读书籍2、Zaap.ai: 面向创作者的一站式工具3、microfeed: 开源的可自我托管的轻量级内容管理系统(CMS)4、Reactive Resume&#xff1a;一个免费的开源简历生成器5、一个月收入…

2019年1月政企终端安全态势分析报告

声明 本文是学习2019年1月政企终端安全态势分析报告. 下载地址 http://github5.com/view/55037而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 漏洞利用病毒攻击政企分析 奇安信终端安全实验室监测数据显示&#xff0c;2019年4月&#xff0c;有6.7%的…

JavaScript中的元编程

紧接上回&#xff0c;伴随着Reflect&#xff0c;Proxy降世&#xff0c;为js带来了更便捷的元编程&#xff01; 什么是元编程&#xff1f;这词第一次听&#xff0c;有点懵&#xff0c;好像有点高级&#xff0c;这不得学一下装…进自己的知识库 概念 元编程是一种编程技术&…

【数据结构与算法】Collection接口迭代器

Java合集框架 数据结构是以某种形式将数据组织在一起的合集&#xff08;collection&#xff09;。数据结构不仅存储数据&#xff0c;还支持访问和处理数据的操作 在面向对象的思想里&#xff0c;一种数据结构也被认为是一个容器&#xff08;container&#xff09;或者容器对象…

【MySQL】MySQL表的七大约束

序号系列文章1【MySQL】MySQL介绍及安装2【MySQL】MySQL基本操作详解3【MySQL】MySQL基本数据类型4【MySQL】MySQL表的七大约束文章目录MySQL表的约束1&#xff0c;默认约束2&#xff0c;非空约束3&#xff0c;唯一约束4&#xff0c;主键约束5&#xff0c;自增约束6&#xff0c…

详细分析单调栈,及正确性证明

什么是单调栈 对于一个数组&#xff0c;需要对每个位置生成&#xff0c;左右两边离它最近的&#xff0c;比它小&#xff08;或比它大&#xff09;的位置在哪 例如&#xff1a; 如果对每个位置都遍历下左右两边&#xff0c;找到第一个比它小的位置&#xff0c;就是O(N ^ 2)的…

IPv6 时代如何防御 DDoS 攻击?

在互联网世界&#xff0c;每台联网的设备都被分配了一个用于标识和位置定义的 IP 地址。20 世纪 90 年代以来互联网的快速发展&#xff0c;联网设备所需的地址远远多于可用 IPv4 地址的数量&#xff0c;导致了 IPv4 地址耗尽。因此&#xff0c;协议 IPv6 的开发和部署已经刻不容…

从第三方平台导出大数据量本地Excel怎么解决性能问题?

对于日常需要做分析的我们来说&#xff0c;周期性需要从第三方系统导出数据&#xff0c;日积月累数据量越来愈大&#xff0c;由开始的几百条数据慢慢增至十几万甚至百万级的数据量&#xff0c;在本地Excel直接做分析汇总老是卡顿等半天&#xff0c;效率日益低下&#xff0c;每天…

连续四年发布科技趋势预测,他们在探索中国科技的“主干道”

&#xff0c;*本文配图由百度飞桨文心一格提供AI绘画技术支持。古希腊流传着一句谚语&#xff1a;智慧不仅是能够明察眼前&#xff0c;更要能够预测未来。身处科技界&#xff0c;一到年底年初我们就会看到各种各样的趋势预测。这些预测五花八门&#xff0c;神奇多变。但大多数科…

JAVA中使用最广泛的本地缓存?Ehcache的自信从何而来3 —— 本地缓存变身分布式集群缓存,打破本地缓存天花板

大家好&#xff0c;又见面了。 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容&#xff0c;将会通过系列专题&#xff0c;讲清楚缓存的方方面面。如果感兴趣&#xff0c;欢迎关注以获取后续更新。 上一篇文章中&#xff0c;我们知晓了如何在项目中通过不同的…

【Python】Numpy处理多项式类Polynomial

文章目录构造函数求导和积分求根和反演采样与拟合其他方法构造函数 Numpy中提供了多项式模块&#xff0c;里面封装了一些用以快速解决多项式问题的类和函数&#xff0c;其中最重要类的自然是Polynomial&#xff0c;其构造函数为 class numpy.polynomial.polynomial.Polynomia…

list容器的底层结构(详述insert()与erase())

目录 一、带头结点的双向循环链表&#xff08;list&#xff09; 二、贯穿list容器的insert与erase接口​编辑 一、带头结点的双向循环链表&#xff08;list&#xff09; 二、贯穿list容器的insert与erase接口 通过在指定位置的元素之前插入新元素来扩展容器。 这有效地增加了…

520页(17万字)集团大数据平台整体解决方案-v1.0

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 1.1.1 系统总体逻辑结构 4-14系…

Golang 面试题总结

一.基础部分 go语言的值类型和引用类型&#xff1f; 值类型&#xff1a;int、float、bool、string和数组这些类型都属于值类型。 值类型的变量直接指向存在内存中的值&#xff0c;值类型的变量的值存储在栈中。当使用 将一个变量的值赋给另一个变量时&#xff0c;如 j i ,实…

九、k8s 安全认证

文章目录1 访问控制概述2 认证管理3 授权管理4 准入控制1 访问控制概述 Kubernetes作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。 客户端 在Kubernetes集群中&#…