0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用FPGA解一道初中数学题

Q4MP_gh_c472c21 来源:电子电路开发学习 作者:wcc149 2022-05-13 14:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前几天和同事聊天,他说他上初中的儿子做出了一道很难的数学题,想考考我们这些大学生看能不能做得出来?

题目很简单:

b04b8f86-d273-11ec-bce3-dac502259ad0.jpg

数学题目

大家先尝试做一下?我没想出怎么算的,只是用排除法确定了a和b的范围,然后再逐个尝试。

1.对4361进行开方计算,得到结果最大为66,则a,b的值均小于等于66。

2.对4361/2进行开方计算,则得到结果为46,则a,b两者,一个是1-46,一个是46-66之间的数。

3.由平方和4361末尾为1,再根据整数平方和的几种可能,计算出仅有0+1和5+6这两种可能,而且平方之后的个位数为0/1/5/6,这样就进一步缩小了范围,通过多次计算尝试可以得出结果。

不过我懒得算了,就简单写了个C语言程序,计算出了结果:

#include
#include
#include

intmain(void)
{
intnum;
inta,b,n;
intresult;
intsqr;

printf("pleaseenteranumber:");//4361
scanf("%d",&num);
printf("inputnum:%d
",num);

sqr=sqrt(num);
for(a=1;a<= sqr; a++)        //可以设置1-46
{
for(b=1;b<= sqr; b++)    //可以设置46-66
{
result=pow(a,2)+pow(b,2);
if(result==num)
{
printf("a=%2d,b=%2d,a+b=%d
",a,b,a+b);
n++;
}
}
}
if(n==0)
printf("Thereisnoanswer!
");

return0;
}

其实可以设置一个数的循环范围是:1-46,一个数的循环范围是46-66,这样会减少循环次数。

运行结果:

b06ff7ea-d273-11ec-bce3-dac502259ad0.jpg运行结果

而且这种方式还适用于解的个数不唯一的情况,比如7605:

b0e66cfe-d273-11ec-bce3-dac502259ad0.jpg运行结果

作为一个野生FPGA开发者,我在想能不能用FPGA的编程思想来实现呢?也就是如何用Verilog来实现两个循环的嵌套呢?抄起键盘就是干!

verilog源文件fpga_math.v:

modulefpga_math(
//inputs
inputclk,
inputrst_n,

//outputs
outputreg[13:0]a,b,
outputreg[14:0]result,
outputok
);

parameterSUM=4361;
parameterSQR=67;//sqrt(SUM);

reg[13:0]tmp_a;
reg[13:0]tmp_b;
regflag;

assignok=(tmp_a*tmp_a+tmp_b*tmp_b==SUM);

always@(posedgeclk)
begin
if(!rst_n)
tmp_b<=0;
elseif(tmp_b==SQR)
tmp_b<= 0;
elseif(tmp_a!=SQR)
tmp_b<= tmp_b + 1;
end

always@(posedgeclk)
begin
if(!rst_n)
flag<=0;
elseif(tmp_b==SQR)
flag<= 1;
else
flag<= 0;
end

always@(posedgeclk)
begin
if(!rst_n)
tmp_a<=0;
elseif((tmp_a!=SQR)&flag)
tmp_a<= tmp_a + 1;
end

always@(posedgeclk)
begin
if(!rst_n)
begin
a<=0;
b<= 0;
result<= 0;
end
elseif(ok)
begin
a<=tmp_a;
b<= tmp_b;
        result = tmp_a + tmp_b;
    end
end

endmodule

为了验证这个模块的正确性,我们需要对这个模块进行仿真,即给一个激励输入信号,看输出是否正确。

新建testbench文件fpga_math_tb.v:

`timescale1ns/100ps

modulefpga_math_tb;

parameterSUM=4361;
parameterSQR=67;//sqrt(4361)

parameterSYSCLK_PERIOD=10;//100MHZ

wire[13:0]a,b;
wire[14:0]result;

regSYSCLK;
regNSYSRESET;

initial
begin
SYSCLK=1'b0;
NSYSRESET=1'b0;

#(SYSCLK_PERIOD*10)
NSYSRESET=1'b1;
#(SYSCLK_PERIOD*(SQR*SQR+500))
$stop;
end

/*generateclock*/
always@(SYSCLK)
#(SYSCLK_PERIOD/2.0)SYSCLK<= !SYSCLK;       

/*instancemodule*/
fpga_math#(
.SUM(SUM),
.SQR(SQR)
)fpga_math_0(
//inputs
.clk(SYSCLK),
.rst_n(NSYSRESET),

//outputs
.a(a),
.b(b),
.result(result),
.ok(ok)
);

endmodule

ModelSim仿真波形:

b115143c-d273-11ec-bce3-dac502259ad0.jpg仿真波形

仿真工具除了使用各大FPGA厂商IDE带的ModelSim等,也可以使用小巧开源的全平台仿真工具:iverilog+gtkwave,使用方法可以参考:

全平台轻量开源verilog仿真工具iverilog+GTKWave使用教程

如果使用iverilog进行仿真,需要在TB文件中添加以下几行语句:

/*iverilog*/
initial
begin
$dumpfile("wave.vcd");//生成的vcd文件名称
$dumpvars(0,fpga_math_tb);//tb模块名称
end
/*iverilog*

首先,对Verilog源文件进行编译,检查是否有语法错误,这会在当前目录生成wave目标文件:

iverilog-owave*.v

然后通过vvp指令,产生仿真的wave.vcd波形文件:

vvp-nwave-lxt2

使用gtkwave打开波形文件:

gtkwavewave.vcd

当然,以上命令也可以写成批处理文件:

echo"开始编译"
iverilog-owave*.v
echo"编译完成"
echo"生成波形文件"
vvp-nwave-lxt2
echo"打开波形文件"
gtkwavewave.vcd

以文本方式存储为build.bat文件即可,双击即可自动完成编译、生成波形文件、打开波形文件操作。

仿真波形:

b134afc2-d273-11ec-bce3-dac502259ad0.jpg仿真波形

可以看出,和使用ModelSim仿真是一样的结果。

总结

从仿真波形图中,可以得到计算的结果,a+b的值为91,如果要在真实的FPGA芯片硬件上实现,还需要添加其他功能模块,把结果通过串口输出,或者在数码管等显示屏上进行显示,这里只是简单介绍使用FPGA计算方法的实现。

作为纯数字电路的FPGA,实现平方根是比较复杂的,这里采用直接人为输入平方根结果的方式,而不是像C语言那样调用sqrt函数自动计算平方根。

FPGA中不仅有触发器和查找表,而且还有乘法器、除法器等硬核IP,所以在涉及到乘除法、平方根运算时,不要直接使用*/等运算符,而是要使用FPGA自带的IP核,这样就不会占用大量的逻辑资源,像Xilinx的基于Cordic算法的Cordic IP核,不仅能实现平方根计算,而且还有sin/cos/tan/arctan等三角函数。

END 审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1665

    文章

    22611

    浏览量

    642030
  • C语言
    +关注

    关注

    183

    文章

    7650

    浏览量

    146634
  • 编程
    +关注

    关注

    90

    文章

    3738

    浏览量

    97635

原文标题:如何用FPGA解一道初中数学题?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    揭秘半导体后封装辅助小设备:UV胶机的三大硬指标与未来趋势

    的MES系统通讯,实现远程监控和故障预警。 看光源寿命:确认使用的是进口或线品牌LED灯珠,寿命应在2万小时以上,以保证长期产能稳定。 半导体UV胶机虽小,却是守护芯片良率的最后一道防线。随着芯片制程越来越精密,这台设备正向
    发表于 05-14 10:19

    MAX9286:四通1.5Gbps GMSL串器的技术解析

    MAX9286:四通1.5Gbps GMSL串器的技术解析 在电子设计领域,高速数据传输和处理直是关键需求。今天我们要介绍款非常实用的器件——MAX9286四通
    的头像 发表于 05-12 17:50 899次阅读

    芯片的“第一道体检”:文读懂CP测试,半导体人必看!

    在芯片从晶圆到成品的漫长旅程里,有一道看不见却至关重要的关卡——CP测试。它被称为芯片良率的“守门员”、封装成本的“节流阀”,更是半导体产业链里前端制造与后端封测之间的关键枢纽。今天这篇,通俗
    的头像 发表于 04-17 10:03 1360次阅读
    芯片的“第<b class='flag-5'>一道</b>体检”:<b class='flag-5'>一</b>文读懂CP测试,半导体人必看!

    EOL测试系统——电池包下线前的最后一道品质防线

    在储能电池包的生产线上,EOL测试系统 是产品交付前的最后一道关口,也是最重要的品质防线。EOL测试的全面性与可靠性,直接决定了流入市场的储能产品是否存在早期失效风险。 个完整的电池包EOL测试
    的头像 发表于 03-23 16:40 733次阅读
    EOL测试系统——电池包下线前的最后<b class='flag-5'>一道</b>品质防线

    SGM7300AN:高性能2通2:1复用/复用开关

    SGM7300AN:高性能2通2:1复用/复用开关 在高速串行接口应用领域,款性能卓越的开关器件能为系统带来更稳定、高效的信号传输。今天,我们就来深入了解下SGMICRO推出
    的头像 发表于 03-17 16:30 286次阅读

    红区破局之道:为什么防逆流装置是“第一道防线”?

    当之无愧的“第一道防线”。它不像四可装置那样兼具“可观可测、可控可调”的全链条能力,却能以最直接、最精准的方式,守住红区光伏并网的安全底线,为后续精细化管控、高效消纳筑牢基础——没有这道防线,红区光伏的合规运营、收益保障都将无从谈起。
    的头像 发表于 03-16 15:32 896次阅读
    红区破局之道:为什么防逆流装置是“第<b class='flag-5'>一道</b>防线”?

    智慧矿山能耗监测新模式!投入减半,运维0成本!

    国家“双碳”战略的发条越拧越紧。对于矿山、化工、建材等高耗能行业来说,这不再是一道“加分”,而是一道“生死”。尤其是矿石选别环节,破碎、筛分、磨矿三大工序的电耗占比往往超过全厂的7
    的头像 发表于 02-04 17:02 635次阅读
    智慧矿山能耗监测新模式!投入减半,运维0成本!

    SCAN926260:六通1:10总线LVDS串器的深度剖析

    SCAN926260:六通1:10总线LVDS串器的深度剖析 在电子设计领域,数据传输的高效性和稳定性至关重要。今天,我们要深入探讨款功能强大的串器——SCAN926260,它
    的头像 发表于 12-30 15:05 500次阅读

    3秒响应、实时告警!智能井盖如何成为城市安全的“第一道防线”?

    IP68防护、-40℃~80℃宽温运行及10年超长续航,支持自定义报警阈值与多级告警机制,大幅降低误报率。作为城市物联网感知层的关键节点,智能井盖已融入智慧城管与应急管理体系,成为守护市民脚下安全的“第一道防线”。
    的头像 发表于 12-09 11:57 563次阅读
    3秒响应、实时告警!智能井盖如何成为城市安全的“第<b class='flag-5'>一道</b>防线”?

    不间断电源(UPS):电力保障的“最后一道防线”

    (UninterruptiblePowerSupply,简称UPS)作为电力保障的“最后一道防线”,通过储能装置与智能转换技术,在市电中断时实现零切换时间供电,成为现代社会的“电力守护者”。、UP
    的头像 发表于 10-29 09:02 2217次阅读
    不间断电源(UPS):电力保障的“最后<b class='flag-5'>一道</b>防线”

    【赛补充说明】2025全国大学生FPGA创新设计竞赛紫光同创杯赛

    【赛发布】2025年全国大学生FPGA创新设计竞赛紫光同创杯赛邀您鸿图展翼共赴芯程!【赛知多少】紫光同创赛答疑专场|2025年全国大学生嵌入式芯片与系统设计竞赛
    的头像 发表于 09-12 16:03 2695次阅读
    【赛<b class='flag-5'>题</b>补充说明】2025全国大学生<b class='flag-5'>FPGA</b>创新设计竞赛紫光同创杯赛

    【赛教程】基于RK3568+PG2L50H实现八路视频输入参考方案

    【赛发布】2025年全国大学生FPGA创新设计竞赛紫光同创杯赛邀您鸿图展翼共赴芯程!重磅!全国FPGA大赛紫光同创杯提交作品即送FPGA开发板!【赛
    的头像 发表于 09-12 16:03 1958次阅读
    【赛<b class='flag-5'>题</b>教程】基于RK3568+PG2L50H实现八路视频输入参考方案

    顶坚国产防爆手持终端如何成为石化企业安全生产的第一道防线

    顶坚国产防爆手持终端之所以能成为石化企业安全生产的第一道防线,源于其通过防爆设计、功能集成、实时交互与系统协同,从物理安全、功能安全、管理安全、应急安全等维度,覆盖了安全生产的全流程(预防、监测
    的头像 发表于 08-26 10:31 1092次阅读
    顶坚国产防爆手持终端如何成为石化企业安全生产的第<b class='flag-5'>一道</b>防线

    国产替代最优 易冲半导体推出12/16通ADB大灯LED矩阵控制器

    国产替代最优 易冲半导体推出12/16通ADB大灯LED矩阵控制器
    的头像 发表于 08-08 16:21 2.7w次阅读
    国产替代最优<b class='flag-5'>解</b> 易冲半导体推出12/16通<b class='flag-5'>道</b>ADB大灯LED矩阵控制器

    【赛知多少】 紫光同创赛答疑专场|2025年全国大学生嵌入式芯片与系统设计竞赛FPGA赛道

    紫光同创赛道答疑专场来啦!2025年全国大学生嵌入式芯片与系统设计竞赛报名已拉开帷幕,FPGA赛道的挑战与创新并存。近期,我们收到许多关于赛的咨询,小眼睛科技团队第时间整理了大家的疑问,并带来
    的头像 发表于 08-06 11:02 3992次阅读
    【赛<b class='flag-5'>题</b>知多少】 紫光同创赛<b class='flag-5'>题</b>答疑专场|2025年全国大学生嵌入式芯片与系统设计竞赛<b class='flag-5'>FPGA</b>赛道