笔试知识点(数电基础)
1.翻转率:计数器的翻转率,例如4bit计数器翻转率,ABCD,A的翻转率为1/8,B的翻转率为1/4,C的翻转率为1/2,D的翻转率为1。则计数器的翻转率为(1/8+1/4+1/2+1)/8=0.47。只需计算0-7的翻转率即可,0-7的翻转率与8-15是一致的。
2.对于傅里叶变换,时域离散对应频域周期,频域离散对应时域周期。
3.奇偶校验:奇校验:序列中有奇数个1,校验位为0,否则校验位为1;
偶校验:序列中有奇数个1,校验位为1,否则校验位为0.
4.Verilog 保留字
5.卡诺图
6、除法器Verilog实现,组合电路
如图所示,4bit除以4bit,
1、先将两个数位宽扩充至一样,除数左移,被除数右移。
2、扩充后的被除数左移一位,与扩充后的除数比较,若被除数大于除数则,扩充被除数=扩充被除数-扩充除数+1;若小于则扩充除数不变,以此类推到被除数的LSB。
3、最后结果,商为扩充后被除数[被除数位宽-1:0];
余数为扩充和被除数[被除数位宽+除数位宽-1:被除数位宽] 代码如下
parameter DIVISOR_WIDTH = 32//被除数位宽
,parameter DIVIDEND_WIDTH = 32//除数位宽
)(
input wire [DIVISOR_WIDTH-1:0] divisor//被除数
,input wire [DIVIDEND_WIDTH-1:0] dividend//除数
//------------------------------------------------//
,output reg [DIVISOR_WIDTH-1:0] quotient //商
,output reg [DIVIDEND_WIDTH-1:0] remainders//余数
);
//==============================================================================================
//====== define signal ========
//==============================================================================================
(* keep = "TRUE" *) reg [DIVISOR_WIDTH+DIVIDEND_WIDTH-1:0] tempa ; //扩充后被除数
(* keep = "TRUE" *) reg [DIVISOR_WIDTH+DIVIDEND_WIDTH-1:0] tempb ; //扩充后除数
integer i;
//==============================================================================================
//====== behave of RTL ========
//==============================================================================================
//--------------------------------------------------------------------
//------ Calculation ------
//--------------------------------------------------------------------
always @(divisor or dividend)begin
if(dividend != 0)begin
tempa = {{DIVIDEND_WIDTH{1'b0}},divisor};
tempb = {dividend,{DIVISOR_WIDTH{1'b0}}};
for(i = 0;i < DIVISOR_WIDTH;i = i + 1)begin
tempa = {tempa[0 +: (DIVISOR_WIDTH+DIVIDEND_WIDTH-1)],1'b0};
if(tempa[DIVISOR_WIDTH +: DIVIDEND_WIDTH] >= dividend)begin
tempa = tempa - tempb + 1;
end else begin
tempa = tempa;
end
end
quotient = tempa[0 +: DIVISOR_WIDTH];
remainders = tempa[DIVISOR_WIDTH +: DIVIDEND_WIDTH];
$display("@%10t : divisor is %d,dividend is %d/n", $time,divisor,dividend);
$display("@%10t : quotient is %d,remainders is %d/n", $time,quotient,remainders);
end else begin
quotient = {DIVISOR_WIDTH{1'b0}};
remainders = {DIVIDEND_WIDTH{1'b0}};
$display("@%10t : dividend is not a valid value ...", $time);
end
end
endmodule
