笔试知识点(数电基础)

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 保留字 alt 5.卡诺图 alt alt

6、除法器Verilog实现,组合电路

alt

如图所示,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
全部评论

相关推荐

冲鸭2024:亚信不去也罢
投递亚信科技(中国)有限公司等公司6个岗位
点赞 评论 收藏
分享
牛客41406533...:回答他在课上学,一辈子待在学校的老教授用三十年前的祖传PPT一字一句的讲解,使用谭浩强红皮书作为教材在devc++里面敲出a+++++a的瞬间爆出114514个编译错误来学这样才显得专业
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务