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

    关注

    1600

    文章

    21281

    浏览量

    592852
  • C语言
    +关注

    关注

    180

    文章

    7522

    浏览量

    127485
  • 编程
    +关注

    关注

    88

    文章

    3438

    浏览量

    92321

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    在线刷 ego-link.cn#FPGA #FPGA比赛 #FPGA学习

    fpga
    F学社
    发布于 :2024年01月15日 17:29:27

    ego-link.cn #FPGA #FPGA #FPGA点拨

    fpga数据中心
    F学社
    发布于 :2024年01月11日 23:08:59

    文带你了解FPGA直方图操作

    后面慢慢介绍,先重点介绍直方图均衡。公众号:OpenFPGA 直方图统计及FPGA实现 从数学上来说,图像直方图描述的是图像各个灰度级的统计特性,它是图像灰度值的
    发表于 01-10 15:07

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

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

    #FPGA #电子制作 MDY刷酷和网上的有何不同?#FPGA

    fpga
    明德扬助教小易老师
    发布于 :2023年12月22日 06:25:11

    #FPGA入门 #FPGA考试 FPGA逻辑设计小程序刷训练

    fpga
    明德扬助教小易老师
    发布于 :2023年12月16日 11:10:34

    AD9684与FPGALVDS模式接口互联时,FPGA端如何使用?

    咨询个初级A/D问题:AD9684中DCO时钟的用法(FPGA控制)。AD9684与FPGALVDS模式接口互联时,FPGA端如何使用?
    发表于 12-13 09:01

    文解答!FPGA是什么?怎么学?就业情况怎么样?

    ) 06.初学者建议从这四个经典案例上手 (1)led 点亮led灯不管是在嵌入式还是FPGA的学习中都是初学者必须要迈过的第一道坎。虽然在网上通常被人调侃称“点灯大师”或“灯大师”,但是依然无法
    发表于 10-13 14:17

    重磅!OpenAI在ChatGPT内推出语言和图像功能

    语音和图像为用户在生活中使用 ChatGPT 提供了更多方式。旅行时,拍下地标性建筑的照片,然后就它的有趣之处进行实时对话。当您在家时,拍下冰箱和储藏室的照片,找出晚餐的菜谱(并提出后续问题,一步步了解菜谱)。晚饭后,帮孩子做一道数学题,拍下照片,圈出问题集,让孩子与您分
    的头像 发表于 09-26 17:05 412次阅读
    重磅!OpenAI在ChatGPT内推出语言和图像功能

    国内首个数学千亿大模型MathGPT上线开启公测

    用户使用MathGPT时,用文字或图片方式上传数学题,即可得到对话式的解答反馈,也可以通过“随机来一题”的按钮,随机生成数学题目并由系统给出解答。目前,MathGPT支持中文、英文版本的PC端和移动端体验。
    的头像 发表于 08-24 14:55 483次阅读
    国内首个<b class='flag-5'>数学</b>千亿大模型MathGPT上线开启公测

    浅谈FPGA的六大应用领域

    FPGA 所能应用的领域大概可以分成六大类,下面听我一一道来。
    发表于 08-09 10:14 408次阅读

    FPGA实现MPU6050姿态

    . 简介 在之前的文章中(很久之前了,已经通过FPGA获取到了MPU6050的六轴数据: 三轴加速 和 三轴角速度,但是没有对它进行然后处理。那么在本篇文章中,将利用Cordic算法来进行姿态
    发表于 06-08 13:49

    fpga开发什么软件?

    fpga开发什么软件?
    发表于 05-30 20:54

    如何在FPGA中进行简单和复杂的数学运算?

    由于FPGA可以对算法进行并行化,所以FPGA 非常适合在可编程逻辑中实现数学运算。
    发表于 05-15 11:29 2246次阅读
    如何在<b class='flag-5'>FPGA</b>中进行简单和复杂的<b class='flag-5'>数学</b>运算?