笔试
1、 用verilog描述一个debounce逻辑。
//Debounce是一个防抖函数,相当于硬件电路中的按键开关所做的防抖。 module debounce( input clk input nrst input press output press_value output press_flag); reg [3:0] cnt; reg press_reg; always@(posedge clk or negedge nrst) if(!nrst) begin cnt<='d0; press_reg<='d1; end else if(press_reg!=press && cnt<4'b1111) cnt <= cnt + 1'b1; else if (cnt == 4'b1111) cnt<= 'd0; else press_reg<=press; assign press_value = (cnt == 4'b1111)?press:0; endmodule
2.下图为符合某一特征多项式的移位寄存器链,用verilog写出输出信号逻辑(中间信号名可自定义)
module LFSR( input data_in, input clk, input nrst, input [7:0] seed; output data_out); reg [7:0] lsb; reg out always@(posedge clk or negedge nrst) if(!nrst) lsb <= seed; else data_out <= lsb[7] ^data_in; lsb[0] <= lsb[7] ^data_in; lsb[1] <= lsb[7] ^data_in ^lsb[0]; lsb[2] <= lsb[7] ^data_in ^lsb[1] lsb[3] <=lsb[2]; lsb[4] <=lsb[3]; lsb[5] <=lsb[4]^lsb[7] ^data_in; lsb[6] <=lsb[5]; lsb[7] <=lsb[6]^lsb[7] ^data_in; endmodule
3.用verilog实现一个2.5分频电路
module ( input clk_in, input nrst, output clk_out); reg clk_p, clk_n; always@(posedge clk or negedge nrst) if(!nrst) clk_p <= 1'b0; else clk_p <= ~clk_p; always@(nesedge clk or negedge nrst) if(!nrst) clk_n <= 1'b0; else clk_n <= ~clk_n; assign clk_out = clk_n & clk_p; endmodule
4、 如何实现一个数字2倍频电路(思路即可)
一个同或门与一个时钟上升沿有效的D触发器(连接成翻转器)组成,同或门的输入为D触发器输出的非和clk_in,同或门的输出为clk_out;
5.画一个状态机用来检测串行输入的101011序列
6.怎么解决芯片STA分析中出现的setup violation和hold violation
Set up violation 减少寄存器中间的组合逻辑电路的数量,重定时或做成流水线(加寄存器),使用更先进set up time小的工艺库等
Hold violation 加buffer
7.设计一个多时钟切换模块,需要注意哪些方面
时钟切换过程中可能会产生毛刺,
时钟切换前后的频率
Clock切换前后的clock jetter/时钟质量
等等
8.一个1bit信号A和一个10bit信号B,在跨时钟域传输处理上有何异同
单bit信号按照时钟域快慢切换的不同,慢到快可以打两拍,快到慢可以采用电平同步器和脉冲同步器的设计方法
多bit不能采用简单的打两拍,需要采用如异步FIFO,握手信号等方法做跨时钟域
9. 用verilog实现两个8bit有符号数A,B的求和运算,并保证最后的和在-64~63之间//默认有符号数AB的输入形式是原码
module signed_add ( input [7:0] A, input [7:0] B, output [8:0] C); wire [7:0] complement_A; wire [7:0] complement_B; wire [8:0] complement_C; //求AB的补码 assign complement_A = A[7]? {A[7],~A[6:0]}+1'b1: A ; assign complement_B = B[7]? {B[7],~B[6:0]}+1'b1: B ; assign complement_C = complement_A + complement_B; assign C = ($signed(complement_C)>(-64) && $signed(complement_C)<(63) ) ? complement_C[7:0] :0 ; //输出的C也是补码形式,不同工具对补码的表示不一定都支持,有需要再换成原码即可 endmodule
10.设计一个8bit输入的mod 3运算模块(实现思路即可)
mod3运算:除三的余数
使用状态机,除以三的余数的可能性为0,1,2,一共三种状态
8bit输入放在寄存器中
再使用一个从零开始的计数器,每个时钟上升沿自增1,直到和8bit输入相等
在这个过程中,0-1-2-0-1-2,三种状态循环改变
最后相等的时候对应输出所在状态代表的余数即可
一面
聊天,应该没啥培养体系,进来就干活,一对一带教
复试
一个串并转换模块的验证testbench搭建和verificationspec的报告