CN110598857B - 一种显示Izhikevich神经元模型的方法 - Google Patents
一种显示Izhikevich神经元模型的方法 Download PDFInfo
- Publication number
- CN110598857B CN110598857B CN201910399204.XA CN201910399204A CN110598857B CN 110598857 B CN110598857 B CN 110598857B CN 201910399204 A CN201910399204 A CN 201910399204A CN 110598857 B CN110598857 B CN 110598857B
- Authority
- CN
- China
- Prior art keywords
- module
- clicking
- izhikevich
- selecting
- page
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 79
- 210000002569 neuron Anatomy 0.000 title claims abstract description 79
- 238000004364 calculation method Methods 0.000 claims abstract description 23
- 238000012545 processing Methods 0.000 claims abstract description 9
- 238000004088 simulation Methods 0.000 claims description 22
- 239000012528 membrane Substances 0.000 claims description 20
- 238000011070 membrane recovery Methods 0.000 claims description 17
- 238000012360 testing method Methods 0.000 claims description 17
- 230000008569 process Effects 0.000 claims description 11
- 230000001537 neural effect Effects 0.000 claims description 9
- 230000000630 rising effect Effects 0.000 claims description 9
- 238000004458 analytical method Methods 0.000 claims description 6
- 230000015572 biosynthetic process Effects 0.000 claims description 6
- 238000007667 floating Methods 0.000 claims description 6
- 238000011084 recovery Methods 0.000 claims description 6
- 238000003786 synthesis reaction Methods 0.000 claims description 6
- 229920000729 poly(L-lysine) polymer Polymers 0.000 claims description 4
- 230000001360 synchronised effect Effects 0.000 claims description 4
- 239000013078 crystal Substances 0.000 claims description 3
- 230000007704 transition Effects 0.000 claims description 3
- 238000010586 diagram Methods 0.000 description 10
- 238000005516 engineering process Methods 0.000 description 6
- 230000008901 benefit Effects 0.000 description 4
- 230000007547 defect Effects 0.000 description 4
- 238000004422 calculation algorithm Methods 0.000 description 3
- 238000006243 chemical reaction Methods 0.000 description 3
- NAWXUBYGYWOOIX-SFHVURJKSA-N (2s)-2-[[4-[2-(2,4-diaminoquinazolin-6-yl)ethyl]benzoyl]amino]-4-methylidenepentanedioic acid Chemical compound C1=CC2=NC(N)=NC(N)=C2C=C1CCC1=CC=C(C(=O)N[C@@H](CC(=C)C(O)=O)C(O)=O)C=C1 NAWXUBYGYWOOIX-SFHVURJKSA-N 0.000 description 2
- 230000002964 excitative effect Effects 0.000 description 2
- 230000010354 integration Effects 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 239000011664 nicotinic acid Substances 0.000 description 2
- 238000012795 verification Methods 0.000 description 2
- 210000000857 visual cortex Anatomy 0.000 description 2
- 101100136840 Dictyostelium discoideum plip gene Proteins 0.000 description 1
- 101150103491 Ptpmt1 gene Proteins 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 238000013528 artificial neural network Methods 0.000 description 1
- 210000004227 basal ganglia Anatomy 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000013527 convolutional neural network Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000002474 experimental method Methods 0.000 description 1
- 238000010304 firing Methods 0.000 description 1
- 230000002401 inhibitory effect Effects 0.000 description 1
- 210000000956 olfactory bulb Anatomy 0.000 description 1
- 238000010926 purge Methods 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 230000000638 stimulation Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4498—Finite state machines
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/06—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
- G06N3/061—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons using biological neurons, e.g. biological neurons connected to an integrated circuit
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/06—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
- G06N3/063—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons using electronic means
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Health & Medical Sciences (AREA)
- Life Sciences & Earth Sciences (AREA)
- Biomedical Technology (AREA)
- Biophysics (AREA)
- General Physics & Mathematics (AREA)
- Neurology (AREA)
- Molecular Biology (AREA)
- Artificial Intelligence (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Evolutionary Computation (AREA)
- General Health & Medical Sciences (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Microelectronics & Electronic Packaging (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本发明一种显示Izhikevich神经元模型的方法,涉及用于系统生物学的建模或仿真的数字计算或数据处理或方法,本发明方法使用四阶龙格库塔法将Izhikevich神经元模型离散化,通过FPGA硬件建模,并在示波器上对Izhikevich神经元模型进行显示和验证,克服了现有技术中的Izhikevich神经元模型部分使用欧拉法离散化,存在使用欧拉法即一阶龙格库塔法显示Izhikevich神经元模型数据误差大且精度低的缺陷。
Description
技术领域
本发明的技术方案涉及用于系统生物学的建模或仿真的数字计算或数据处理或方法,具体地说是一种显示Izhikevich神经元模型的方法。
背景技术
为了模拟生物神经元发放脉冲的特性,研究人员从不同的应用角度和方法提出了多种模型,比较典型的有H-H神经元模型、IF神经元模型和Izhikevich神经元模型。H-H神经元模型参量最为丰富,可以很精确的模拟真实神经元对电流脉冲的反应,但是执行起来成本非常高,不适合长时间和大规模的网络仿真。IF神经元模型是线性方程,对计算的要求相对较低,但是不能够展现出神经元的大部分基本性质。而Izhikevich神经元模型结合了H-H神经元模型和IF神经元模型的优点,既能够很好的展现真实神经元特性又耗时短、成本低,所以Izhikevich神经元模型是比较理想的脉冲神经元模型。
使用传统软件处理信息,例如仿真软件MATLAB,由于其存在并行程度低和速度慢的缺陷,许多需要进行现场实时处理的复杂数据信息得不到及时处理,另外用软件实现所需计算机体积庞大,不适合嵌入式场合的应用。现场可编程逻辑门阵列(以下均简称FPGA)已经发展成为集成电路设计的主要硬件平台,因其体积小、集成度高、可重复配置、低功耗、处理速度快,易于满足实时性要求的优点,能够对神经元模型进行仿真和验证,提高运算效率,目前已经被用于研究神经元模型的研究。
CN104615909B公开了基于FPGA的Izhikevich神经元网络同步放电仿真平台,CN104689473A公开了基于FPGA的电刺激下神经元随机响应及共振实验平台,该两个专利技术中的Izhikevich神经元模型部分都是使用欧拉法离散化,存在使用欧拉法即一阶龙格库塔法显示Izhikevich神经元模型数据误差大且精度低的缺陷。
发明内容
本发明所要解决的技术问题是:提供一种显示Izhikevich神经元模型的方法,使用四阶龙格库塔法将Izhikevich神经元模型离散化,通过FPGA硬件建模,并在示波器上对Izhikevich神经元模型进行显示和验证,克服了现有技术中的Izhikevich神经元模型部分使用欧拉法离散化,存在使用欧拉法即一阶龙格库塔法显示Izhikevich神经元模型数据误差大且精度低的缺陷。
本发明解决该技术问题所采用的技术方案是:一种显示Izhikevich神经元模型的方法,使用四阶龙格库塔法将Izhikevich神经元模型离散化,通过FPGA硬件建模,并在示波器上对Izhikevich神经元模型进行显示和验证,具体步骤如下:
第一步,使用四阶龙格库塔法将Izhikevich神经元模型离散化:
采用经典的四阶龙格库塔公式将Izhikevich神经元模型离散化,得到结果如下:
上述公式中,v表示神经元膜电位,u表示神经元膜恢复变量,v1、u1、v2、u2、v3、u3、v4、u4都是使用四阶龙格库塔法离散化Izhikevich神经元模型过程中为计算v和u产生的中间量,I表示外加的电流值,a、b是常数,其中2的整数次幂使用移位操作来代替,由此完成使用四阶龙格库塔法将Izhikevich神经元模型离散化;
第二步,浮点数转化为定点数:
采用Q24格式为定点数据格式,即选择定点数据字长为30位,其中符号位1位,整数位5位,小数位24位,所采用的Q24格式如下所示:
该格式小数点后面有24位,它的正数最大值是011111_1111_1111_1111_1111_1111_1111,近似于十进制的31.999999046,负数的最大值是100000_0000_0000_0000_0000_0000_0000,近似于十进制的-31.999999046,任意给定一个十进制实数x∈(-32,32),转换为Q24格式数据x1的计算公式为x1=[x×224];同样任意给定一个Q24格式数据x1,转换为十进制实数x的计算公式为x=[x1÷224],由此将浮点数转化为定点数;
第三步,在QuartusII 13.0软件中使用verilog HDL语言编写状态机:
将上述第一步所得到的公式(6)、公式(7)、公式(10)和公式(11)通过在QuartusII13.0软件中使用verilog HDL语言编写状态机来实现运算,并且运算过程中数据采用上述第二步所定义的定点数据格式,在计算机上操作的具体步骤是:
第(3.1)步,打开QuartusII 13.0软件,在弹出的页面中选择Create a NewProject,点击Next进入工程目录设置页面,设置工程名称为Izhikevich_Rugekutta,设置完成后点击Next进入器件型号设置页面,在该页面的上半部分Device Family选择CycloneIV E系列,下半部分Available devices选择EP4CE10F17C8型号的FPGA,点击Next进入仿真设置页面,在Simulation一行中的Tool Name选择Modelsim-Altera,在Format一行中选择Verilog HDL,直接点击Finish,完成工程目录、名称、使用器件及仿真软件的设置;
第(3.2)步,点击工具栏New按钮,在弹出的页面中选择Verilog HDL File,点击ok进入编写程序界面;
第(3.3)步,编写乘法模块用来代替运算过程中的乘法计算,首先定义模块的名称为signed_mult;其次定义模块中所用到的所有参量名称及类型,包括,两个30位有符号输入类型的输入量a和b,即input signed[29:0]a,b,一个30位既是输出类型又是有符号网线类型的输出量out,即output[29:0]out;wire signed[29:0]out,一个60位有符号网线类型的中间变量out_mult,即wire signed[59:0]out_mult,最后使用assign声明语句实现组合逻辑,out_mult为输入量a和b相乘的结果,即assign out_mult=a×b,out为out_mult最高位与25位到53位拼接的结果,即assign out={out_mult[59],out_mult[52:24]};
第(3.4)步,在乘法模块上面重新定义一个新的名称为Izhikevich_Rugekutta的模块,先定义模块所用到的所有参量名称及其类型,包括,一个输入类型的时钟信号clk,一个输入类型的复位信号rst_n,两个14位既是输出类型又是有符号网线类型的输出量outv和outu,并且使outv和outu分别等于v和u的高14位,十个30位有符号寄存器类型的中间变量v、v1、v2、v3、v4、u、u1、u2、u3、u4和一个5位无符号寄存器类型的中间变量state,五个状态常量包括localparam Idle=5'b00001、Start=5'b00010、Clear=5'b00100、Stop=5'b01000和Final=5'b10000,二十个有符号网线类型的变量包括wire signed v×v、v1×v1、v2×v2、v3×v3、v×v1、v×v2、v×v3、a×b、(a×b)×v、a×u、(a×b)×v1、a×u1、(a×b)×v2、a×u2、(a×b)×v3、a×u3、sumv、e×sumv、sumu和e×sumu,七个有符号网线类型的常量包括wire signed p、e、o、a、b、c、d和I,根据上述步骤二的定点数据格式,使用assign声明语句进行赋值,即assign p=0.3=30'sh00_4CCCC 8、o=1.4=30'sh01_666666、a=0.02=30'sh00_051 EB 8、b=0.2=30'sh00_333333、c=-0.65=30'sh3F_59999D、d=0.08=30'sh00_147 AE 1和I=0.3=30'sh00_4CCCC8;
第(3.5)步,在上述第(3.4)步定义参量的基础上,调用第(3.3)步的编写的乘法器模块来计算第(3.4)步中二十个有符号网线类型的变量v×v、v1×v1、v2×v2、v3×v3、v×v1、v×v2、v×v3、a×b、(a×b)×v、a×u、(a×b)×v1、a×u1、(a×b)×v2、a×u2、(a×b)×v3、a×u3、sumv、e×sumv、sumu、e×sumu,调用的格式为signed_multvsq(v×v,v,v),其中signed_mult是被调用乘法模块的名称,vsq是自己定义的计算模块的名称,按照此调用格式依次计算v1×v1、v2×v2、v3×v3、v×v1、v×v2、v×v3、a×b、(a×b)×v、a×u、(a×b)×v1、a×u1、(a×b)×v2、a×u2、(a×b)×v3、a×u3、sumv、e×sumv、sumu、e×sumu,其中assignsumv<=v1>>>8+v2>>>7+v3>>>7+v4>>>8,sunu<=u1>>>8+u2>>>7+u3>>>7+u4>>>8;
第(3.6)步,采用一段式有限状态机,将整个状态机写到1个always模块里面,在该模块中既采用同步时序描述状态转移,又描述状态的输入和输出,具体操作步骤如下:
(Ⅰ)以时钟信号clk的上升沿或复位信号rst_n的下降沿为触发,采用if-else语句判断复位信号rst_n是否为低电平,具体处理如下:
当复位信号rst_n是低电平时,则对v和u赋初始值如下:v<=-0.65<=30'sh3F_59999B,u<=-0.13<=30'sh3F_DEB853,对v1、v2、v3、v4、u1、u2、u3、u4进行清零操作,得到v1=v2=v3=v4=u1=u2=u3=u4<=32'sh00_000000,使state指向状态Idle,
当复位信号rst_n不是低电平时,则进行以下(Ⅱ);
(Ⅱ)判断v的值是否大于0.3,当大于时,则令v<=-0.65,u<=u+0.08,否则进入以下(Ⅲ);
(Ⅲ)使用case语句判断state的状态,即case(state),当state<=Idle时,进行上述第一步的公式(6)和公式(7)式中的v1和u1的计算,state指向下一个状态Start即state<=Start,当state<=Start时,进行上述第一步的公式(6)和公式(7)式中的v2和u2的计算,state指向下一个状态Stop,当state<=Stop时,进行上述第一步的公式(6)和公式(7)式中的v3和u3的计算,state指向下一个状态Clear,当state<=Clear时,进行上述第一步的公式(6)和公式(7)式中的v4和u4的计算,state指向下一个状态Final,当state<=Final时,进行上述第一步的公式(10)式和公式(11)式中的v和u的计算,state重新指回初始状态Idle,如果state不是上述这五个状态,则使用default语句置成高阻态即default state<=5'bxxxxx,自此状态机完成了一次运算,得到了一组v和u数据,只要有时钟信号上升沿产生,状态机就会一直循环运算,得到多组v和u数据;
第(3.7)步,点击保存按钮,将程序保存到工程目录下,保存的名称必须和主模块名称一致,即Izhikevich_Rugekutta;
至此,完成在Quartus II 13.0软件中使用verilog HDL语言编写状态机;
第四步,在Modelsim-Altera软件中获取v和u的数据:
在上述第三步编写完状态机的程序以后,需要编写测试模块,给予触发信号clk和rst_n一定的初始值使程序运转起来,在Modelsim-Altera软件中获取v和u的数据,具体步骤是:
第(4.1)步,点击菜单栏File选项,在下拉的菜单里选择New,弹出的页面中选择Verilog HDL File,点击ok进入新的编写程序界面;
第(4.2)步,确定此模块的时间尺度为1ns,即`timescale 1ns/1ns,定义模块的名称与Izhikevich_Rugekutta模块名称相对应为Izhikevich_Rugekutta_tb,将Izhikevich_Rugekutta模块中所有的输入量在此模块中都定义成寄存器类型,即reg clk,rst_n,所有的输出量在此模块中都定义成网线型,即wire[13:0]outv,outu,将Izhikevich_Rugekutta模块例化进来,例化的格式为Izhikevich_Rugekutta Izhikevich_Rugekutta 0(.clk(clk),.rst_n(rst_n),.outv(outv),.outu(outu)),在initial模块中给clk赋初始值1,因为周期为20ns,所以令clk每10ns反转一次,其中initial模块启动后只执行一次,而always模块只要有时钟上升沿就会执行;在另一个initial模块给rst_n赋初始值0,4000ns后令rst_n=1,2000000ns后使用$stop符号使程序停止。Izhikevich_Rugekutta模块的测试模块已经编写完成,接下来通过设置使Izhikevich_Rugekutta模块与测试模块Izhikevich_Rugekutta_tb建立联系;
第(4.3)步,点击保存按钮,将其保存到与Izhikevich_Rugekutta模块相同的目录下,保存的名称为Izhikevich_Rugekutta_tb;
第(4.4)步,点击菜单栏Assignments选项,在下拉的菜单栏里选择setting,弹出的页面左半部分选择simulation,右半部分点击Test Benches,在弹出的页面中选择New进行测试模块的添加,test bench name一栏填写Izhikevich_Rugekutta_tb,在File name一栏中找到Izhikevich_Rugekutta_tb模块的保存目录,点击ok,Apply,ok,Izhikevich_Rugekutta模块与Izhikevich_Rugekutta_tb模块之间的设置已经完成;
第(4.5)步,在Files菜单栏选中Izhikevich_Rugekutta模块,点击右键选择Setas Top-Level Entity将其设置成顶层模块,在工具栏点击Start Analysis&Synthesis按钮进行编译,编译完成后在工具栏点击RTL Simulation按钮进入Modelsim-Altera软件仿真界面,在Modelsim-Altera软件工具栏点击ZoomFull按钮开始仿真,2000000ns后得到多组v和u的数据;
由此完成在Modelsim-Altera软件中获取v和u的数据;
第五步,在ROM存储器中存入v和u的数据:
将v和u的数据转化到DAC模块输出电压范围内,存入到ROM存储器中,从Modelsim-Altera软件得到的v和u的数据是上述第二步中定义的格式,与DAC模块输出电压范围不对应,需要进行转化,具体步骤是:
第(5.1)步,采用型号为ACM9767的高速数模转换器,即DAC模块,将v和u的数据所对应的电压值扩大400倍,再转换到DAC模块0~16383整数输出范围内;
第(5.2)步,在仿真进行260us后分别选取1024个v和u的值,并按照上述第(5.1)步的方法全部转换成DAC模块电压输出的范围内,并将其保存在excel表格中;
第(5.3)步,重新打开QuartusII 13.0软件,并按照上述第(3.1)步所设置好的工程目录、名称及器件型号,定义工程的名字为Izhikevich;
第(5.4)步,点击工具栏New按钮,在弹出的页面中选择Memory InitializationFile进入mif文件制作流程,Number of words选项填1024,Word size选项填14,点击ok进入下一个页面,Memory Radix右击设置成Unsigned Decimal类型,将上述第(5.2)步所保存在excel表格里的1024个v的值复制到此页面中,点击保存按钮,保存到此工程目录下,命名为v,文件类型为.mif,同上操作,也将u的值按照此步骤保存成u.mif文件;
第(5.5)步,点击菜单栏Tools选项,在下拉的菜单里选择MegaWizard Plug-InManager进入调用ip核界面,直接点击Next,在弹出的页面左半部分选择Memory Compiler里面的ROM:1-PORT,右半部分地址选择此工程目录下并命名为vrom,语言类型选择VerilogHDL,点击Next进行ROM ip核的设置,位宽选择14,深度选择1024,点击Next直到选择mif文件页面,点击Browse选中上述第(5.4)步已保存的v.mif文件,点击Next直到结束,此时v的数据已经保存在名为vrom的存储器中,同上操作,也将u的数据保存到名为urom的存储器中;
第六步,在示波器上显示膜电位v和膜恢复变量u的波形,即显示Izhikevich神经元模型:
读取ROM存储器的地址将数据下载到FPGA中,通过DAC模块在示波器上显示膜电位v和膜恢复变量u的波形,给ROM存储器和DAC模块添加相同的触发信号,使ROM存储器的数据下载到FPGA的同时,也通过DAC模块在示波器上显示膜电位v和膜恢复变量u的波形,具体步骤是:
第(6.1)步,点击菜单栏Tools选项,在下拉的菜单里选择MegaWizard Plug-InManager进入调用ip核界面,直接点击Next,弹出的页面左半部分选择I/O里面的ALTPLL,右半部分地址选择此工程目录下并命名为pll,语言类型选择Verilog HDL,点击Next进行PLLip核的设置,the frequency of the inclk0 input选项选择50MHz,点击Next进入下一个页面,在这一个页面中所有的选项都不勾选,点击Next直到设置output clocks页面,在clkc0页面勾选Enter output clock frequency选项将clkc0设置成125MHz,点击Next直到结束;
第(6.2)步,点击工具栏New按钮,在弹出的页面中选择Verilog HDL File,点击ok进入编写程序页面;
第(6.3)步,设置模块的名称为Izhikevich,定义模块所有参量的名称及类型,包括两个输入类型的输入量为CLK50M和rst_n,两个14位输出类型的输出量为V和U,四个输出类型的输出量为V_CLK、V_WRT、U_CLK和U_WRT,一个11位寄存器类型的中间变量为address,将上述第(6.1)步生成的pll文件例化进来,例化的格式为pllpll0(.inclk0(CLK50M),.c0(CLK125M)),其中CLK50M是系统的时钟,是由FPGA自带的50MHz的晶振产生,CLK125M是由调用的PLL ip核产生的,在这里作为端口使用必须定义为网线类型即wire CLK125M,用作DAC模块的触发信号,即assign V_CLK=V_WRT=U_CLK=U_WRT=CLK125M,将上述第(5.5)步生成的vrom和urom文件例化进来,例化的格式为vrom vrom0(.address(address),.clock(CLK125M),.q(V))和urom urom0(.address(address),.clock(CLK125M),.q(U)),其中,clock是vrom和urom的触发信号必须与DAC模块的触发信号保持一致,都与pll产生的125MHz信号相连;q是存储在ROM中的数据,分别与输出端口V和U相连;address是ROM存储器的读取地址,当复位信号rst_n有效时,address清零,否则时钟信号CLK125M每来一次上升沿address就加1;
第(6.4)步,点击保存按钮,保存在此工程相同的目录下,名称必须与模块名保持一致为Izhikevich,点击ok,接着点击工具栏Start Analysis&Synthesis按钮进行编译,编译无误后FPGA进行管脚的分配,管脚分配无误后点击工具栏Start Complicati on按钮进行全编译;
第(6.5)步,上述第(6.4)步全编译无误后,通过USB线将与电脑相连,通过DAC模块将FPGA与示波器相连,给FPGA板通电,点击工具栏Programmer按钮,膜电位v和膜恢复变量u的波形就会在示波器上显示出来,即显示出Izhikevich神经元模型。
上述一种显示Izhikevich神经元模型的方法,其中所涉及的经典的四阶龙格库塔公式、Q24格式、一段式有限状态机、QuartusII 13.0软件、verilog HDL语言、Modelsim-Altera软件、ROM存储器、DAC模块和ACM9767的高速数模转换器均是本发明所属技术领域所公知的或能够通过公知途径获得的。
本发明的有益效果是:与现有技术相比,本发明具有如下突出的实质性特点和显著进步:
(1)与仿真软件MATLAB相比运行速度快,并行程度高,现场实时的数据信息能够得到及时处理,能够满足实时性的要求,单位时间内生成神经元的个数更多,运算效率得到大幅度的提高。
(2)所消耗的资源较少,如表1所示,输入输出引脚消耗了资源的22%,存储字节消耗了资源的14%,逻辑单元仅仅消耗了资源的1%。
(3)用到的FPGA体积小,集成度高,通过修改程序可以产生不同的Izhikevich神经元放电类型,可无限次重新配置,使用非常灵活。
(4)与CN104615909B和CN104689473A相比,在CN104615909B和CN104689473A中的Izhikevich神经元模型部分都是使用欧拉法离散化,欧拉法就是一阶龙格库塔法,一阶的方法所得到的Izhikevich神经元模型数据误差大精度低。本发明与这两个专利技术突出的实质性区别在于,本发明使用的是四阶龙格库塔法对Izhikevich神经元模型进行离散化。本发明的显著进步是四阶龙格库塔法要比一阶龙格库塔的欧拉法高三阶,所以四阶龙格库塔法相较于欧拉法所得到的Izhikevich神经元模型数据误差更小,精确度更高,更能逼近真实生物神经元特性。因此,本发明克服了上述两个专利技术的缺陷与不足。
(5)CN109190708A公开了基于视觉皮层处理机制的概念机神经网络图像分类方法,CN108416391A公开了基于视觉皮层处理机制及脉冲监督学习的图像分类方法,CN107179704A公开了基于改进蜂群算法的神经系统最少能量控制技术,CN106447038A公开了脉冲神经电路,但是这四个专利借助Izhikevich神经元模型要么是说明图像分类方法,要么是验证算法,要么是搭建脉冲神经电路,除CN106447038A中的Izhikevich神经元模型部分是搭建模拟电路实现的,其它专利技术中的Izhikevich神经元模型部分都与CN108760829A公开的一种基于仿生嗅球模型和卷积神经网络的电子鼻识别方法类似,均为算法软件编程实现的,但都未使用基于FPGA的方法。另外,CN102193518A公开了基于基底神经节的FPGA仿生智能控制芯片[ZH]),但是该专利技术的Izhikevich神经元模型是利用FPGA内部资源搭建的,并未使用龙格库塔法。
附图说明
下面结合附图和实施例对本发明进一步说明。
图1是本发明方法的流程示意图。
图2是本发明方法中状态机的流程示意图。
图3是使用MATLAB编写程序运行四阶龙格库塔法得到的神经元膜电位v的波形图。
图4是使用MATLAB编写程序运行四阶龙格库塔法得到的神经元膜恢复变量u的波形图。
图5是使用FPGA通过示波器得到的神经元膜电位v和膜恢复变量u的波形图。
具体实施方式
图1所示实施例表明,本发明使用FPGA实现Izhikevich神经元模型的流程:开始→使用四阶龙格库塔法将Izhikevich神经元模型离散化,得到进行计算的v,v1,v2,v3,v4和u,u1,u2,u3,u4的方程→采取定点数据为Q24格式,得到十进制数据和Q24格式数据之间转换的规则→使用Verilog HDL语言编写状态机,通过状态机得到v和u的数据→将得到的数据v和u取其高14位,并换算成高速数模转换器(DAC)输出的电压范围→将换算后的数放入ROM模块中存储,调用锁相环(PLL),将其一起例化到顶层模块,然后在Quartus II 13.0软件中编译,分配引脚,综合后下载到FPGA中,通过DAC模块在示波器上显示膜电位v和膜恢复变量u的波形。
图2所示实施例表明,本发明使用Verilog HDL语言编写状态机的流程:复位→给v,u和各寄存器赋初始值,并置空闲状态→计算v1和u1,并置开始状态→计算v2和u2并置清除状态→计算v3和u3并置停止状态→计算v4和u4并置最终状态→计算v和u,并判断v是否≥0.3mV,当是,则v=-0.65mV,u=u+0.08返回计算v1和u1,并置开始状态;否则直接返回计算v1和u1,并置开始状态→最终取v和u的高14位转换成高速数模转换器的电压范围→输出。
图3是使用软件MATLAB编写四阶龙格库塔法得到的Izhikevich神经元膜电位v的波形图,从图中看出在200ms时膜电位v的波形开始稳定,进入循环状态,每完成一次循环需要250ms的时间。
图4是使用软件MATLAB编写四阶龙格库塔法得到的Izhikevich神经元膜恢复变量u的波形图,从图中看出在200ms时膜恢复变量u的波形开始稳定,进入循环状态,每完成一次循环需要250ms的时间。
图5是下载到FPGA中的膜电位v和膜恢复变量u的数据通过示波器显示出来的波形图,图中上半部分的波形表示的是膜电位v,下半部分的波形表示的是膜恢复变量u,从图中看出完成一次膜电位v和膜恢复变量u波形的循环只需要5ms的时间。
实施例
本实施例一种显示Izhikevich神经元模型的方法,使用四阶龙格库塔法将Izhikevich神经元模型离散化,通过FPGA硬件建模,并在示波器上对Izhikevich神经元模型进行显示和验证,具体步骤如下:
第一步,使用四阶龙格库塔法将Izhikevich神经元模型离散化:
一阶常微分方程的初值问题可以表示为而龙格库塔法是用于求非线性常微分方程解的一种重要的迭代法,是一种在工程上应用广泛的高精度单步算法,具有精度高的优点,本实施例采取经典的四阶龙格库塔公式为公式(1)所示,
Izhikevich神经元的模型为:
若v≥30mv,则v←c,u←u+d
公式(3)中,v表示神经元的膜电位,u表示神经元的膜恢复变量,为膜电位v提供负反馈。a,b,c,d是无量纲参数,通过设置a,b,c,d的值可以将神经元调节为兴奋性神经元和抑制性神经元,这里设置a=0.02,b=0.2,c=-65,d=8,神经元为规则放电的兴奋性神经元,I表示外部输入电流,,取I=30mA,
为了使变量的数值在第二步定义的范围内,将公式(3)的v,u同时缩小100倍,为了使等式平衡,则0.04扩大100倍变为4,140缩小100倍变为1.4,I缩小100倍变为0.3mA,a,b不变,c,d缩小100倍分别为-0.65和0.08。将公式(3)代入公式(2)得:
并由上述公式(1)式可得:
化简后得:
上述公式中,v表示神经元膜电位,u表示神经元膜恢复变量,v1、u1、v2、u2、v3、u3、v4、u4都是使用四阶龙格库塔法离散化Izhikevich神经元模型过程中为计算v和u产生的中间量,I表示外加的电流值,a、b是常数,其中2的整数次幂使用移位操作来代替,由此完成使用四阶龙格库塔法将Izhikevich神经元模型离散化;
第二步,浮点数转化为定点数:
采用Q24格式为定点数据格式,即选择定点数据字长为30位,其中符号位1位,整数位5位,小数位24位,所采用的Q24格式如下所示:
该格式小数点后面有24位,它的正数最大值是011111_1111_1111_1111_1111_1111_1111,近似于十进制的31.999999046,负数的最大值是100000_0000_0000_0000_0000_0000_0000,近似于十进制的-31.999999046,任意给定一个十进制实数x∈(-32,32),转换为Q24格式数据x1的计算公式为x1=[x×224];同样任意给定一个Q24格式数据x1,转换为十进制实数x的计算公式为x=[x1÷224],由此将浮点数转化为定点数;
第三步,在Quartus II 13.0软件中使用verilog HDL语言编写状态机:
将上述第一步所得到的公式(6)、公式(7)、公式(10)和公式(11)通过在QuartusII13.0软件中使用verilog HDL语言编写状态机来实现运算,并且运算过程中数据采用上述第二步所定义的定点数据格式,在计算机上操作的具体步骤是:
第(3.1)步,打开QuartusII 13.0软件,在弹出的页面中选择Create a NewProject,点击Next进入工程目录设置页面,设置工程名称为Izhikevich_Rugekutta,设置完成后点击Next进入器件型号设置页面,在该页面的上半部分Device Family选择CycloneIV E系列,下半部分Available devices选择EP4CE10F17C8型号的FPGA,点击Next进入仿真设置页面,在Simulation一行中的Tool Name选择Modelsim-Altera,在Format一行中选择Verilog HDL,直接点击Finish,完成工程目录、名称、使用器件及仿真软件的设置;
第(3.2)步,点击工具栏New按钮,在弹出的页面中选择Verilog HDL File,点击ok进入编写程序界面;
第(3.3)步,编写乘法模块用来代替运算过程中的乘法计算,首先定义模块的名称为signed_mult;其次定义模块中所用到的所有参量名称及类型,包括,两个30位有符号输入类型的输入量a和b,即input signed[29:0]a,b,一个30位既是输出类型又是有符号网线类型的输出量out,即output[29:0]out;wire signed[29:0]out,一个60位有符号网线类型的中间变量out_mult,即wire signed[59:0]out_mult,最后使用assign声明语句实现组合逻辑,out_mult为输入量a和b相乘的结果,即assign out_mult=a×b,out为out_mult最高位与25位到53位拼接的结果,即assign out={out_mult[59],out_mult[52:24]};
第(3.4)步,在乘法模块上面重新定义一个新的名称为Izhikevich_Rugekutta的模块,先定义模块所用到的所有参量名称及其类型,包括,一个输入类型的时钟信号clk,一个输入类型的复位信号rst_n,两个14位既是输出类型又是有符号网线类型的输出量outv和outu,并且使outv和outu分别等于v和u的高14位,十个30位有符号寄存器类型的中间变量v、v1、v2、v3、v4、u、u1、u2、u3、u4和一个5位无符号寄存器类型的中间变量state,五个状态常量包括localparamIdle=5'b00001、Start=5'b00010、Clear=5'b00100、Stop=5'b01000和Final=5'b10000,二十个有符号网线类型的变量包括wiresignedv×v、v1×v1、v2×v2、v3×v3、v×v1、v×v2、v×v3、a×b、(a×b)×v、a×u、(a×b)×v1、a×u1、(a×b)×v2、a×u2、(a×b)×v3、a×u3、sumv、e×sumv、sumu和e×sumu,七个有符号网线类型的常量包括wiresignedp、e、o、a、b、c、d和I,根据上述步骤二的定点数据格式,使用assign声明语句进行赋值,即assign p=0.3=30'sh00_4CCCC 8、o=1.4=30'sh01_666666、a=0.02=30'sh00_051 EB 8、b=0.2=30'sh00_333333、c=-0.65=30'sh3F_59999D d=0.08=30'sh00_147 AE 1和I=0.3=30'sh00_4CCCC8;
第(3.5)步,在上述第(3.4)步定义参量的基础上,调用第(3.3)步的编写的乘法器模块来计算第(3.4)步中二十个有符号网线类型的变量v×v、v1×v1、v2×v2、v3×v3、v×v1、v×v2、v×v3、a×b、(a×b)×v、a×u、(a×b)×v1、a×u1、(a×b)×v2、a×u2、(a×b)×v3、a×u3、sumv、e×sumv、sumu、e×sumu,调用的格式为signed_mult vsq(v×v,v,v),其中signed_mult是被调用乘法模块的名称,vsq是自己定义的计算模块的名称,按照此调用格式依次计算v1×v1、v2×v2、v3×v3、v×v1、v×v2、v×v3、a×b、(a×b)×v、a×u、(a×b)×v1、a×u1、(a×b)×v2、a×u2、(a×b)×v3、a×u3、sumv、e×sumv、sumu、e×sumu,其中assignsumv<=v1>>>8+v2>>>7+v3>>>7+v4>>>8,sunu<=u1>>>8+u2>>>7+u3>>>7+u4>>>8;
第(3.6)步,采用一段式有限状态机,将整个状态机写到1个always模块里面,在该模块中既采用同步时序描述状态转移,又描述状态的输入和输出,具体操作步骤如下:
(Ⅰ)以时钟信号clk的上升沿或复位信号rst_n的下降沿为触发,采用if-else语句判断复位信号rst_n是否为低电平,具体处理如下:
当复位信号rst_n是低电平时,则对v和u赋初始值如下:v<=-0.65<=30'sh3F_59999B,u<=-0.13<=30'sh3F_DEB853,对v1、v2、v3、v4、u1、u2、u3、u4进行清零操作,得到v1=v2=v3=v4=u1=u2=u3=u4<=32'sh00_000000,使state指向状态Idle,
当复位信号rst_n不是低电平时,则进行以下(Ⅱ);
(Ⅱ)判断v的值是否大于0.3,当大于时,则令v<=-0.65,u<=u+0.08,否则进入以下(Ⅲ);
(Ⅲ)使用case语句判断state的状态,即case(state),当state<=Idle时,进行上述第一步的公式(6)和公式(7)式中的v1和u1的计算,state指向下一个状态Start即state<=Start,当state<=Start时,进行上述第一步的公式(6)和公式(7)式中的v2和u2的计算,state指向下一个状态Stop,当state<=Stop时,进行上述第一步的公式(6)和公式(7)式中的v3和u3的计算,state指向下一个状态Clear,当state<=Clear时,进行上述第一步的公式(6)和公式(7)式中的v4和u4的计算,state指向下一个状态Final,当state<=Final时,进行上述第一步的公式(10)式和公式(11)式中的v和u的计算,state重新指回初始状态Idle,如果state不是上述这五个状态,则使用default语句置成高阻态即default state<=5'bxxxxx,自此状态机完成了一次运算,得到了一组v和u数据,只要有时钟信号上升沿产生,状态机就会一直循环运算,得到多组v和u数据;
第(3.7)步,点击保存按钮,将程序保存到工程目录下,保存的名称必须和主模块名称一致,即Izhikevich_Rugekutta;
至此,完成在Quartus II 13.0软件中使用verilog HDL语言编写状态机;
第四步,在Modelsim-Altera软件中获取v和u的数据:
在上述第三步编写完状态机的程序以后,需要编写测试模块,给予触发信号clk和rst_n一定的初始值使程序运转起来,在Modelsim-Altera软件中获取v和u的数据,具体步骤是:
第(4.1)步,点击菜单栏File选项,在下拉的菜单里选择New,弹出的页面中选择Verilog HDL File,点击ok进入新的编写程序界面;
第(4.2)步,确定此模块的时间尺度为1ns,即`timescale 1ns/1ns,定义模块的名称与Izhikevich_Rugekutta模块名称相对应为Izhikevich_Rugekutta_tb,将Izhikevich_Rugekutta模块中所有的输入量在此模块中都定义成寄存器类型,即reg clk,rst_n,所有的输出量在此模块中都定义成网线型,即wire[13:0]outv,outu,将Izhikevich_Rugekutta模块例化进来,例化的格式为Izhikevich_Rugekutta Izhikevich_Rugekutta0(.clk(clk),.rst_n(rst_n),.outv(outv),.outu(outu)),在initial模块中给clk赋初始值1,因为周期为20ns,所以令clk每10ns反转一次,其中initial模块启动后只执行一次,而always模块只要有时钟上升沿就会执行;在另一个initial模块给rst_n赋初始值0,4000ns后令rst_n=1,2000000ns后使用$stop符号使程序停止。Izhikevich_Rugekutta模块的测试模块已经编写完成,接下来通过设置使Izhikevich_Rugekutta模块与测试模块Izhikevich_Rugekutta_tb建立联系;
第(4.3)步,点击保存按钮,将其保存到与Izhikevich_Rugekutta模块相同的目录下,保存的名称为Izhikevich_Rugekutta_tb;
第(4.4)步,点击菜单栏Assignments选项,在下拉的菜单栏里选择setting,弹出的页面左半部分选择simulation,右半部分点击TestBenches,在弹出的页面中选择New进行测试模块的添加,test bench name一栏填写Izhikevich_Rugekutta_tb,在File name一栏中找到Izhikevich_Rugekutta_tb模块的保存目录,点击ok,Apply,ok,Izhikevich_Rugekutta模块与Izhikevich_Rugekutta_tb模块之间的设置已经完成;
第(4.5)步,在Files菜单栏选中Izhikevich_Rugekutta模块,点击右键选择Setas Top-Level Entity将其设置成顶层模块,在工具栏点击Start Analysis&Synthesis按钮进行编译,编译完成后在工具栏点击RTL Simulation按钮进入Modelsim-Altera软件仿真界面,在Modelsim-Altera软件工具栏点击Zoom Full按钮开始仿真,2000000ns后得到多组v和u的数据;
由此完成在Modelsim-Altera软件中获取v和u的数据;
第五步,在ROM存储器中存入v和u的数据:
将v和u的数据转化到DAC模块输出电压范围内,存入到ROM存储器中,从Modelsim-Altera软件得到的v和u的数据是上述第二步中定义的格式,与DAC模块输出电压范围不对应,需要进行转化,具体步骤是:
第(5.1)步,采用型号为ACM9767的高速数模转换器,即DAC模块,该模块具有单电源5V供电输入,输出电压范围为±5V,转换速率高达125Msps,双通道数字转模拟信号输出,每个通道数据分辨率为14位,DAC模块输出的电压范围为±5V,也就是±5000mV,14位的数据通道所表示的整数范围为0~214,即0~16383,所以将输出电压范围分成16384份,每一份所代表[10000/16384]mV,中间点即第8192个点代表0mV,由于状态机运算所得到的数据对应电压值较小,为了在示波器上更好的观察图形,将数据对应的电压值扩大了400倍,再转换到DAC模块0~16383整数输出范围内。举例,运算中v=30'sh00_4CCCC8=0.3mV,扩大400倍为120mV,对应到0~16383整数范围内是8192+[120×16384÷10000]=8389;运算中v=30'shFF_B33338=-0.3mV,扩大400倍为-120mV,对应到0~16363整数范围内是8129-[120×16384÷10000]=7996;
第(5.2)步,在仿真进行260us后分别选取1024个v和u的值,并按照上述第(5.1)步的方法全部转换成DAC模块电压输出的范围内,并将其保存在excel表格中;
第(5.3)步,重新打开QuartusII 13.0软件,并按照上述第(3.1)步所设置好的工程目录、名称及器件型号,定义工程的名字为Izhikevich;
第(5.4)步,点击工具栏New按钮,在弹出的页面中选择Memory InitializationFile进入mif文件制作流程,Number of words选项填1024,Word size选项填14,点击ok进入下一个页面,Memory Radix右击设置成Unsigned Decimal类型,将上述第(5.2)步所保存在excel表格里的1024个v的值复制到此页面中,点击保存按钮,保存到此工程目录下,命名为v,文件类型为.mif,同上操作,也将u的值按照此步骤保存成u.mif文件;
第(5.5)步,点击菜单栏Tools选项,在下拉的菜单里选择MegaWizard Plug-InManager进入调用ip核界面,直接点击Next,在弹出的页面左半部分选择Memory Compiler里面的ROM:1-PORT,右半部分地址选择此工程目录下并命名为vrom,语言类型选择VerilogHDL,点击Next进行ROM ip核的设置,位宽选择14,深度选择1024,点击Next直到选择mif文件页面,点击Browse选中上述第(5.4)步已保存的v.mif文件,点击Next直到结束,此时v的数据已经保存在名为vrom的存储器中,同上操作,也将u的数据保存到名为urom的存储器中;
第六步,在示波器上显示膜电位v和膜恢复变量u的波形,即显示Izhikevich神经元模型:
读取ROM存储器的地址将数据下载到FPGA中,通过DAC模块在示波器上显示膜电位v和膜恢复变量u的波形,给ROM存储器和DAC模块添加相同的触发信号,使ROM存储器的数据下载到FPGA的同时,也通过DAC模块在示波器上显示膜电位v和膜恢复变量u的波形,具体步骤是:
第(6.1)步,点击菜单栏Tools选项,在下拉的菜单里选择MegaWizard Plug-InManager进入调用ip核界面,直接点击Next,弹出的页面左半部分选择I/O里面的ALTPLL,右半部分地址选择此工程目录下并命名为pll,语言类型选择Verilog HDL,点击Next进行PLLip核的设置,the frequency of the inclk0 input选项选择50MHz,点击Next进入下一个页面,在这一个页面中所有的选项都不勾选,点击Next直到设置output clocks页面,在clkc0页面勾选Enter output clock frequency选项将clkc0设置成125MHz,点击Next直到结束;
第(6.2)步,点击工具栏New按钮,在弹出的页面中选择Verilog HDL File,点击ok进入编写程序页面;
第(6.3)步,设置模块的名称为Izhikevich,定义模块所有参量的名称及类型,包括两个输入类型的输入量为CLK50M和rst_n,两个14位输出类型的输出量为V和U,四个输出类型的输出量为V_CLK、V_WRT、U_CLK和U_WRT,一个11位寄存器类型的中间变量为address,将上述第(6.1)步生成的pll文件例化进来,例化的格式为pll pll0(.inclk0(CLK50M),.c0(CLK125M)),其中CLK50M是系统的时钟,是由FPGA自带的50MHz的晶振产生,CLK125M是由调用的PLLip核产生的,在这里作为端口使用必须定义为网线类型即wire CLK125M,用作DAC模块的触发信号,即assign V_CLK=V_WRT=U_CLK=U_WRT=CLK125M,将上述第(5.5)步生成的vrom和urom文件例化进来,例化的格式为vrom vrom0(.address(address),.clock(CLK125M),,.q(V))和urom urom0(.address(address),.clock(CLK125M),.q(U)),其中,clock是vrom和urom的触发信号必须与DAC模块的触发信号保持一致,都与pll产生的125MHz信号相连;q是存储在ROM中的数据,分别与输出端口V和U相连;address是ROM存储器的读取地址,当复位信号rst_n有效时,address清零,否则时钟信号CLK125M每来一次上升沿address就加1;
第(6.4)步,点击保存按钮,保存在此工程相同的目录下,名称必须与模块名保持一致为Izhikevich,点击ok,接着点击工具栏Start Analysis&Synthesis按钮进行编译,编译无误后FPGA进行管脚的分配,管脚分配无误后点击工具栏Start Complicati on按钮进行全编译;
全编译后,Flow Summary会自动将资源消耗结果展示出来,如表1所示,
表1.模块资源消耗结果
模块构成名称 | 逻辑单元 | 输入输出引脚 | 存储字节 | 锁相环(PLL) |
FPGA | 10320 | 180 | 423936 | 2 |
资源消耗量 | 11(<1%) | 34(22%) | 57344(14%) | 1(50%) |
第(6.5)步,上述第(6.4)步全编译无误后,通过USB线将与电脑相连,通过DAC模块将FPGA与示波器相连,给FPGA板通电,点击工具栏Programmer按钮,膜电位v和膜恢复变量u的波形就会在示波器上显示出来,即显示出Izhikevich神经元模型。
上述实施例中,所涉及的经典的四阶龙格库塔公式、Q24格式、QuartusII 13.0软件、verilog HDL语言、Modelsim-Altera软件、ROM存储器、DAC模块和ACM9767的高速数模转换器均是本发明所属技术领域所公知的,或能够通过公知途径获得的。
Claims (1)
1.一种显示Izhikevich神经元模型的方法,其特征在于:使用四阶龙格库塔法将Izhikevich神经元模型离散化,通过FPGA硬件建模,并在示波器上对Izhikevich神经元模型进行显示和验证,具体步骤如下:
第一步,使用四阶龙格库塔法将Izhikevich神经元模型离散化:
采用经典的四阶龙格库塔公式将Izhikevich神经元模型离散化,得到结果如下:
上述公式中,v表示神经元膜电位,u表示神经元膜恢复变量,v1、u1、v2、u2、v3、u3、v4、u4都是使用四阶龙格库塔法离散化Izhikevich神经元模型过程中为计算v和u产生的中间量,I表示外加的电流值,a、b是常数,其中2的整数次幂使用移位操作来代替,由此完成使用四阶龙格库塔法将Izhikevich神经元模型离散化;
第二步,浮点数转化为定点数:
采用Q24格式为定点数据格式,即选择定点数据字长为30位,其中符号位1位,整数位5位,小数位24位,所采用的Q24格式如下所示:
该格式小数点后面有24位,它的正数最大值是011111_1111_1111_1111_1111_1111_1111,近似于十进制的31.999999046,负数的最大值是100000_0000_0000_0000_0000_0000_0000,近似于十进制的-31.999999046,任意给定一个十进制实数x∈(-32,32),转换为Q24格式数据x1的计算公式为x1=[x×224];同样任意给定一个Q24格式数据x1,转换为十进制实数x的计算公式为x=[x1÷224],由此将浮点数转化为定点数;
第三步,在QuartusII 13.0软件中使用verilog HDL语言编写状态机:
将上述第一步所得到的公式(1)、公式(2)、公式(3)和公式(4)通过在QuartusII 13.0软件中使用verilog HDL语言编写状态机来实现运算,并且运算过程中数据采用上述第二步所定义的定点数据格式,在计算机上操作的具体步骤是:
第(3.1)步,打开QuartusII 13.0软件,在弹出的页面中选择Create a NewProject,点击Next进入工程目录设置页面,设置工程名称为Izhikevich_Rugekutta,设置完成后点击Next进入器件型号设置页面,在该页面的上半部分Device Family选择Cyclone IV E系列,下半部分Available devices选择EP4CE10F17C8型号的FPGA,点击Next进入仿真设置页面,在Simulation一行中的Tool Name选择Modelsim-Altera,在Format一行中选择VerilogHDL,直接点击Finish,完成工程目录、名称、使用器件及仿真软件的设置;
第(3.2)步,点击工具栏New按钮,在弹出的页面中选择Verilog HDL File,点击ok进入编写程序界面;
第(3.3)步,编写乘法模块用来代替运算过程中的乘法计算,首先定义模块的名称为signed_mult;其次定义模块中所用到的所有参量名称及类型,包括,两个30位有符号输入类型的输入量a和b,即input signed[29:0]a,b,一个30位既是输出类型又是有符号网线类型的输出量out,即output[29:0]out;wiresigned[29:0]out,一个60位有符号网线类型的中间变量out_mult,即wiresigned[59:0]out_mult,最后使用assign声明语句实现组合逻辑,out_mult为输入量a和b相乘的结果,即assign out_mult=a×b,out为out_mult最高位与25位到53位拼接的结果,即assign out={out_mult[59],out_mult[52:24]};
第(3.4)步,在乘法模块上面重新定义一个新的名称为Izhikevich_Rugekutta的模块,先定义模块所用到的所有参量名称及其类型,包括,一个输入类型的时钟信号clk,一个输入类型的复位信号rst_n,两个14位既是输出类型又是有符号网线类型的输出量outv和outu,并且使outv和outu分别等于v和u的高14位,十个30位有符号寄存器类型的中间变量v、v1、v2、v3、v4、u、u1、u2、u3、u4和一个5位无符号寄存器类型的中间变量state,五个状态常量包括localparam Idle=5'b00001、Start=5'b00010、Clear=5'b00100、Stop=5'b01000和Final=5'b10000,二十个有符号网线类型的变量包括wire signed v×v、v1×v1、v2×v2、v3×v3、v×v1、v×v2、v×v3、a×b、(a×b)×v、a×u、(a×b)×v1、a×u1、(a×b)×v2、a×u2、(a×b)×v3、a×u3、sumv、e×sumv、sumu和e×sumu,八个有符号网线类型的常量包括wiresigned p、e、o、a、b、c、d和I,根据上述第二步中所述的Q24格式的定点数据格式,使用assign声明语句进行赋值,即assignp=0.3=30'sh00_4CCCC8、o=1.4=30'sh01_666666、a=0.02=30'sh00_051EB8、b=0.2=30'sh00_333333、c=-0.65=30'sh3F_59999D、d=0.08=30'sh00_147AE1和I=0.3=30'sh00_4CCCC8;
第(3.5)步,在上述第(3.4)步定义参量的基础上,调用第(3.3)步的编写的乘法器模块来计算第(3.4)步中二十个有符号网线类型的变量v×v、v1×v1、v2×v2、v3×v3、v×v1、v×v2、v×v3、a×b、(a×b)×v、a×u、(a×b)×v1、a×u1、(a×b)×v2、a×u2、(a×b)×v3、a×u3、sumv、e×sumv、sumu、e×sumu,调用的格式为signed_mult vsq(v×v,v,v),其中signed_mult是被调用乘法模块的名称,vsq是自己定义的计算模块的名称,按照此调用格式依次计算v1×v1、v2×v2、v3×v3、v×v1、v×v2、v×v3、a×b、(a×b)×v、a×u、(a×b)×v1、a×u1、(a×b)×v2、a×u2、(a×b)×v3、a×u3、sumv、e×sumv、sumu、e×sumu,其中assignsumv<=v1>>>8+v2>>>7+v3>>>7+v4>>>8,sunu<=u1>>>8+u2>>>7+u3>>>7+u4>>>8;
第(3.6)步,采用一段式有限状态机,将整个状态机写到1个always模块里面,在该模块中既采用同步时序描述状态转移,又描述状态的输入和输出,具体操作步骤如下:
(Ⅰ)以时钟信号clk的上升沿或复位信号rst_n的下降沿为触发,采用if-else语句判断复位信号rst_n是否为低电平,具体处理如下:
当复位信号rst_n是低电平时,则对v和u赋初始值如下:v<=-0.65<=30'sh3F_59999B,u<=-0.13<=30'sh3F_DEB853,对v1、v2、v3、v4、u1、u2、u3、u4进行清零操作,得到v1=v2=v3=v4=u1=u2=u3=u4<=32'sh00_000000,使state指向状态Idle,
当复位信号rst_n不是低电平时,则进行以下(Ⅱ);
(Ⅱ)判断v的值是否大于0.3,当大于时,则令v<=-0.65,u<=u+0.08,否则进入以下(Ⅲ);
(Ⅲ)使用case语句判断state的状态,即case(state),当state<=Idle时,进行上述第一步的公式(1)和公式(2)式中的v1和u1的计算,state指向下一个状态Start即state<=Start,当state<=Start时,进行上述第一步的公式(1)和公式(2)式中的v2和u2的计算,state指向下一个状态Stop,当state<=Stop时,进行上述第一步的公式(1)和公式(2)式中的v3和u3的计算,state指向下一个状态Clear,当state<=Clear时,进行上述第一步的公式(1)和公式(2)式中的v4和u4的计算,state指向下一个状态Final,当state<=Final时,进行上述第一步的公式(3)式和公式(4)式中的v和u的计算,state重新指回初始状态Idle,如果state不是这五个状态,则使用default语句置成高阻态即defaultstate<=5'bxxxxx,自此状态机完成了一次运算,得到了一组v和u数据,只要有时钟信号上升沿产生,状态机就会一直循环运算,得到多组v和u数据;
第(3.7)步,点击保存按钮,将程序保存到工程目录下,保存的名称必须和主模块名称一致,即Izhikevich_Rugekutta;
至此,完成在QuartusΙΙ 13.0软件中使用verilog HDL语言编写状态机;
第四步,在Modelsim-Altera软件中获取v和u的数据:
在上述第三步编写完状态机的程序以后,需要编写测试模块,给予触发信号clk和rst_n一定的初始值使程序运转起来,在Modelsim-Altera软件中获取v和u的数据,具体步骤是:
第(4.1)步,点击菜单栏File选项,在下拉的菜单里选择New,弹出的页面中选择VerilogHDL File,点击ok进入新的编写程序界面;
第(4.2)步,确定此模块的时间尺度为1ns,即`timescale 1ns/1ns,定义模块的名称与Izhikevich_Rugekutta模块名称相对应为Izhikevich_Rugekutta_tb,将Izhikevich_Rugekutta模块中所有的输入量在此模块中都定义成寄存器类型,即reg clk,rst_n,所有的输出量在此模块中都定义成网线型,即wire[13:0]outv,outu,将Izhikevich_Rugekutta模块例化进来,例化的格式为Izhikevich_RugekuttaIzhikevich_Rugekutta0(.clk(clk),.rst_n(rst_n),.outv(outv),.outu(outu)),在initial模块中给clk赋初始值1,因为周期为20ns,所以令clk每10ns反转一次,其中initial模块启动后只执行一次,而always模块只要有时钟上升沿就会执行;在另一个initial模块给rst_n赋初始值0,4000ns后令rst_n=1,2000000ns后使用$stop符号使程序停止;Izhikevich_Rugekutta模块的测试模块已经编写完成,接下来通过设置使Izhikevich_Rugekutta模块与测试模块Izhikevich_Rugekutta_tb建立联系;
第(4.3)步,点击保存按钮,将其保存到与Izhikevich_Rugekutta模块相同的目录下,保存的名称为Izhikevich_Rugekutta_tb;
第(4.4)步,点击菜单栏Assignments选项,在下拉的菜单栏里选择setting,弹出的页面左半部分选择simulation,右半部分点击Test Benches,在弹出的页面中选择New进行测试模块的添加,test bench name一栏填写Izhikevich_Rugekutta_tb,在File name一栏中找到Izhikevich_Rugekutta_tb模块的保存目录,点击ok,Apply,ok,Izhikevich_Rugekutta模块与Izhikevich_Rugekutta_tb模块之间的设置已经完成;
第(4.5)步,在Files菜单栏选中Izhikevich_Rugekutta模块,点击右键选择SetasTop-Level Entity将其设置成顶层模块,在工具栏点击Start Analysis&Synthesis按钮进行编译,编译完成后在工具栏点击RTL Simulation按钮进入Modelsim-Altera软件仿真界面,在Modelsim-Altera软件工具栏点击Zoom Full按钮开始仿真,2000000ns后得到多组v和u的数据;
由此完成在Modelsim-Altera软件中获取v和u的数据;
第五步,在ROM存储器中存入v和u的数据:
将v和u的数据转化到DAC模块输出电压范围内,存入到ROM存储器中,从Modelsim-Altera软件得到的v和u的数据是上述第二步中定义的格式,与DAC模块输出电压范围不对应,需要进行转化,具体步骤是:
第(5.1)步,采用型号为ACM9767的高速数模转换器,即DAC模块,将v和u的数据所对应的电压值扩大400倍,再转换到DAC模块0~16383整数输出范围内;
第(5.2)步,在仿真进行260us后分别选取1024个v和u的值,并按照上述第(5.1)步的方法全部转换成DAC模块电压输出的范围内,并将其保存在excel表格中;
第(5.3)步,重新打开QuartusII 13.0软件,并按照上述第(3.1)步所设置好的工程目录、名称及器件型号,定义工程的名字为Izhikevich;
第(5.4)步,点击工具栏New按钮,在弹出的页面中选择Memory Initialization File进入mif文件制作流程,Number of words选项填1024,Word size选项填14,点击ok进入下一个页面,Memory Radix右击设置成Unsigned Decimal类型,将上述第(5.2)步所保存在excel表格里的1024个v的值复制到此页面中,点击保存按钮,保存到此工程目录下,命名为v,文件类型为.mif,同上操作,也将u的值按照此步骤保存成u.mif文件;
第(5.5)步,点击菜单栏Tools选项,在下拉的菜单里选择MegaWizard Plug-InManager进入调用ip核界面,直接点击Next,在弹出的页面左半部分选择Memory Compiler里面的ROM:1-PORT,右半部分地址选择此工程目录下并命名为vrom,语言类型选择VerilogHDL,点击Next进行ROM ip核的设置,位宽选择14,深度选择1024,点击Next直到选择mif文件页面,点击Browse选中上述第(5.4)步已保存的v.mif文件,点击Next直到结束,此时v的数据已经保存在名为vrom的存储器中,同上操作,也将u的数据保存到名为urom的存储器中;
第六步,在示波器上显示膜电位v和膜恢复变量u的波形,即显示Izhikevich神经元模型:
读取ROM存储器的地址将数据下载到FPGA中,通过DAC模块在示波器上显示膜电位v和膜恢复变量u的波形,给ROM存储器和DAC模块添加相同的触发信号,使ROM存储器的数据下载到FPGA的同时,也通过DAC模块在示波器上显示膜电位v和膜恢复变量u的波形,具体步骤是:
第(6.1)步,点击菜单栏Tools选项,在下拉的菜单里选择MegaWizard Plug-InManager进入调用ip核界面,直接点击Next,弹出的页面左半部分选择I/O里面的ALTPLL,右半部分地址选择此工程目录下并命名为pll,语言类型选择Verilog HDL,点击Next进行PLLip核的设置,the frequency of the inclk0 input选项选择50MHz,点击Next进入下一个页面,在这一个页面中所有的选项都不勾选,点击Next直到设置output clocks页面,在clkc0页面勾选Enter output clock frequency选项将clkc0设置成125MHz,点击Next直到结束;
第(6.2)步,点击工具栏New按钮,在弹出的页面中选择Verilog HDL File,点击ok进入编写程序页面;
第(6.3)步,设置模块的名称为Izhikevich,定义模块所有参量的名称及类型,包括两个输入类型的输入量为CLK50M和rst_n,两个14位输出类型的输出量为V和U,四个输出类型的输出量为V_CLK、V_WRT、U_CLK和U_WRT,一个11位寄存器类型的中间变量为address,将上述第(6.1)步生成的pll文件例化进来,例化的格式为pll pll0(.inclk0(CLK50M),.c0(CLK125M)),其中CLK50M是系统的时钟,是由FPGA自带的50MHz的晶振产生,CLK125M是由调用的PLL ip核产生的,在这里作为端口使用必须定义为网线类型即wire CLK125M,用作DAC模块的触发信号,即assignV_CLK=V_WRT=U_CLK=U_WRT=CLK125M,将上述第(5.5)步生成的vrom和urom文件例化进来,例化的格式为vrom vrom0(.address(address),.clock(CLK125M),.q(V))和urom urom0(.address(address),.clock(CLK125M),.q(U)),其中,clock是vrom和urom的触发信号必须与DAC模块的触发信号保持一致,都与pll产生的125MHz信号相连;q是存储在ROM中的数据,分别与输出端口V和U相连;address是ROM存储器的读取地址,当复位信号rst_n有效时,address清零,否则时钟信号CLK125M每来一次上升沿address就加1;
第(6.4)步,点击保存按钮,保存在此工程相同的目录下,名称必须与模块名保持一致为Izhikevich,点击ok,接着点击工具栏Start Analysis&Synthesis按钮进行编译,编译无误后FPGA进行管脚的分配,管脚分配无误后点击工具栏Start Complication按钮进行全编译;
第(6.5)步,上述第(6.4)步全编译无误后,通过USB线将与电脑相连,通过DAC模块将FPGA与示波器相连,给FPGA板通电,点击工具栏Programmer按钮,膜电位v和膜恢复变量u的波形就会在示波器上显示出来,即显示出Izhikevich神经元模型。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910399204.XA CN110598857B (zh) | 2019-05-14 | 2019-05-14 | 一种显示Izhikevich神经元模型的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910399204.XA CN110598857B (zh) | 2019-05-14 | 2019-05-14 | 一种显示Izhikevich神经元模型的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110598857A CN110598857A (zh) | 2019-12-20 |
CN110598857B true CN110598857B (zh) | 2021-02-19 |
Family
ID=68852505
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910399204.XA Active CN110598857B (zh) | 2019-05-14 | 2019-05-14 | 一种显示Izhikevich神经元模型的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110598857B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113705139A (zh) * | 2021-09-22 | 2021-11-26 | 南京若吉电子有限公司 | 一种基于fpga的禁忌学习神经元电路实现方法和系统 |
CN116720554B (zh) * | 2023-08-11 | 2023-11-14 | 南京师范大学 | 一种基于fpga技术的多段线性拟合的神经元电路实现方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104615909A (zh) * | 2015-02-02 | 2015-05-13 | 天津大学 | 基于FPGA的Izhikevich神经元网络同步放电仿真平台 |
CN109670585A (zh) * | 2018-12-29 | 2019-04-23 | 中国人民解放军陆军工程大学 | 神经元仿生电路和神经形态系统 |
CN110414083A (zh) * | 2019-07-09 | 2019-11-05 | 常州大学 | 一种Chay模型电子神经元和仿真平台 |
-
2019
- 2019-05-14 CN CN201910399204.XA patent/CN110598857B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104615909A (zh) * | 2015-02-02 | 2015-05-13 | 天津大学 | 基于FPGA的Izhikevich神经元网络同步放电仿真平台 |
CN109670585A (zh) * | 2018-12-29 | 2019-04-23 | 中国人民解放军陆军工程大学 | 神经元仿生电路和神经形态系统 |
CN110414083A (zh) * | 2019-07-09 | 2019-11-05 | 常州大学 | 一种Chay模型电子神经元和仿真平台 |
Non-Patent Citations (3)
Title |
---|
"FPGA Implementation of Izhikevich Spiking Neural Networks for Character";Kenneth L.Rice.et al;《2009 International Conference on Reconfigurable Computing and FPGAs》;20091211;全文 * |
"QuartusII13.0使用教程详解(一个完整的工程建立)";NingHeChuan;《https://www.cnblogs.com/ninghechuan/p/6763686.html》;20170425;全文 * |
"基于FPGA的脉冲神经网络加速器设计";沈阳靖等;《电子科技》;20171015;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN110598857A (zh) | 2019-12-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP6893232B2 (ja) | 電子的設計の検証コマンドの翻訳のコンピュータ実装される方法および記録媒体 | |
US7324363B2 (en) | SPICE optimized for arrays | |
US8185368B2 (en) | Mixed-domain analog/RF simulation | |
US7302656B2 (en) | Method and system for performing functional verification of logic circuits | |
CN110598857B (zh) | 一种显示Izhikevich神经元模型的方法 | |
WO2007078915A2 (en) | System and method for generating a plurality of models at different levels of abstraction from a single master model | |
US20080208553A1 (en) | Parallel circuit simulation techniques | |
US20120166168A1 (en) | Methods and systems for fault-tolerant power analysis | |
Miskov-Zivanov et al. | Emulation of biological networks in reconfigurable hardware | |
Centomo et al. | Using systemc cyber models in an fmi co-simulation environment: Results and proposed fmi enhancements | |
Fritscher et al. | Simulating memristive systems in mixed-signal mode using commercial design tools | |
Tomlinson et al. | Designing Silicon Brains using LLM: Leveraging ChatGPT for Automated Description of a Spiking Neuron Array | |
EP3805977A1 (en) | Verification of hardware design for data transformation component | |
TW202107330A (zh) | 執行模擬基礎物理設計規則以最佳化電路佈局 | |
Reaz et al. | Single core hardware modeling of 32-bit MIPS RISC processor with a single clock | |
Arabyan et al. | Simultaneous Parametric and Functional Testing of Digital VLSI During Radiation Experiments | |
Lightner | Modeling and simulation of VLSI digital systems | |
Silva et al. | Posit-based Spiking Neuron in an FPGA | |
Seiler et al. | ATOMIC: Automatic Tool for Memristive IMPLY-based Circuit-level Simulation and Validation | |
CN108090239A (zh) | 一种基于tlm系统模型的分布式仿真方法 | |
US20240028803A1 (en) | Parameterized high level hierarchical modeling, and associated methods | |
Jaafar et al. | Three Bit Subtraction Circuit via Field Programmable Gate Array | |
Andelkovic et al. | New aspects in HDL's performance evaluation | |
Vrinceanu | Random-Based Model Generation for the Evaluation of Logic Synthesis Performance | |
Bhavani | FPGA Implementation of Canonical Signed Digit Algorithm Based Floating Point Multiplication |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CB03 | Change of inventor or designer information | ||
CB03 | Change of inventor or designer information |
Inventor after: Guo Lei Inventor after: Wang Yanchang Inventor after: Wu Huantao Inventor before: Guo Lei Inventor before: Wang Yanchang Inventor before: Man Menghua Inventor before: Wu Huantao |