njiggih

个性签名:官网:www.mdy-edu.com

  • 2019-03-20
  • 发布了课程: FPGA至简设计原理与应用

  • 2018-12-30
  • 加入了学习《FPGA至简设计原理与应用》,观看 4一位呼吸灯

  • 加入了学习《FPGA至简设计原理与应用》,观看 verilog、D触发器

  • 回复了主题帖: 【分享】FPGA通俗易懂的入门教材。规范设计,少走弯路

    多多关注!

  • 加入了学习《FPGA设计技巧规范》,观看 基于FPGA的小数的加减乘法实现

  • 2018-11-23
  • 发表了主题帖: 基于FPGA设计的数字时钟 毕设(视频 源码)

    视频过大,打包成15个压缩包

  • 2018-11-19
  • 回复了主题帖: 【分享】FPGA通俗易懂的入门教材。规范设计,少走弯路

    欢迎加技术交流群:97925396

  • 回复了主题帖: 基于fpga的FIR滤波器设计(附上源码代码下载)

    lizm215 发表于 2018-11-19 10:33 帖子不错,棒
    可以加技术群,大家交流下

  • 2018-11-16
  • 发表了主题帖: 基于fpga的FIR滤波器设计(附上源码代码下载)

    1.1 顶层接口 完整源码及完整文章下载技术交流群:97925396 新建目录:D:\mdy_book\fir_prj。在该目录中,新建一个名为fir_prj.v的文件,并用GVIM打开,开始编写代码。 我们要实现的功能,概括起来就是FPGA产生控制AD9709,让其中的通道A未滤波的正弦信号,让通道B输出滤波后的正弦信号。为了控制AD9709的工作模式,就要控制AD9709的MODE、SLEEP管脚;为了控制通道A,就需要控制AD9729的CLK1、WRT1、DB7~0P1管脚;为了控制通道B,就需要控制AD9729的CLK2、WRT2、DB7~0P2管脚。根据设计目标的要求,整个工程需要以下信号:1. 使用clk连接到晶振,表示50M时钟的输入。2. 使用rst_n连接到按键,表示复位信号。3. 使用3位信号key,表示三位拨码开关。4. 使用dac_mode信号连接到AD9709的MODE管脚,用来控制其工作模式。5. 使用dac_sleep信号连接到AD9709的SLEEP管脚,用来控制其睡眠模式。6. 使用dac_clka信号连接到AD9709的CLK1管脚,用来控制通道A的时钟。7. 使用dac_wra信号连接到AD9709的WRT1管脚,用来控制通道A的写使能。8. 使用8位信号dac_da连接到AD9709的DB7~0P1管脚,用来控制通道A的写数据。9. 使用dac_clkb号连接到AD9709的CLK2脚,用来控制通道B时钟。10. 使用dac_wrb号连接到AD9709的WRT2脚,用来控制通道B使能。11. 使用8位信号dac_db接到AD9709的DB7~0P2脚,用来控制通道B写数据。 综上所述,我们这个工程需要11个信号,时钟clk,复位rst_n,拨码开关的输入key,dac_mode、dac_sleep、dac_clka、dac_wra、dac_da、dac_clkb、dac_wrb和dac_db信号,其中dac_da和dac_db是8位信号,其他都是1位信号。下面表格表示了硬件电路图的连接关系。 器件AD9709管脚原理图信号FPGA管脚FPGA工程信号U8MODEDAC_MODEY4dac_modeSLEEPDAC_SLEEPH2dac_sleepCLK1DA_CLKAR2dac_clkaWRT1DA_WRAU1dac_wraDB7P1DAC_DA7AA1dac_da[7]DB6P1DAC_DA6Y2dac_da[6]DB5P1DAC_DA5Y1dac_da[5]DB4P1DAC_DA4W2dac_da[4]DB3P1DAC_DA3W1dac_da[3]DB2P1DAC_DA2V2dac_da[2]DB1P1DAC_DA1V1dac_da[1]DB0P1DAC_DA0U2dac_da[0]CLK2DA_CLKBR1dac_clkbWRT2DA_WRBP2dac_wrbDB7P2DAC_DB7P1dac_db[7]DB6P2DAC_DB6N2dac_db[6]DB5P2DAC_DB5N1dac_db[5]DB4P2DAC_DB4M2dac_db[4]DB3P2DAC_DB3M1dac_db[3]DB2P2DAC_DB2J1dac_db[2]DB1P2DAC_DB1J2dac_db[1]DB0P2DAC_DB0H1dac_db[0]X1 SYS_CLKG1clkK1 SYS_RSTAB12rst_n 将module的名称定义为fir_prj,代码如下: 123456789module fir_prj(           clk       ,           rst_n     ,           key       ,           dac_mode ,           dac_sleep ,           dac_clka  ,           dac_da   ,           dac_wra  ,           dac_clkb  ,           dac_db   ,           dac_wrb                          ); 其中clk、rst_n是1位的输入信号,dac_da和dac_db是8位的输出信号,key是3位输入信号,dac_mode,dac_clka,dac_wra,dac_sleep,dac_clkb,dac_wrb是一位输出信号。 1234567input             clk        ;input             rst_n      ;input  [ 3-1:0]    key        ;output            dac_mode ;output            dac_clka  ;output [ 8-1:0]    dac_da    ;output            dac_wra   ;output            dac_sleep ;output            dac_clkb  ;output [ 8-1:0]    dac_db    ;output            dac_wrb   ; 1.2 正弦信号设计假设产生的正弦信号命名为sin_data信号。sin_data是从表XX中选择出来的值,该表一共有128个点。该表的产生方法,请看案例“信号发生器和DA转换”一章的内容。采样点isin_data(16进制)采样点isin_data(16进制)采样点isin_data(16进制)采样点isin_data(16进制)07F32FE647D96118533FE657797128C34FE667098239235FD676A99349836FC6864100459E37FA695E10166A438F8705810277AA39F67152103A8B040F4724C104C9B641F17346105F10BC42EF74411061211C143EB753C1071512C644E876361081913CB45E477311091D14D046E0782C1102115D547DC79281112516DA48D880231122A17DE49D3811F1132E18E250CE821B1143319E651C983171153820EA52C484141163E21ED53BE85111174322F054B986E1184923F355B387B1194E24F556AD8891205425F757A78971215A26F958A19051226027FB599B9131236728FC60959221246D29FD618F9311257330FE62899411267931FE63829511277F 很自然地定义一个7位的选择信号addr。我们只要控制好addr,就能方便得到sin_data。因此可以写出下面代码。 123456789always  @(*)begin    case(addr)          0: sin_data = 8'h7F;          1: sin_data = 8'h85;          2: sin_data = 8'h8C;          3: sin_data = 8'h92;          4: sin_data = 8'h98;          5: sin_data = 8'h9E;          6: sin_data = 8'hA4;          7: sin_data = 8'hAA;          8: sin_data = 8'hB0;          9: sin_data = 8'hB6;         10: sin_data = 8'hBC;         11: sin_data = 8'hC1;         12: sin_data = 8'hC6;         13: sin_data = 8'hCB;         14: sin_data = 8'hD0;         15: sin_data = 8'hD5;         16: sin_data = 8'hDA;         17: sin_data = 8'hDE;         18: sin_data = 8'hE2;         19: sin_data = 8'hE6;         20: sin_data = 8'hEA;         21: sin_data = 8'hED;         22: sin_data = 8'hF0;         23: sin_data = 8'hF3;         24: sin_data = 8'hF5;         25: sin_data = 8'hF7;         26: sin_data = 8'hF9;         27: sin_data = 8'hFB;         28: sin_data = 8'hFC;         29: sin_data = 8'hFD;         30: sin_data = 8'hFE;         31: sin_data = 8'hFE;         32: sin_data = 8'hFE;         33: sin_data = 8'hFE;         34: sin_data = 8'hFE;         35: sin_data = 8'hFD;         36: sin_data = 8'hFC;         37: sin_data = 8'hFA;         38: sin_data = 8'hF8;         39: sin_data = 8'hF6;         40: sin_data = 8'hF4;         41: sin_data = 8'hF1;         42: sin_data = 8'hEF;         43: sin_data = 8'hEB;         44: sin_data = 8'hE8;         45: sin_data = 8'hE4;         46: sin_data = 8'hE0;         47: sin_data = 8'hDC;         48: sin_data = 8'hD8;         49: sin_data = 8'hD3;         50: sin_data = 8'hCE;         51: sin_data = 8'hC9;         52: sin_data = 8'hC4;         53: sin_data = 8'hBE;         54: sin_data = 8'hB9;         55: sin_data = 8'hB3;         56: sin_data = 8'hAD;         57: sin_data = 8'hA7;         58: sin_data = 8'hA1;         59: sin_data = 8'h9B;         60: sin_data = 8'h95;         61: sin_data = 8'h8F;         62: sin_data = 8'h89;         63: sin_data = 8'h82;         64: sin_data = 8'h7D;         65: sin_data = 8'h77;         66: sin_data = 8'h70;         67: sin_data = 8'h6A;         68: sin_data = 8'h64;         69: sin_data = 8'h5E;         70: sin_data = 8'h58;         71: sin_data = 8'h52;         72: sin_data = 8'h4C;         73: sin_data = 8'h46;         74: sin_data = 8'h41;         75: sin_data = 8'h3C;         76: sin_data = 8'h36;         77: sin_data = 8'h31;         78: sin_data = 8'h2C;         79: sin_data = 8'h28;         80: sin_data = 8'h23;         81: sin_data = 8'h1F;         82: sin_data = 8'h1B;         83: sin_data = 8'h17;         84: sin_data = 8'h14;         85: sin_data = 8'h11;         86: sin_data = 8'hE ;         87: sin_data = 8'hB ;         88: sin_data = 8'h9 ;         89: sin_data = 8'h7 ;         90: sin_data = 8'h5 ;         91: sin_data = 8'h3 ;         92: sin_data = 8'h2 ;         93: sin_data = 8'h1 ;         94: sin_data = 8'h1 ;         95: sin_data = 8'h1 ;         96: sin_data = 8'h1 ;         97: sin_data = 8'h1 ;         98: sin_data = 8'h2 ;         99: sin_data = 8'h3 ;        100: sin_data = 8'h4 ;        101: sin_data = 8'h6 ;        102: sin_data = 8'h7 ;        103: sin_data = 8'hA ;        104: sin_data = 8'hC ;        105: sin_data = 8'hF ;        106: sin_data = 8'h12;        107: sin_data = 8'h15;        108: sin_data = 8'h19;        109: sin_data = 8'h1D;        110: sin_data = 8'h21;        111: sin_data = 8'h25;        112: sin_data = 8'h2A;        113: sin_data = 8'h2E;        114: sin_data = 8'h33;        115: sin_data = 8'h38;        116: sin_data = 8'h3E;        117: sin_data = 8'h43;        118: sin_data = 8'h49;        119: sin_data = 8'h4E;        120: sin_data = 8'h54;        121: sin_data = 8'h5A;        122: sin_data = 8'h60;        123: sin_data = 8'h67;        124: sin_data = 8'h6D;        125: sin_data = 8'h73;        126: sin_data = 8'h79;        127: sin_data = 8'h7F;    endcaseend 接下来是设计信号addr。addr是用来控制选择数据的地址,通过控制addr的增加值,就能产生多种频率的正弦波。以频率为100KHz的正弦信号为例。该正弦信号的周期是10000ns。本工程的工作时钟是20ns,也就是10000/20 = 500个时钟输出一个正弦信号,也就是500个时钟将上表的128个值输出一遍。 此内容由EEWORLD论坛网友njiggih原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 回复了主题帖: 【分享】FPGA通俗易懂的入门教材。规范设计,少走弯路

    请大家继续关注,会继续分享

  • 2018-11-15
  • 发表了主题帖: 【分享】FPGA通俗易懂的入门教材。规范设计,少走弯路

    文章内容通俗易懂,推荐大家下载学习,文章太大,分开4个压缩包 此内容由EEWORLD论坛网友njiggih原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2018-11-14
  • 发表了主题帖: 基于FPGA的插值滤波器设计

    此内容由EEWORLD论坛网友njiggih原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2018-11-13
  • 发表了主题帖: 基于FPGA的AD/DA采集(附件源码代码)

    源码代码 1 项目背景 1.1 AD转换    AD转换就是模数转换。顾名思义,就是把模拟信号转换成数字信号。主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、电容阵列逐次比较型及压频变换型。    A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。    AD转换的技术指标,一般有如下几个:    1. 分辨率(Resolution) 指数字量变化一个最小量时模拟信号的变化量,定义为满刻度与2^n的比值。分辨率又称精度,通常以数字信号的位数来表示。    2. 转换速率(Conversion Rate)是指完成一次从模拟转换到数字的AD转换所需的时间的倒数。积分型AD的转换时间是毫秒级属低速AD,逐次比较型AD是微秒级属中速AD,全并行/串并行型AD可达到纳秒级。采样时间则是另外一个概念,是指两次转换的间隔。为了保证转换的正确完成,采样速率 (Sample Rate)必须小于或等于转换速率。因此有人习惯上将转换速率在数值上等同于采样速率也是可以接受的。常用单位是ksps和Msps,表 示每秒采样千/百万次(kilo / Million Samples per Second)。    3. 量化误差 (Quantizing Error) 由于AD的有限分辨率而引起的误差,即有限分辨率AD的阶梯状转移特性曲线与无限分辨率AD(理想AD)的转移特 性曲线(直线)之间的最大偏差。通常是1个或半个最小数字量的模拟变化量,表示为1LSB、1/2LSB。    4. 偏移误差(Offset Error) 输入信号为零时输出信号不为零的值,可外接电位器调至最小。    5. 满刻度误差(Full Scale Error) 满度输出时对应的输入信号与理想输入信号值之差。    6. 线性度(Linearity) 实际转换器的转移函数与理想直线的最大偏移,不包括以上三种误差。   其他指标还有:绝对精度(Absolute Accuracy) ,相对精度(Relative Accuracy),微分非线性,单调性和无错码,总谐波失真(Total Harmonic Distotortion缩写THD)和积分非线性。 1.2 教学板AD原理图    明德扬教学板上板载板载32Mhz 转换速率、8bit高速AD芯片AD9280,满足各种信号的采集,满足用户实现各种常见滤波算法的实现。实际位置如下所示:http://www.mdy-edu.com/Uploads/2018-10-15/5bc4ae82cbfbc.png图 599http://www.mdy-edu.com/Uploads/2018-11-08/5be3f43f597f6.png图 600    上面是AD9280的原理图。与FPGA相连的信号有:AD_D0~7、AD_OTR、AD_CLK。AD9280管脚 原理图信号 FPGA管脚 作用 CLK AD_CLK AD9280的工作时钟,最大是32MHz。 OTR AD_OTR 超过电压范围指示信号 D7 AD_D7 AD转换后的数字值。 D6 AD_D6 D5 AD_D5 D4 AD_D4 D3 AD_D3 D2 AD_D2 D1 AD_D1 D0 AD_D0 1.3 AD9280的控制时序    AD9280的控制时序如下图。http://www.mdy-edu.com/Uploads/2018-11-08/5be3f4fd9640d.png图 601http://www.mdy-edu.com/Uploads/2018-11-08/5be3f565e9d57.png图 602http://www.mdy-edu.com/Uploads/2018-11-08/5be3f57caa59c.png图 603    由时钟图可以看出,每个时钟就可以做AD转换一次,但会延迟3个时钟才输出。例如时序图中第一个时钟采集到S1,并对S1进行模数转换,经过3个时钟后,输出DATA1,这个DATA1就是S1所应对的数字值。    由参数时序可以看出,时钟最大是32MHz。    由上面时序可以看出,控制AD9280非常简单,只要给出不超过32MHz的时钟,然后对其采集就行了。 3 设计实现 3.1 顶层信号    新建目录:D:\mdy_book\ad_prj。在该目录中,新建一个名为ad_prj.v的文件,并用GVIM打开,开始编写代码。    我们要实现的功能,概括起来就是FPGA产生控制AD9709,让其中的通道A产生正弦波所对应的电压,同时采集AD9280的数据并观察。为了控制AD9709的通道A,就需要控制AD9709的MODE、SLEEP、CLK1、WRT1、DB7~0P1管脚。为了采集AD9280,那么就需要控制AD9280的CLK、D0~D7管脚。根据设计目标的要求,整个工程需要以下信号:    1. 使用clk连接到晶振,表示50M时钟的输入。    2. 使用rst_n连接到按键,表示复位信号。    3. 使用3位信号key,表示三位拨码开关。    4. 使用dac_mode信号连接到AD9709的MODE管脚,用来控制其工作模式。    5. 使用dac_sleep信号连接到AD9709的SLEEP管脚,用来控制其睡眠模式。    6. 使用dac_clka信号连接到AD9709的CLK1管脚,用来控制通道A的时钟。    7. 使用dac_wra信号连接到AD9709的WRT1管脚,用来控制通道A的写使能。    8. 使用8位信号dac_da连接到AD9709的DB7~0P1管脚,用来控制通道A的写数据。    9. 使用ad_clk信号连接到AD9280的CLK管脚,用来作来采样时钟。    10. 使用8位ad_in信号连接到AD9280的D7~0管脚,用来采集数据。    综上所述,我们这个工程需要10个信号,时钟clk,复位rst_n,dac_mode、dac_sleep、dac_clka、dac_wra、dac_da、ad_clk和ad_in,其中dac_da 、ad_in是8位信号,key是3位信号,其他都是1位信号。器件 AD9709管脚 AD9280管脚 原理图信号 FPGA管脚 FPGA工程信号 U8 MODE DAC_MODE Y4 dac_mode SLEEP DAC_SLEEP H2 dac_sleep CLK1 DA_CLKA R2 dac_clka WRT1 DA_WRA U1 dac_wra DB7P1 DAC_DA7 AA1 dac_da[7] DB6P1 DAC_DA6 Y2 dac_da[6] DB5P1 DAC_DA5 Y1 dac_da[5] DB4P1 DAC_DA4 W2 dac_da[4] DB3P1 DAC_DA3 W1 dac_da[3] DB2P1 DAC_DA2 V2 dac_da[2] DB1P1 DAC_DA1 V1 dac_da[1] DB0P1 DAC_DA0 U2 dac_da[0] U1 CLK AD_CLK L6 ad_clk D7 AD_D7 N5 ad_in[7] D6 AD_D6 M4 ad_in[6] D5 AD_D5 M5 ad_in[5] D4 AD_D4 R6 ad_in[4] D3 AD_D3 T5 ad_in[3] D2 AD_D2 U7 ad_in[2] D1 AD_D1 V5 ad_in[1] D0 AD_D0 V6 ad_in[0] X1 SYS_CLK G1 clk K1 SYS_RST AB12 rst_n sw0 SW_D0 AA3 key[2] sw1 SW_D1 AB3 key[1] sw2 SW_D2 AB5 key[0]     将module的名称定义为ad_prj,代码如下:123456789    module ad_prj(               clk       ,               rst_n     ,               key       ,               dac_mode ,               dac_clka  ,               dac_da   ,               dac_wra  ,               dac_sleep,               ad_clk    ,               ad_in                     );     其中clk、rst_n是1位的输入信号,dac_da是8位的输出信号,dac_mode,dac_clka,dac_wra,dac_sleep是1位输出信号,ad_clk是1位输出信号,ad_in是8位输入信号,key是3位输入信号。1234567    input             clk        ;     input             rst_n      ;     input [ 3-1:0]     key        ;     output            dac_mode ;     output            dac_clka  ;     output [ 8-1:0]    dac_da    ;     output            dac_wra   ;     output            dac_sleep ;     output            ad_clk    ;     input  [8-1:0]      ad_in     ; 3.2 信号设计    由于正弦信号的产生要求,与“FIR滤波器设计”相同,所以不再详细描述原因。现在把相关代码整理如下。1234567891011121314    always  @(*)begin         case(addr)               0: sin_data = 8'h7F;               1: sin_data = 8'h85;               2: sin_data = 8'h8C;               3: sin_data = 8'h92;               4: sin_data = 8'h98;               5: sin_data = 8'h9E;               6: sin_data = 8'hA4;               7: sin_data = 8'hAA;               8: sin_data = 8'hB0;               9: sin_data = 8'hB6;              10: sin_data = 8'hBC;              11: sin_data = 8'hC1;              12: sin_data = 8'hC6;              13: sin_data = 8'hCB;              14: sin_data = 8'hD0;              15: sin_data = 8'hD5;              16: sin_data = 8'hDA;              17: sin_data = 8'hDE;              18: sin_data = 8'hE2;              19: sin_data = 8'hE6;              20: sin_data = 8'hEA;              21: sin_data = 8'hED;              22: sin_data = 8'hF0;              23: sin_data = 8'hF3;              24: sin_data = 8'hF5;              25: sin_data = 8'hF7;              26: sin_data = 8'hF9;              27: sin_data = 8'hFB;              28: sin_data = 8'hFC;              29: sin_data = 8'hFD;              30: sin_data = 8'hFE;              31: sin_data = 8'hFE;              32: sin_data = 8'hFE;              33: sin_data = 8'hFE;              34: sin_data = 8'hFE;              35: sin_data = 8'hFD;              36: sin_data = 8'hFC;              37: sin_data = 8'hFA;              38: sin_data = 8'hF8;              39: sin_data = 8'hF6;              40: sin_data = 8'hF4;              41: sin_data = 8'hF1;              42: sin_data = 8'hEF;              43: sin_data = 8'hEB;              44: sin_data = 8'hE8;              45: sin_data = 8'hE4;              46: sin_data = 8'hE0;              47: sin_data = 8'hDC;              48: sin_data = 8'hD8;              49: sin_data = 8'hD3;              50: sin_data = 8'hCE;              51: sin_data = 8'hC9;              52: sin_data = 8'hC4;              53: sin_data = 8'hBE;              54: sin_data = 8'hB9;              55: sin_data = 8'hB3;              56: sin_data = 8'hAD;              57: sin_data = 8'hA7;              58: sin_data = 8'hA1;              59: sin_data = 8'h9B;              60: sin_data = 8'h95;              61: sin_data = 8'h8F;              62: sin_data = 8'h89;              63: sin_data = 8'h82;              64: sin_data = 8'h7D;              65: sin_data = 8'h77;              66: sin_data = 8'h70;              67: sin_data = 8'h6A;              68: sin_data = 8'h64;              69: sin_data = 8'h5E;              70: sin_data = 8'h58;              71: sin_data = 8'h52;              72: sin_data = 8'h4C;              73: sin_data = 8'h46;              74: sin_data = 8'h41;              75: sin_data = 8'h3C;              76: sin_data = 8'h36;              77: sin_data = 8'h31;              78: sin_data = 8'h2C;              79: sin_data = 8'h28;              80: sin_data = 8'h23;              81: sin_data = 8'h1F;              82: sin_data = 8'h1B;              83: sin_data = 8'h17;              84: sin_data = 8'h14;              85: sin_data = 8'h11;              86: sin_data = 8'hE ;              87: sin_data = 8'hB ;              88: sin_data = 8'h9 ;              89: sin_data = 8'h7 ;              90: sin_data = 8'h5 ;              91: sin_data = 8'h3 ;              92: sin_data = 8'h2 ;              93: sin_data = 8'h1 ;              94: sin_data = 8'h1 ;              95: sin_data = 8'h1 ;              96: sin_data = 8'h1 ;              97: sin_data = 8'h1 ;              98: sin_data = 8'h2 ;              99: sin_data = 8'h3 ;             100: sin_data = 8'h4 ;             101: sin_data = 8'h6 ;             102: sin_data = 8'h7 ;             103: sin_data = 8'hA ;             104: sin_data = 8'hC ;             105: sin_data = 8'hF ;             106: sin_data = 8'h12;             107: sin_data = 8'h15;             108: sin_data = 8'h19;             109: sin_data = 8'h1D;             110: sin_data = 8'h21;             111: sin_data = 8'h25;             112: sin_data = 8'h2A;             113: sin_data = 8'h2E;             114: sin_data = 8'h33;             115: sin_data = 8'h38;             116: sin_data = 8'h3E;             117: sin_data = 8'h43;             118: sin_data = 8'h49;             119: sin_data = 8'h4E;             120: sin_data = 8'h54;             121: sin_data = 8'h5A;             122: sin_data = 8'h60;             123: sin_data = 8'h67;             124: sin_data = 8'h6D;             125: sin_data = 8'h73;             126: sin_data = 8'h79;             127: sin_data = 8'h7F;         endcase     end     always  @(posedge clk or negedge rst_n)begin         if(rst_n==1'b0)begin             addr_tmp

  • 回复了主题帖: 明德扬至简设计法原理与应用--1.1FPGA简介

    star_66666 发表于 2018-11-12 18:09 抄袭??????
    当然不是啦,分享

  • 2018-11-12
  • 发表了主题帖: 明德扬至简设计法原理与应用--1.1FPGA简介

    本帖最后由 njiggih 于 2018-11-12 16:37 编辑 第一章 FPGA简介 1 什么是FPGAFPGA的官方解释是 : Field-Programmable Gate Array,即现场可编程门阵列,它是在PAL、GAL、CPLD(不用读系列)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。可以将FPGA理解为大量的逻辑门阵列,用户可以自由组合以实现不同的电路功能,即FPGA的可编程特性。相比于冯诺依曼结构的CPU、GPU等通用处理器,FPGA具有效率更高速度更快的优点;相比于专职专用的ASIC,FPGA则具有开发难度小,开发周期更短的优势,更适用于复杂多变的数据中心等应用但是FPGA也不是万能的,优势有时候也是劣势。虽然FPGA相比于CPU效率更高、功耗更低的特点,但是易于开发程度远远不如CPU;虽然相比ASIC开发周期更短,但是也存在着资源浪费,成本过高、性能较差的问题,不能真正的替代ASIC。 2 FPGA的工作原理由于FPGA需要反复烧写,所以他实现组合逻辑的结构不能像ASIC那样通过固定的与非门来完成,而只能采用一种抑郁反复配置的结构。查找表(LUT)可以很好地满足这一要求,目前主流FPGA都采用了基于SRAM工艺的查找表结构。通过烧写文件改变查找表内容的方法来实现对FPGA的重复配置。根据数字电路的基本知识可以知道,对于一个n输入的逻辑运算,不管是与或非运算还是异或运算等等,最多只可能存在2n种结果。所以如果事先将相应的结果存放在一个存储单元,就相当于实现了与非门电路的功能。FPGA的原理就是如此,他通过烧写文件去配置查找表的内容,从而在相同的电路情况下实现了不同的逻辑功能。 查找表(Look-Up-Table)简称为LUT,LUT本质上就是一个RAM。目前FPGA中多实用4输入的LUT,所以每一个LUT可以看成一个有4位地址线的RAM。当用户通过原理图或HDL语言描述了一个逻辑电路以后,FPGA开发软件会自动计算逻辑电路的所有可能结果,并把真值表(即结果)事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查找表,找出相应的内容,然后输出即可。以实现y=(a&b)|c的功能为例。如果是ASIC,下面就是基本的实现结构:http://www.mdy-edu.com/Uploads/2018-10-30/5bd7c2bb9c54f.png图 1而在FPGA,用户首先写出“y=(a&b)|c”代码,软件工具(QUARTUS、ISE或VIVADO)分析这一行代码,得出a、b、c不同值下(共8种不同值),y的值分别是多少。http://www.mdy-edu.com/Uploads/2018-10-30/5bd7c288d8d9a.png然后软件工具将结果写到LUT上,从而实现了该代码的功能。下图就是FPGA的实现基本结构。LUT就像一个RAM,abc则相当于地址,通过abc的地址就得读到值赋给y。http://www.mdy-edu.com/Uploads/2018-10-30/5bd7c22bb218f.png图 2 3 更为复杂的FPGA架构赛灵思公司在1985年推出的第一块FPGA—XC2064包含8×8=64的逻辑块阵列,每个逻辑块包含一个四输入查找表及其它一些简单功能。由于它们的容量非常有限,因此早期的FPGA只用来执行一些相对简单的任务,比如集中一些胶合逻辑,或实现基本的状态机。随着时间的推移和工艺节点的进步,FPGA的容量和性能不断得到提高,功耗却不断的下降。直到大约2006年以前广泛使用的一直是四输入查找表,一些高端器件可能使用六、七或八输入的查找表。这些大家伙可能被用作一个大的查找表,或分裂成许多更小的功能,比如两个四输入的查找表或一个三输入一个五输入的查找表。在实际的高端器件中,这种可编程构造可以描述相当于百万级(有时甚至千万级)的原始逻辑门。如果某个逻辑功能(比方说计数器)是用FPGA的可编程构造实现的,那么这个功能可以被说成“软功能”,我们称之为软内核。相比之下,如果某个功能是直接用芯片实现的,则被说成“硬功能”,我们一般称之为硬内核。软内核的优势在于,你可以让它们做你想让它们做的任何事,注意,是数字功能,不包括模拟功能。硬内核的优势是它们占用较少的硅片面积,具有较高的性能,并且功耗较低,并且硬内核可用于实现模拟功能。例如锁相环的倍频功能,这需要用于模拟电路,所以这一部分是在FPGA内部用硬件来实现的。 4 带嵌入式处理器的FPGA我们可以用FPGA中的普通可编程构造做的事情之一是,使用其中的一部分实现一个或多个软处理器内核。当然,你可以实现不同规模的处理器。举例来说,你可以创建一个或多个8位的处理器,加上一个或多个16位或32位的软处理器—所有处理器都在同一器件中。如果FPGA供应商希望提供一个占用较少硅片面积、消耗较低功率但性能更高的处理器,解决方案是将它实现为硬内核。现在流行的ZYNQ,就是由赛灵思公司推出的,内部集成了ARM硬核的FPGA芯片。考虑下面所示这个例子:http://www.mdy-edu.com/Uploads/2018-10-15/5bc43e2f983bb.png图 3  这个芯片完全以硬内核方式实现的双路ARM Cortex-A9微控制器子系统(运行时钟高达1GHz,包含浮点引擎,片上缓存,计数器,定时器等),以及种类广泛的硬内核接口功能(SPI,I2C,CAN等),还有一个硬内核的动态内存控制器,所有这些组件都利用大量传统的可编程构造和大量的通用输入输出(GPIO)引脚进行了性能增强。如果需要高速、高性能的处理器,并且需要实现逻辑编程时,传统的方法是在电路板上放置处理器(如ARM、DSP等)和FPGA,ARM或者DSP工程师实现软件部分,FPGA工程师实现可编程逻辑部分,两者协同合作。现在最新的方案,就可以使用ZYNQ一个芯片,以更低的功耗、更高的速度实现上面的功能。如果是ZYNQ单芯片方案,是不是意味着只需要软件工程师或者FPGA工程师独立工作就可以了呢?笔者现时所了解的情况是:FPGA工程师负责搭建周边电路,如ARM的接口、时钟配置等,还负责可编程逻辑部分的开发。而软件部分仍然还是软件工程师负责。这主要原因是,FPGA逻辑开发和软件开发都是专业性比较强的技能,非常少的工程师能同时掌握这两个技能。当然,这里说的掌握性能,是专业性的、能应用到企业项目的技能,只是接触一下的不算。 5 编程方式FPGA是由存放在片内的RAM来设置其工作状态的,因此工作室需要对片内RAM进行编程。用户可根据不同的配置模式,采用不同的编程方式。FPGA有如下几种配置模式:1、并行模式:并行PROM、Flash配置FPGA;2、主从模式:一片PROM配置多片FPGA;3、串行模式:串行PROM配置FPGA;4、外设模式:将FPGA作为微处理器的外设,由微处理器对其编程。目前,FPGA市场占有率最高的两大公司Xlinx和Altera生产的FPGA都是基于SRAM工艺的,需要在使用时外接一个片外存储器以保存程序。上电时,FPGA将外部存储其中的数据读入片内RAM,完成配置后,进入工作状态;掉电后FPGA恢复为白片,内部逻辑消失。这样FPGA不仅能反复使用,还无需专门的FPGA编程器,只需通用的EPROM、PROM编程器即可。 原文出处:http://www.mdy-edu.com/product/784.html 此内容由EEWORLD论坛网友njiggih原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2018-10-24
  • 发表了主题帖: 推荐fpga入门开发板

    本帖最后由 njiggih 于 2018-10-24 12:01 编辑 推荐一个入门挺好的开发板,先介绍,过几天写测评: 下图总体展示了明德扬mp801开发板的硬件资源。如下所示: 明德扬mp801开发板板载众多的外设,从简单的led到复杂的sdram等一应俱全,其中板载EP4CE15F23C8,拥有15K逻辑资源,504K bit ram资源,且板载3片128M bit sdram,适合存储大容量的数据;并且拥有125Mhz 双通道转换速率的高速并行DA芯片AD9709和32Mhz 转换速率的高速并行AD芯片AD9280,编程简单,适用做算法验证;并且采用64M spi flash存储器存储程序,满足开发需求。 1. Led 灯原理图如下所示: 开发板led电路采用上拉接法,板载8个绿色的led。在开发板的实际位置如下所示: 2. 数码管板载红色8个数码管,采用动态显示的方式和fpga连接,其中数码管采用共阳极数码管,实际在开发板上的位置如下所示: 3. 拨码开关拨码开关原理图如下所示,用户可以使其电平一直为0或1。 实际在开发板上的位置如下所示: 4. 按键按键原理图如下所示,开发板采用4个独立按键,且采用上拉的接法,默认为1,当按键按下时,按键的电平被拉低。 在开发板中的实际位置如下: 5. 蜂鸣器蜂鸣器采用有源蜂鸣器,原理图如下所示,蜂鸣器使用pnp三极管驱动,当fpga驱动引脚电平为0,蜂鸣器会发出声响。在开发板中的实际位置如下: 6. 温度传感器温度传感器采用ds18b20,用户可以实时检测周围的温度。在开发板中的实际位置如下所示:7. EEPROM 存储器板载AT93C46存储器,拥有1K bit的容量,存储时间100年,满足用户存储需要掉电保存的数据。实际在开发板中的位置如下所示: 8. vga显示Vga显示使用16bit数据线,可以显示65536种颜色,在开发板中的位置如下所示。9. sdram存储器明德扬mp801开发板采用三片128Mbit sdram,满足大容量存储数据的需求,实际位置如下所示: 10. 千兆网口板载rtl8211芯片,实现千兆网,1G的带宽,满足用户传输大容量数据的要求。实际在开发板中的位置如下所示:11. usb串口板载CH340芯片,实现usb转串口,当用户通过usb线连接开发板和pc后,便可使用串口助手和fpga通信。实际位置如下所示: 12. AD9709板载双通道、125Mhz 转换速率、8bit、高速DA芯片,满足常用信号发生器、滤波信号输出等需求。实际位置如下所示:13.  AD9280板载32Mhz 转换速率、8bit高速AD芯片,满足各种信号的采集,满足用户实现各种常见滤波算法的实现。实际位置如下所示: 14. 其他介绍本开发板预留常见cmos接口,其中P8兼容ov7670/5640/7725摄像头,在开发板中的位置如下所示。 同时,本开发板拥有TFT屏幕接口,对用开发板中的P2的位置,tft屏幕即将推出,尽请期待。http://file:///C:\\Users\\kong\\AppData\\Local\\Temp\\ksohtml\\wps39FE.tmp.jpg 同时,开发板预留一些未用的接口,对应的标号为P12和P13,在开发板中的位置如下所示。http://file:///C:\\Users\\kong\\AppData\\Local\\Temp\\ksohtml\\wps3A0F.tmp.jpg http://file:///C:\\Users\\kong\\AppData\\Local\\Temp\\ksohtml\\wps3A1F.tmp.jpg 最后,开发板提供5V、3.3V电源输出,对应的标号为P10,在开发板中的位置如下所示。http://file:///C:\\Users\\kong\\AppData\\Local\\Temp\\ksohtml\\wps3A30.tmp.jpg 附录:明德扬开发板尺寸信息:长 * 宽  130mm * 100mm  pcb: 6层镀金工艺。

  • 2018-10-10
  • 发表了日志: 明德扬至简设计法--verilog综合器和仿真器

  • 2018-09-05
  • 发表了主题帖: 【转】FPGA寄存器自动化配置核心设计技巧

    本博文设计思想采用明德扬至简设计法。之前都是通过一些完整的案例来分享设计心得,而这篇文章以需要配置多个寄存器的场景讲述核心设计技巧。    在设计案例时发现,经常会配置比较复杂的IP核或驱动一些接口进而操作外设。此时,为了让外设或IP核正常工作,需要对其内部多个寄存器进行适当配置来保证在所需模式下正常工作。我们一般先设计接口模块或IP核顶层文件,之后通过控制模块按照先后顺序自动给出所需指令,如读写等(下面的讲述以只有读写指令为例)。接口模块或IP核顶层模块收到指令后完成相应的操作。    第一个问题:如何实现多个寄存器且每个寄存器多个指令的自动化配置?    我们可以在控制模块中建立一个“配置表”,把读写指令以及相应的地址和待写入数据保存其中,然后通过计数器进行指令扫描。这里需要两级计数器,第一级计数一个寄存器的指令数,第二级计数器记录已经操作过的寄存器个数。配置表以always组合逻辑中case语句块形式给出,使用寄存器计数值区分不同寄存器。区分出待操作寄存器后根据操作计数器解析出读写指令。    第二个问题:当控制模块给出指令时,接口模块或IP核一定能有时间响应么?    这是我们设计时需要深思熟虑的问题:如何才能保证给出的指令一定会被下一模块有效地响应?为了实现这一目的,可以在控制(配置)模块和时序接口模块或IP核顶层模块之间放置一个接口衔接模块,结构如下:http://bbs.eetop.cn/attachments/month_1809/1809040958be38bc338b757354.jpg     根据上述需求定义衔接模块功能:在下游模块准备好后才让上游模块ctrl给出下一命令,否则等待。并完成读出的有效数据送到上游模块的任务。很简单,下游模块输出给控制模块一个信号rdy,当它为高电平时代表当前没有指令或者上一指令已响应完成。控制模块中指令计数器的原有计数条件和rdy==1条件逻辑与就完成了上述功能。这里需要特别注意的是:rdy信号必须以组合逻辑形式给出,否则由于rdy信号晚一拍输出,上游模块会出现误认情况。核心代码如下:    控制模块中:http://bbs.eetop.cn/attachments/month_1809/18090410029abd9030e3bf33a7.jpg http://bbs.eetop.cn/attachments/month_1809/180904100393f6864a8a0e84c1.jpg http://bbs.eetop.cn/attachments/month_1809/18090410039d3eb3720e98bb68.jpg     衔接模块中:http://bbs.eetop.cn/attachments/month_1809/18090410033805f00b88314614.jpg http://bbs.eetop.cn/attachments/month_1809/18090410037fd77051100e47a9.jpg     到此,寄存器自动化配置中两个重点问题已然解决。本文是我在设计摄像头图像采集和以太网两个案例过程中总结所得。本人认为这种设计思想非常具有通用性,并不仅仅局限于这两个案例,因此单独提出,以备今后回顾和重用。 转自:博客园-没落骑士    想要了解更多技术文章,欢迎关注www.mdy-edu.com/product/list/35

  • 2018-09-01
  • 发表了主题帖: FPGA反推法应用实例——检查代码

    FPGA反推法应用实例——检查代码对于IT相关从业人员来说,看别人代码是必不可少的磨难。在学习阶段,我们经常需要从书上看别人的代码以吸取宝贵经验,这是相当枯燥无趣的过程,也时常无法领会作者的意图。在实际工作中,不可避免的出现需要接手做到一半的项目或是团队合作的项目,这时候就必须看以前的工程师的代码。如果说看书上的代码用痛苦来形容的话,那么这种情况时遇到代码不够规范或者设计不合理,简直就是苦不堪言。还有一些神一般的选手,设计者在编写代码时的“灵机一动”,其结果只有他自己和上帝才看得懂。这些代码能看得你觉得生不如死,甚至开始怀疑人生:到底是代码写得混乱or我水平不行?!你以为这是最痛苦的吗?NO!还有一种情况足以令你看得生不如死,甚至开始怀疑人生。那就是遇到运行不正常的代码,对问题排查错误花的时间和精力还不如重新写一遍,这时你的内心完全是崩溃的! 有一件事非常无奈,我们不可能要求别人的代码都非常规范。所以,正确的学习方法和思维方式尤为重要。怎样看他人代码才是正确的方式?看代码之前应该做些什么准备工作?看代码用正向思维还是逆向思维?如何判断代码中哪些地方是否值得借鉴?由此,掌握到一种通用的去看懂别人代码的技巧显得非常重要。下面我们就来谈谈这方面。 我们知道,实现功能可能有很多种方法,所以不同的人写出的代码不相同。通过看代码去知道它要实现的是什么功能是一件很困难的事情。有些初学者会想到采取仿真一下、看电路图、流程图、时序图、注释等等方法,都是不可取的,通过这些你还是无法知道它的功能,以及有没有错误。 那么正确的方法是什么呢?我们采取一种可称之为“反推法”或是“逆向法”的方式,这个问题就迎刃而解了。要知道,代码的目的是实现功能。无论你用那种代码,有一点完全相同的就是“实现功能”这个最终结果。了解到这一点,我们就可以通过结果(功能)去反推过程(代码),代码的思路、流程、用途就抽丝剥茧清晰的显露出来。 好的,下面我们举个实例来说明怎么通过反推法有步骤的去看懂别人的代码。实例见附件

  • 2018-08-30
  • 发表了日志: 基于FPGA的Ethercat定制栈最大可实现32轴

最近访客

< 1/1 >

统计信息

已有24人来访过

  • 芯币:181
  • 好友:--
  • 主题:37
  • 回复:75
  • 课时:13
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言