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
    +关注

    关注

    1625

    文章

    21664

    浏览量

    601723
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136130
  • 编程
    +关注

    关注

    88

    文章

    3587

    浏览量

    93585

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

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

收藏 人收藏

    评论

    相关推荐

    ADS1256 8通依次采样,数据不正确怎么解决?

    SPI总线速度1.40625MB/S,基于STM32的HAL库下,对八通输入同一道方波,方波频率20HZ、40HZ、60HZ时,会出现只有部分通道采样的数据能显示波形,输入其他频率的方波时,会存在采样到的数据显示的波形占空比与输入方波的占空比不相同,这种情况是属于寄存器
    发表于 11-22 07:09

    Kimi发布新一代数学推理模型k0-math

    、考研以及包含入门竞赛的MATH等四个数学基准测试中,k0-math初代模型的表现超越了o1-mini和o1-preview模型。而在两个难度更高的竞赛级别数学题库OMNI-MATH和AIME基准
    的头像 发表于 11-18 11:38 249次阅读

    求解智能韧性,华为方程写下答案

    续写麦特卡夫定律,华为方程解锁智能韧性
    的头像 发表于 09-30 14:37 1958次阅读
    求解智能韧性,华为<b class='flag-5'>用</b>三<b class='flag-5'>道</b>方程写下答案

    好未来与微软开展合作,携手构建智慧学习生态系统

    想象下,你正在一道复杂的数学题。这难度不小,你解题时遇到了瓶颈。这时,位“老师”出现在你
    的头像 发表于 08-20 10:12 489次阅读

    Verilog testbench问题求助

    这是我在HDLbits网站上做到的一道,是testbench,请问这个代码为什么input都是低电平0?我设置的时钟就是周期10ns,占空比50%的时钟信号啊?怎么会出现这种情况......
    发表于 07-21 11:14

    DS90CR486 133MHz 48位通链路串器数据表

    电子发烧友网站提供《DS90CR486 133MHz 48位通链路串器数据表.pdf》资料免费下载
    发表于 07-02 09:52 0次下载
    DS90CR486 133MHz 48位通<b class='flag-5'>道</b>链路<b class='flag-5'>解</b>串器数据表

    DS92LV3241/3242 32位通Link II串行器/串器数据表

    电子发烧友网站提供《DS92LV3241/3242 32位通Link II串行器/串器数据表.pdf》资料免费下载
    发表于 07-01 09:58 0次下载
    DS92LV3241/3242 32位通<b class='flag-5'>道</b>Link II串行器/<b class='flag-5'>解</b>串器数据表

    DS92LV1260六通10位BLVDS串器数据表

    电子发烧友网站提供《DS92LV1260六通10位BLVDS串器数据表.pdf》资料免费下载
    发表于 07-01 09:41 0次下载
    DS92LV1260六通<b class='flag-5'>道</b>10位BLVDS<b class='flag-5'>解</b>串器数据表

    18年,6570个日夜,小熊电器何以撩动年轻人?

    小熊电器,十八年一道“年轻方程式”
    的头像 发表于 03-25 09:23 1837次阅读
    18年,6570个日夜,小熊电器何以撩动年轻人?

    fpga的是什么编程语言 fpga什么语言开发

    fpga的是什么编程语言 FPGA(现场可编程逻辑门阵列)主要使用的编程语言是硬件描述语言(HDL)。在众多的HDL中,Verilog HDL和VHDL是最常用的两种。 Verilog HDL
    的头像 发表于 03-14 17:09 3307次阅读

    谷歌推出AI框架,实现AI模型的自然语言学习

    据了解,在此款“社交学习”框架中,“学生模型”可向多位已处理指定任务的“教师模型”请教各类应对方案,研究团队主要通过开展“垃圾短信检测”、“解决小学数学题”及“根据文本回答问题”等多项试验,以衡量此框架的运作效果。
    的头像 发表于 03-11 11:36 882次阅读

    AI大模型落地学习机,大模型应用成学习机创新方向

    技术的学习机,也被称为AI学习机。   AI 大模型落地学习机   去年底,学而思就发布了学习机新品xPad2 Pro系列,该学习机搭载学而思大模型MathGPT(中文名:九章大模型)。据称MathGPT可以实现对小学初中的任何一道数学
    的头像 发表于 02-23 01:19 3787次阅读

    FPGA控制AD7991进行四通转换时,需要注意些什么?

    FPGA控制AD7991进行四通转换时,需要注意些什么?如何确定是否配置正确?
    发表于 12-22 06:39

    从 0 到 1 搭建机器人系列 | 利用 Isaac AMR 轻松部署机器人车队

    从简单的巡逻和监控到复杂的搜索和救援行动,就像个超级高效的机器样。 问 机器人车队高效协作的秘诀又是什么呢? 答 集体智慧+交通规则。想象下,当你在做一道复杂的
    的头像 发表于 12-07 10:20 387次阅读
    从 0 到 1 搭建机器人系列 | 利用 Isaac AMR 轻松部署机器人车队

    半导体芯片切割,一道精细工艺的科技之门

    在半导体制造的过程中,芯片切割是一道重要的环节,它不仅决定了芯片的尺寸和形状,还直接影响到芯片的性能和使用效果。随着科技的不断进步,芯片切割技术也在不断发展,成为半导体制造领域中一道精细
    的头像 发表于 11-30 18:04 1259次阅读
    半导体芯片切割,<b class='flag-5'>一道</b>精细工艺的科技之门