博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IC/FPGA笔试题分析(六)用16bit加法器IP核实现8bit乘法运算(文末彩蛋)
阅读量:2027 次
发布时间:2019-04-28

本文共 2045 字,大约阅读时间需要 6 分钟。

本来突发奇想,想建立一个群来召集各路同行加入,共同讨论数字IC以及FPGA方向的笔试,面试题目,效果比想象中的要好,大家气氛很好,踊跃发言,大胆讨论,解决了很多有意思的问题,这里挑出两个题目来记录一下,个人感觉写的很好:

题目是:

本身快被遗忘了的一个题目,被大家的讨论掩盖过去了,可是好题终究还是会被发现,这位大哥就单独告诉我并给出了自己的思路,十分感谢,领教了。

 

module mul8bits(	input clk,	input rst_n,	input [7:0] a,	input [7:0] b,	output reg [15:0] result	);	reg [15:0] areg;	reg [15:0] temp;	reg [3:0] cnt;	always@(posedge clk or negedge rst_n)begin		if(~rst_n) begin			areg <= {8{1'b0}, a};			temp <= 16'd0;			cnt <= 4'd0;			result <= 16'd0;		end		else if(cnt <= 7) begin			cnt <= cnt + 1;			areg <= areg <<1;			if(b[cnt]) begin				temp <= temp + areg;				else temp <= temp;			end		end		else begin			cnt <= cnt;			areg <= {8{1'b0},a};			result <= temp;		end	endendmodule

上面的Verilog设计中,没有用到IP核,加入有一个IP核的例化模板为:

add16 inst_add16(.in1(), //16bit.in2(), //16bit.sout(), //16bit.cout() //1bit进位);

当然还必须要求这个IP核必须在一个时钟内完成,是一个组合逻辑,且组合逻辑延迟不能大于一个时钟周期。

那么我们可以更改设计为:

module mul8bits(	input clk,	input rst_n,	input [7:0] a,	input [7:0] b,	output reg [15:0] result	);	reg [15:0] areg;	reg [15:0] temp;	reg [3:0] cnt;	always@(posedge clk or negedge rst_n)begin		if(~rst_n) begin			areg <= {8{1'b0}, a};			temp <= 16'd0;			cnt <= 4'd0;			result <= 16'd0;		end		else if(cnt <= 7) begin			cnt <= cnt + 1;			areg <= areg <<1;			if(b[cnt]) temp <= temp_w; //调用IP核				else temp <= temp;		end		else begin			cnt <= cnt;			areg <= {8{1'b0},a};			result <= temp;		end	end	wire [15:0] temp_w;	add16 inst_add16(		.in1(temp),		.in2(areg),		.sout(temp_w),		.cout()		);endmodule

本想,自己写一个超前进位加法器来代替这个IP核的,后面再写吧,很晚了。


再给出一个仿真相关的题目:

题目翻译过来就是:

在Verilog中设计模块以满足以下要求。

(1)频率为100MHz的时钟
(2)对时钟敏感的4位宽信号,限制该信号在8到15的范围内随机化16次。

之后也是提问者自己给出的答案,真是提问能激发人的思考呀:

我给出完整代码:

`timescale 1ns/1psmodule random1();reg clk;reg [3:0] out_rand;initial begin    clk  = 0;    forever         #5 clk = ~clk;end//always begin//    #5 clk = ~clk;//endinteger i;initial begin        for(i = 0;i < 16; i = i + 1) begin        @(posedge clk) begin            out_rand = 4'b1000+ {$random}%8;        end    endendendmodule

OK,谢谢各位。


最后还是要邀请更多的同行加入这个IC前端/FPGA笔试面试交流群,加我微信,拉你进群:ljs521615

见链接:

 

 

 

转载地址:http://wqjaf.baihongyu.com/

你可能感兴趣的文章
MySQL中的行级锁,表级锁,页级锁
查看>>
ORACLE 修改SID
查看>>
OpenCV模块分析(转)
查看>>
聊聊我对写好程序的认识
查看>>
OpenSSL源代码学习[转]
查看>>
插件原理2[转自CSDN]
查看>>
COM编程快速入门[转自VCbase]
查看>>
VBA得到word中的超链接
查看>>
ComBSTR的使用
查看>>
硬回车与软回车[转]
查看>>
OpenCV Windows7 VC6.0安装以及HelloWorld
查看>>
编程技巧之表格驱动编程
查看>>
WSAGetLastError()
查看>>
TCP粘包问题 转自CSDN
查看>>
Window下程序计时(转)
查看>>
CUDA程序优化[转]
查看>>
vs2010 常见问题处理
查看>>
各种分布式文件系统
查看>>
带外管理和带内管理
查看>>
负载均衡调度算法简介
查看>>