一、如果线网类型变量说明后未赋值,起缺省值是(z)

线网数据类型就是表示verilog结构化元件间的物理连线,它的值由驱动元件的值决定,如果没有驱动元件连接到线网,线网的缺省值为z(高阻)。线网的数据类型有tri、wand和wire等。

寄存器数据类型表示一个抽象的数据存储单元,它只能在alway语句和initial语句等过程中被赋值,它的缺省值默认为x(未知),寄存器数据类型有integer、real和reg等。

二、

面积优化:资源共享、串行化

速度优化:流水线设计、寄存器配平、关键路径法、乒乓操作法、树形结构法

寄存器配平:寄存器配平是通过配平寄存器之间的组合延时逻辑块来实现速度优化,两个组合逻辑块延时差别过大,导致设计总体工作频率Fmax取决于T1,即最大的延时模块,从而使设计整体性能受限。将延时较大的组合逻辑1的部分逻辑转移到组合逻辑2中,以减小延时T1,使t1≈t2,且满足T1+T2=t1+t2。寄存器配平后的图8结构中Fmax≈1/t1>1/T1,从而提高了设计速度。

关键路径法:关键路径是指设计中从输入到输出经过的延时最长的逻辑路径,优化关键路径是提高设计工作速度的有效方法。图9中Td1>Td2,Td1>Td3,关键路径为延时Td1的模块,由于从输入到输出的延时取决于延时最长路径,而与其他延时较小的路径无关,因此减少Td1则能改善输入到输出的总延时。

可参考:https://blog.csdn.net/qq_26652069/article/details/100634180

三、timescale  x/y       x代表时间单位,表示仿真的时候以x为时间单位,y代表时间的精度

四、

reg[7:0] mema[255:0]正确的赋值是()给的答案是A,但是感觉答案应该为AB

A、mema[5]=3’d0
B、mema[5][3:0]=4’d1
C、mema[8][8] = 8’d0
D、都正确

C肯定错了,经过仿真AB都能正确赋值。

五、DDR3

三种频率:内核频率(内存的真实运行频率);时钟频率(即I/O Buffer输入输出缓冲的传输频率);等效频率(数据传输频率)。

DDR3-1066数据位宽为32bit,则等效频率为1066Mbps,内核频率为1066/8 = 133Mbps

DDR3-1066的理论带宽 = 1066 * 32 / 8 = 4264;

某设计中使用了DDR3-1066,数据位宽32bit,FPGA工程中实现的DDR3 controller时钟为800MHz, 应用端时钟为200MHz, 数据位宽为128bit,请问,应用端DDR3可用的理论带宽为()

4264MB/s
3200MB/s
6400MB/s
2132MB/s

DDR3-1066 理论带宽 = 1066 * 32 / 8 = 4264

FPGA内存带宽           =  800 * 32 / 8 = 3200

应用端带宽                 =  200 * 128 / 8 = 3200

取瓶颈3200

六、

建立时间为在时钟沿到达寄存器之前,数据需要稳定的时间,如果不满足寄存器的建立时间,则可能会产生亚稳态;

保持时间为在时钟沿到达寄存器之后,数据需要稳定的时间,如果不满足寄存器的建立时间,则可能会产生亚稳态;

建立时间与保持时间都是器件的固有属性,需要对时钟频率、组合逻辑延时进行改变以满足建立时间,对组合逻辑演示进行改变以满足保持时间。

亚稳态即在时钟上升沿到来时,数据不满足寄存器的建立时间或者保持时间,使寄存器采到的数据的值不确定的状态,该状态会随着后面的组合逻辑与时序电路进行传播,造成极大的危害,需要避免,避免的方法有增加寄存器。

七、异步FIFO

异步FIFO设计注意事项有哪些?

(1)在地址信号跨时钟域时需要对其进行二进制码转格雷码的转换并进行目标时钟域的时钟打两拍同步,以防止亚稳态的产生。
(2)写满信号由读地址同步到写时钟域并与写地址进行比较产生,读空信号由写地址同步到读时钟域并与读地址进行比较产生。这样可以在第一时间得到读空与写满的信息,并对异步fifo进行操作。
(3)异步fifo的深度需要考虑到写状态的背靠背写入状态以得到最适合的深度。
(4)读写地址需要扩展一位来判断是读空还是写满,当扩展后的读写地址的格雷码相等时为读空,若其前两位不同,后面相等时为写满。

在跨时钟域设计中通常使用异步FIFO,从而实现不同苏联间速率的匹配问题。

设计难点:读写指针和空满信号的处理

FIFO的读写指针是指读写地址,但是读写指针一般比真正用来读写的Memory地址要多一位,用来判断空满信号。多一位的读写指针周期性如下图所示,verilog代码assign gray = (bin>>1) ^ bin;

写指针总是指向下一个要写入的地址。写操作到来时,数据写入写指针指向的地址,然后指针指向下一个要写入的地址。

读指针总是指向下一个要读取的地址。要读的数据会提前准备在输出数据端口的缓存中,读操作到来时,数据发送至端口,读指针指向下一个要读取的地址。

产生空满信号:

空信号用来防止FIFO的underflow(下溢),当读指针追上写指针的时候表示空信号,写指针需要同步到读指针时钟域之后的写指针。

满信号用来防止FIFO的overflow(上溢),当写指针追上读指针的时候表示满信号,读指针需要同步到写指针时钟域之后的读指针。

由于是异步FIFO的设计,读写时钟不一样,在产生读空信号和写满信号时,会涉及到跨时钟域的问题,在读写指针上可能会产生亚稳态。需要通过两级寄存器同步和格雷码进行跨时钟域处理。

分别将写时钟域的写指针同步到读时钟域,将同步后的写指针与读时钟域的读指针进行比较产生读空信号;将读时钟域的读指针同步到写时钟域,将同步后的读指针与写时钟域的写指针进行比较产生写满信号。

同步会消耗至少一个时钟周期的延迟,可能会引起保守的判断,比如写指针同步到读时钟域,同步后的写指针小于等于当前实际的写指针,此时判断的FIFO为空不一定是真空;同理读指针同步到写时钟域,同步后的读指针小于等于当前实际的读指针,此时判断的FIFO为满不一定是真满。于是同步的延迟虽然比较保守,但是可以保证FIFO的特性,不会出错。

举个例子:大多数情形下,异步FIFO两端的时钟不是同频的,或者读快写慢,或者读慢写快,慢的时钟域同步到快的时钟域不会出现漏掉指针的情况,但是将指针从快的时钟域同步到慢的时钟域时可能会有指针遗漏,举个例子以读慢写快为例,进行满标志判断的时候需要将读指针同步到写时钟域,因为读慢写快,所以不会有读指针遗漏,同步消耗时钟周期,所以同步后的读指针滞后(小于等于)当前读地址,所以可能满标志会提前产生,满并非真满。进行空标志判断的时候需要将写指针同步到读指针 ,因为读慢写快,所以当读时钟同步写指针 的时候,必然会漏掉一部分写指针,我们不用关心那到底会漏掉哪些写指针,我们在乎的是漏掉的指针会对FIFO的空标志产生影响吗?比如写指针从0写到10,期间读时钟域只同步捕捉到了3、5、8这三个写指针而漏掉了其他指针。当同步到8这个写指针时,真实的写指针可能已经写到10 ,相当于在读时钟域还没来得及觉察的情况下,写时钟域可能偷偷写了数据到FIFO去,这样在判断它是不是空的时候会出现不是真正空的情况,漏掉的指针也没有对FIFO的逻辑操作产生影响。

通过格雷码也可以降低亚稳态的发生,将添加一位后的二进制地址吗转换成格雷码,格雷码是带有镜像对称的编码,低三维管委中心对称,分成两部分的低二位关于各部分的中心对称,如下图所示:

如图可观察出,写满和读空两种状态可以根据最高位来判断:

1、当两个最高位相反,后三位相同时为写满;

2、当两个完全相等时为读空。

verilog代码:

/*********异步FIFO*********/
module fifo
(rdata, wfull, rempty, wdata, winc,         //写使能wclk,      wrst_n,rinc,        //读使能rclk, rrst_n
);
parameter DSIZE = 8; //8位数据
parameter ASIZE = 4; //3位地址->最高保存7个数据output [DSIZE-1:0]         rdata;
output                  wfull;
output                  rempty;input [DSIZE-1:0]        wdata;
input                   winc, wclk, wrst_n;
input                   rinc, rclk, rrst_n;reg                  wfull,rempty;
reg [ASIZE:0]           wptr, rptr, wq2_rptr, rq2_wptr, wq1_rptr,rq1_wptr;
reg [ASIZE:0]           rbin, wbin;
reg [DSIZE-1:0]         mem[0:(1<<ASIZE)-1];wire [ASIZE-1:0]      waddr, raddr;
wire [ASIZE:0]          rgraynext, rbinnext,wgraynext,wbinnext;
wire                    rempty_val,wfull_val;//-----------------双口RAM存储器--------------------
assign rdata = mem[raddr];
always@(posedge wclk) beginif (winc && !wfull) mem[waddr] <= wdata;
end//-------------同步rptr 指针-------------------------
always @(posedge wclk or negedge wrst_n)if (!wrst_n) {wq2_rptr,wq1_rptr} <= 0;else {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};     //同步到写时钟域的读指针//-------------同步wptr指针---------------------------
always @(posedge rclk or negedge rrst_n)if (!rrst_n) {rq2_wptr,rq1_wptr} <= 0;else {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr};     //同步到读时钟域的写指针//-------------rempty产生与raddr产生-------------------
always @(posedge rclk or negedge rrst_n) // GRAYSTYLE2 pointer
beginif (!rrst_n) {rbin, rptr} <= 0;else {rbin, rptr} <= {rbinnext, rgraynext};
end// Memory read-address pointer (okay to use binary to address memory)
assign raddr = rbin[ASIZE-1:0];
assign rbinnext = rbin + (rinc & ~rempty);
assign rgraynext = (rbinnext>>1) ^ rbinnext;
// FIFO empty when the next rptr == synchronized wptr or on reset
assign rempty_val = (rgraynext == rq2_wptr);always @(posedge rclk or negedge rrst_n)
beginif (!rrst_n) rempty <= 1'b1;else rempty <= rempty_val;
end//---------------wfull产生与waddr产生------------------------------
always @(posedge wclk or negedge wrst_n) // GRAYSTYLE2 pointerif (!wrst_n) {wbin, wptr} <= 0;else {wbin, wptr} <= {wbinnext, wgraynext};// Memory write-address pointer (okay to use binary to address memory)
assign waddr = wbin[ASIZE-1:0];
assign wbinnext = wbin + (winc & ~wfull);
assign wgraynext = (wbinnext>>1) ^ wbinnext;
assign wfull_val = (wgraynext=={~wq2_rptr[ASIZE:ASIZE-1], wq2_rptr[ASIZE-2:0]}); //:ASIZE-1]always @(posedge wclk or negedge wrst_n)if (!wrst_n) wfull <= 1'b0;else wfull <= wfull_val;endmodule

同步FIFO就不需要同步指针和格雷码转换了,只需要判断读空和写满就行了,verilog代码

/********同步FIFO*******/
/******************************************************
A fifo controller verilog description.
******************************************************/
module fifo
(datain,rd, wr, rst, clk, dataout, full, empty
);
input [7:0] datain;
input rd, wr, rst, clk;output [7:0] dataout;
output full, empty;wire [7:0] dataout;reg full_in, empty_in;
reg [7:0] mem [15:0];
reg [3:0] rp, wp;assign full = full_in;
assign empty = empty_in;
// memory read out
assign dataout = mem[rp];
// memory write in
always@(posedge clk) beginif(wr && ~full_in) mem[wp] <= datain;
end
// memory write pointer increment
always@(posedge clk or negedge rst) beginif(!rst) wp <= 0;else beginif(wr && ~full_in) wp <= wp+1'b1;end
end
// memory read pointer increment
always@(posedge clk or negedge rst)beginif(!rst) rp <= 0;else beginif(rd && ~empty_in) rp <= rp + 1'b1;end
end
// Full signal generate
always@(posedge clk or negedge rst) beginif(!rst) full_in <= 1'b0;else beginif( (~rd && wr)&&((wp==rp-1)||(rp==4'h0 && wp==4'hf)))full_in <= 1'b1;else if(full_in && rd) full_in <= 1'b0;end
end
// Empty signal generate
always@(posedge clk or negedge rst) beginif(!rst) empty_in <= 1'b1;else beginif((rd&&~wr)&&(rp==wp-1 || (rp==4'hf&&wp==4'h0)))empty_in <= 1'b1;else if(empty_in && wr) empty_in <= 1'b0;end
end
endmodule

参考链接:https://blog.csdn.net/Pieces_thinking/article/details/78026326

https://zhuanlan.zhihu.com/p/42991844

八、

在一个FPGA项目中,既有建立时间异常(setup violation),也有保持时间异常(hold violation),应该如何修改设计以使其正常工作?

对于数据建立,要使输入数据先于时钟脉冲变化沿变化,而保持时间是指时钟脉冲触发沿到来之后,输入上的逻辑电平需要保持的最小时间间隔,这样才能保证读到正确的数值。

setup violation是由于前级组合的延迟过大引起的,因此如果和输入端口有关要用set_max_delay来限制;
hold violation是由于前级组合延迟国小引起的,因此不能让他太小,如果和输入端口有关要用set_min_delay来限制。

如果是多周期路径有关,则需要通过分析将setup或者hold延时添加;

如果是跨时钟域的关系就set_false_path。

九、

一个32bit浮点的累加器,A = A + data, A初始化为0, data为串行输入数据流,包含数据使能信号,加法器延迟5个时钟周期。请问如何用verilog语言实现一个累加器。

串行输入数据流是什么意思,,,

十、

用D触发器实现2倍分频的Verilog描述?

/***********二倍频************/
module Div(input    clk,input   rst,output  signal
);reg   signal;always @(posedge clk or negedge rst) beginif (!rst) begin// resetsignal         <= 0;endelse beginsignal        <= ~signal;end
end
endmodule

十一、

某FIR滤波器的频率响应为H(z)= a + bz-1+bz-2+cz-3。现需要对某采样输入信号x(n)滤波,滤波器和输入信号同属于一个时钟域,频率300MHz。

a) 请画出滤波器的实现框图;

b) 假如乘法器输出延迟5个时钟周期,加法器延迟7个时钟周期,输入到输出的最小延迟是多少?

c) 若输入都是定点数据,如何做量化处理?

a)

b)

如上图所示,输入数据x先延时3个周期,再并行乘以各自的系数,再前两个和后两个并行相加,最后再加一次:

总公式为:y(n) = a*x(n) + b*x(n-1) + b*x(n-2) + c*x(n-3);

第一步:延时三个周期分别得到x(n-1)、x(n-2)、x(n-3)和当前数据x(n);

第二步分别乘以各自系数:a*x(n)、b*x(n-1)、b*x(n-2)、c*x(n-3);

第三步第一次加法:a*x(n) + b*x(n-1)和b*x(n-2) + c*x(n-3);

第四步第二次加法:a*x(n) + b*x(n-1) + b*x(n-2) + c*x(n-3)

所以总周期数为3+5+7+7 = 22,延时为1/300M*22 =

c)

量化啥意思没看懂,,,

二进数表示小数:

如上图,一个带小数点的8位二进制所表示的数的大小就是:1*4+1*2+1*1+1*0.5+1*0.25+1*0.125+1*0.0625+1*0.03125 = 7.96875.实际上还有另外一种表示方式:0xff/2^5 = 7.96875.

x表示实际的数(*一个浮点数), q表示它的Qn型定点小数(一个整数)。

q = (int) (x * 2^n)

x = (float)q/2^n

以Q12为例:

假设定点小数用16位二进制表达,最高位是符号位,那么有效位就是15位。小数点之后可以有0 - 15位。

我们把小数点之后有n位叫做Qn,例如小数点之后有12位叫做Q12格式的定点小数,而Q0就是我们所说的整数。

Q12的正数的最大值是 0 111 . 111111111111,第一个0是符号位,后面的数都是1

那么这个数表示的小数为0x7fff / 2^12 = 7.999755859375。

对于Qn格式的定点小数的表达的数值就它的整数值除以2^n。

那么把一个实际所要表达的值x转换Qn型的定点小数的时候,就是x*2^n了。

例如 0.2的Q12型定点小数为:0.2*2^12 = 819.2,由于这个数要用整数储存, 所以是819 即 0x0333。

因为舍弃了小数部分,所以0x0333不是精确的0.2,实际上它是819/2^12 =0.199951171875。

数的定点化方式举例:

比如,将十进制数2.918量化为16位的(3位整数位宽,12位小数位宽,1个符号位)

(1)整数部分有3位,最大为111,表示7;

(2)小数部分12位,表示范围

(3)即,整数+小数最大能表示7+1 =8;而15位二进制数最大能表示32768;所以此种量化方式的精度为t=(7+1)/32768.

(4)2.918定点化为:2.918/t=11952.128≈11952,定点化为有0.128的误差。误差百分比为0.128/11952=1.0710e-05。近似可以忽略不计。

(5)LSB = 1/2^12 =  2.4414e-04

同样,将十进制数0.918量化为16位的(0位整数位宽,15位小数位宽,1个符号位)

(1)整数部分有0位,只能表示为0;

(2)小数部分15位,表示范围

(3)即,整数+小数最大能表示0+1=1;而15位二进制数最大能表示32768;所以此种量化方式的精度为t=(0+1)/32768.

(4)0.918定点化为:0.918/t=30081.024≈30081,定点化有0.024的误差,误差百分比为0.024/30081=7.9785e-07;忽略不计

(5)LSB = 1/2^15 =3.0518e-05

参考:https://blog.csdn.net/Setul/article/details/82690251

https://blog.csdn.net/u013215852/article/details/102672694

https://blog.csdn.net/qq_41792237/article/details/79782123

商汤FPGA优化验证相关推荐

  1. 今晚直播 | 商汤科技X-Lab刘宇:神经网络结构与大规模优化方法

    「PW Live」是 PaperWeekly 的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交流可能会让知识的传播更加有意义, ...

  2. 直播 | 商汤科技X-Lab宋广录:大规模视觉检测任务的检测器设计与优化

    「Industry AI Live」是 biendata 与人工智能媒体 PaperWeekly 共同发起的学术直播栏目,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一 ...

  3. 北京,上海 商汤研究院基础视觉组正式员工(校招、社招)实习生长期招聘...

    关注公众号,获取更多AI领域发展机会 组别介绍 商汤研究院基础视觉组是商汤研究执行总监代季峰博士(https://jifengdai.org/)领导,致力于提出和实现最前沿的算法,保持算法在工业界和学 ...

  4. 商汤研究院基础视觉组正式员工(校招/社招)实习生长期招聘

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 商汤研究院基础视觉组正式员工(校招.社招)&实习生长期招聘 地点 :北京,上海 [组别介绍] 商汤研 ...

  5. GitHub 标星 20000+,国产 AI 开源从算法开始突破 | 专访商汤联合创始人林达华

    作者 | 阿司匹林 责编 | 李雪敬 封图 | CSDN 下载自视觉中国 作为已经有4000多名员工的AI独角兽,商汤的一举一动备受关注. 从2018年开始,奔着"开源.统一.可复现&quo ...

  6. 微软、商汤等专家纵论AI未来:三年内主要趋势及挑战是什么?

    编辑 | Leo 出品 | AI科技大本营 近日,品友互动在北京举办了关于人工智能聚焦商业决策的峰会,峰会上品友互动创始人兼CEO黄晓南主持了一场以"掘金人工智能商业决策"为主题的 ...

  7. 专访 | 商汤HPC负责人刘文志(风辰):未来战略的两大方向及招人的4个标准

    记者 | 鸽子 前不久,商汤刚刚完成了4.1亿美金的B轮融资,创下了人工智能领域最大融资金额的记录. 据业界人士透露,之所以能完成这次巨大数额融资,一方面是因为商汤的算法在整个行业处于绝对领先的地位, ...

  8. CVPR Oral:我给大家表演一个无中生有|北航商汤耶鲁

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨秦浩桐@知乎(已授权) 来源丨量子位 编辑丨极市平台 量化,作 ...

  9. CVPR 2021 Oral | 我给大家表演一个无中生有!北航商汤耶鲁新作:DSG

    来源:量子位 量化,作为神经网络压缩和加速的重要手段,往往要依赖真实数据进行校准. 此前,一些无数据量化方法虽然解决了数据依赖问题,但是却存在数据分布和样本同质化问题,致使量化模型的精度下降. 现在, ...

最新文章

  1. Oracle学习之三 程序控制结构
  2. LaTeX集合运算相关命令
  3. spark executor内存分配_二十二、Spark之图解Executor端内存管理
  4. 设计模式经典书籍推荐
  5. c语言中指针几个字节,【C++】一个指针占几个字节?为什么呢?
  6. SEO搜索引擎优化总结
  7. idea设置黑色经典样式Darcula
  8. [读书笔记]多线程学习笔记
  9. ​数据科学家必须了解的事:中心极限定理
  10. 【大学】我的大学四年
  11. Archlinux双显卡安装NVIDIA闭源驱动
  12. 中英互译词典(二叉搜索树)
  13. 【Aegisub相关】Lua程序设计 第4版(中文翻译)
  14. 学习Python 霍兰德人格分析雷达图
  15. 中电金信冰雪运动「数字化转型」赛场,来了一队选手
  16. uni-app的下订单页显示
  17. 垃圾回收概述(垃圾回收算法)
  18. 渗透测试-靶机打靶思路与方法
  19. 车规级CAN FD收发器SIT1044Q,能替代TJA1044吗?
  20. PHP做视频网站,让程序自动实现视频格式转换、设置视频大小、生成视频缩略图...

热门文章

  1. SaaS模式在国内的基本现状研究
  2. 安卓APP上线各应用商店-最新版
  3. 一个非常简单的flash制作工具
  4. developerWorks Java 技术专区-这里有数百篇关于 Java 编程各个方面的文章
  5. 松松团队举办了夏季团建烧烤活动
  6. Maven 中央仓库地址大全
  7. 【R】【lm()】初理解
  8. NLP系列(5)_从朴素贝叶斯到N-gram语言模型
  9. ArcGIS数据采集和处理
  10. springboot嵌入式数据库H2初探