赞
踩
#平头哥芯片设计
##一面(视频面试)
1、SV基础
2、桶形移位法(项目相关)
桶型移位器是一个多输入、单输出电路。对于输入a[31:0],移位器首先会根据b[4:0]的值来确定移多少位,最后将结果c[31:0]输出。
3、跨时钟域的问题,包括单bit、多bit、详细说明握手协议等,为什么gray码不会产生毛刺?
单bit信号打拍的时候需要考虑时钟频率,当时钟周期大于亚稳态的恢复时间,就可以减小亚稳态继续传播,因此一位同步器需要考虑时钟频率。
异步FIFO使用格雷码的唯一目的就是“即使在亚稳态进行读写指针抽样也能进行正确的空满状态判断”。在异步FIFO中,采用格雷码进行技术,相邻的数据仅仅只有1bit变化,这样在两个时钟域同步的时候仅仅只有1bit产生亚稳态,通过同步后,亚稳态会消除,最坏的情况就是这1bit采错,但是即使是采错地址也只是相差1个,这对判断空满标志不会产生影响。如果是采用10进制进行编码,则相邻的数据可能有多位同时变化,那么如果多位同时产生亚稳态而且同时采错数据,会对寄存器的空满标志做出严重错误的判断,会丢失数据或者读出无用的数据,使系统出错。
时钟快慢有差别的时候,同步化的格雷码变化两次但是采样一次,根据同步化的值可以发现有两个bit,这会不会导致多位同步化问题? 答案是不会的,虽然格雷码呈现出的结果是变化了两个bit,但是它是在顺序变化的,第一次变化稳定后,第二次变化在第一次的基础上根据同步化后的时钟上升沿进行变化,这就不涉及多位变化问题。比如低时钟域从4变化到6格雷码那就是从0110----0111----0101。假设高时钟周期为低时钟的两倍,那么高时钟采集0110之后,下次再采集0101之时,0111(5)的状态必然是稳定的,所以你采集的数据要么是5要么是6,而不会出现4或者其他的中间数据。
4、加法器的具体实现Verilog
//半加器:另个一位输入实现的,与全加器的区别就是不带进位加
module half_adder(
input a,
input b,
output sum,
output cout
);
assign sum = a^b;
assign cout = a&b;
endmodule
//全加器 //进位输出:Ci+1=AiBi+AiCi+BiCi=AiBi+(Ai+Bi)Ci //和输出:SI=Ai^Bi^Ci module full_adder( input a, input b, input c, output sum, output cout ); wire sum1; wire cout1,cout2; half_adder half_adder1( .a(a), .b(b), .sum(sum1), .cout(cout1) ); half_adder half_adder2( .a(co), .b(sum1), .sum(sum), .cout(cout2) ); assign cout = cout1 | cout2; endmodule
module full_add_8_gate( A, B, cin, S, co); input [7:0] A,B; input cin; output [7:0] S; output co; wire [7:0] C; full_add_1_gate uut0( .A(A[0]), .B(B[0]), .cin(cin), .S(S[0]), .co(C[0]) ); full_add_1_gate uut1( .A(A[1]), .B(B[1]), .cin(C[0]), .S(S[1]), .co(C[1]) ); full_add_1_gate uut2( .A(A[2]), .B(B[2]), .cin(C[1]), .S(S[2]), .co(C[2]) ); full_add_1_gate uut3( .A(A[3]), .B(B[3]), .cin(C[2]), .S(S[3]), .co(C[3]) ); full_add_1_gate uut4( .A(A[4]), .B(B[4]), .cin(C[3]), .S(S[4]), .co(C[4]) ); full_add_1_gate uut5( .A(A[5]), .B(B[5]), .cin(C[4]), .S(S[5]), .co(C[5]) ); full_add_1_gate uut6( .A(A[6]), .B(B[6]), .cin(C[5]), .S(S[6]), .co(C[6]) ); full_add_1_gate uut7( .A(A[7]), .B(B[7]), .cin(C[6]), .S(S[7]), .co(C[7]) ); assign co=C[7]; endmodule
平常在代码中直接用+符号实现的是行为及的描述;
5、FPGA上怎么实现浮点的加法乘法运算?
有些FPGA中是不能直接对浮点数进行操作的,只能采用定点数进行数值运算。对于FPGA而言,参与数学运算的数就是16位的整型数,但如果数学运算中出现小数怎么办呢?要知道,FPGA对小数是无能为力的,一种解决办法就是采用定标。数的定标就是将要运算的浮点数扩大很多倍,然后取整,再用这个数进行运算,运算得到的结果再缩小相应的倍数就可以了。在设计中,一定不要忘记小数点。在FPGA 中是体现不出来小数点的,小数点的位置只有程序员知道。Q表示小数点的位置,Q15就表示小数点在第15位。
浮点数(x)转换为定点数(xq): xq=(int)x2^Q
定点数(xq)转换浮点数(x): x= (float)xq2^(-Q)
比如,16进制数2000H,用Q0表示就是8192;若用Q15表示,则为0.25。
下面介绍Q格式运算中Q值的确定:
(1)定点加减法:需要转换成相同Q格式才能加减
(2)定点乘法:不同Q格式的数据相乘,相当于Q值相加
(3)定点除法:不同Q格式的数据相除,相当于Q值相减
(4)定点左移:相当于Q值增加
(5)定点右移:相当于Q值减少
比如,Q15表示的4000H(浮点数0.5)乘以Q15表示的4000H,4000H×4000H=1000 0000H,乘完之后Q值变为15+15=30,即结果为0.01B,即为浮点数0.25。
6、Verilog的四值逻辑?那么在一个选择器的使用过程中,若选择信号是X的时候,输出是什么,即if else中的if的条件为X的时候?
0、1、X、Z
(1)
assign c=(sel)?a:b;
(2)
always @(sel or a or b)
begin
if(sel)
c = a;
else
c = b;
end
第一种好。
if else的逻辑是:只要条件不符合,就走else路。
试想如果上级电路出错,出现sel=1’bx的时候,那么代码(2)的c就会走else路=b。
而? :的运行结果跟实际电路更接近:连控制端sel都是不定值了,那c毫无疑问地应该是x,除非a=b。
总之,代码(1)在综合结果、资源利用等方面和(2)是完全一致的,但(1)的前仿结果跟后仿、跟实际电路更接近。
7、什么时候会产生latch,case语句一定会产生latch吗,if else呢?
链接: https://blog.csdn.net/Leo_Luo1/article/details/72848764?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.edu_weight.
链接: https://www.cnblogs.com/lianjiehere/p/3788334.html.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。