文章目录

  • 前言
  • “万能”的查表法
  • 正弦波发生器示例

前言

又好几天没更新了,这就是又停止了读书的节奏,终于在毕业论文可以稍微舒缓下来的时候更新了博客,完成一个系列,读完一本书等等都是有印记的,这是很有成就感的事情。
最重要的声明来了,本文摘自于《FPGA之道》。

“万能”的查表法

查表法的应用范围非常之广,利用查表法,我们可以实现任意的组合逻辑功能,甚至可以实现任意的时序逻辑功能(详见【知己知彼篇->FPGA内部资源介绍->逻辑资源块】中关于查找表的介绍,以及【本篇->编程思路->状态机,FPGA的灵魂->状态机的实现方式->基于RAM的实现方式浅析】章节),因此,只要系统提供的存储空间(可以是FPGA内部的或外部的)足够大,查表法可以帮助我们实现任何想实现的逻辑功能,这也是为什么我们说查表法是“万能的”了。
当然了,对于FPGA设计者来说,通常我们使用查表法,都是为了解决组合逻辑方面的问题,例如,实现任意波形发生器,或者实现任意函数求解器,等等。采用查表法来实现组合逻辑的优点是——逻辑功能实现起来相对较为简单(核心技术就是数据的存储与读取而已),且整个组合逻辑的延迟也相对较小且固定(无论功能复杂还是简单,基于查找表的逻辑延迟仅取决于存储器的地址总线到数据输出总线之间的延迟);不过其缺点就是会消耗过多的系统存储空间(存储空间大小与组合逻辑的输入端口数呈二的整数次幂关系)。因此,虽然查表法是“万能”的,但是在进行FPGA项目开发时,我们不能把它当成万能膏药,到处乱贴,只有对于那些适合的情况,才应该予以考虑,从而达到出其不意的绝妙效果。那么,本章节接下来以几个示例来为大家简单的介绍一下查表法的使用。

正弦波发生器示例

现假设FPGA外部有一块DA芯片,我们要利用这块DA芯片向外界发送一路频率为1MHz的模拟正弦波。
已知FPGA内部主时钟频率为10MHz,外部DA芯片接收8bits并行数字信号并将其转换为电压值,其中数字信号取值范围为整数0255,而DA芯片会将其均匀转换到对应的模拟电压-1.51.5V之间。
在不倍频的前提下,10MHz的时钟信号就代表发送给DA芯片的数字序列采样率最高为10MHz,因此采样间隔为100ns。而1MHz的正弦波的周期为1000ns,正好1个正弦波周期可以被10MHz的采样率均匀的采上10个点。综上所述,我们可以从正弦波的一个周期中均匀的取出10个样点的值(初始相位不同,结果也会有不同,本例以0弧度作为起始相位),如下图所示:

然后对其进行放大、直流偏移、整数近似等操作,进而得出10个介于0~255之间的正弦波采样点。最后,以10MHz的频率循环发送这10个采样点给DA芯片,便可实现发送1路1MHz模拟正弦波的需求。
下述即为正弦波发生器的HDL示例:

-- VHDL examplelibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity SinWave isport (clk : in  std_logic;rst : in  std_logic;toDAClk : out  std_logic;toDAData : out std_logic_vector(7 downto 0));end SinWave;architecture Behavioral of SinWave istype rom_type is array (9 downto 0) of std_logic_vector (7 downto 0);signal ROM: rom_type:= (X"35", X"07", X"07", X"35", X"80", X"CB", X"F9", X"F9", X"CB", X"80");beginprocess(clk)beginif(clk'event and clk = '1')thenif(rst = '1')thenaddr <= "0000";else                        if(addr = "1001")thenaddr <= "0000";elseaddr <= addr + 1;end if;end if;end if;end process;end Behavioral;
// Verilog examplemodule SinWave(input clk,input rst,output toDAClk,output [7:0] toDAData);reg [7:0] ROM [9:0];reg [3:0] addr;initial beginROM[0] = 8'd128; ROM[1] = 8'd203; ROM[2] = 8'd249; ROM[3] = 8'd249;
ROM[4] = 8'd203; ROM[5] = 8'd128; ROM[6] = 8'd53; ROM[7] = 8'd7;
ROM[8] = 8'd7; ROM[9] = 8'd53;endalways@(posedge clk)beginif(rst == 1'b1)beginaddr <= 4'd0;endelsebeginif(addr == 4'd9)beginaddr <= 4'd0;endelsebeginaddr <= addr + 1'b1;endendendassign toDAClk = ~ clk; assign toDAData = ROM[addr];endmodule

上例的仿真结果如下图所示:

由于实际硬件系统的带宽都是有限的,如果在DA芯片的输出端再配合使用适当的模拟滤波器,那么该系统实际所发出的模拟正弦波将会比上图更加的圆润。

FPGA之道(63)“万能”的查表法相关推荐

  1. FPGA如何利用查表法得到某角度所对应的正弦值、余弦值

    FPGA如何利用查表法得到某角度所对应的正弦值.余弦值 1 实现思路 2 具体实现步骤 2.1 MATLAB生成sin.coe文件和cos.coe文件 2.2 将sin.coe和cos.coe文件分别 ...

  2. VTK修炼之道23:图像基本操作_灰度图像映射成伪彩色图像(查表法)

    1.查表法伪彩图映射 图像彩色映射的原理是首先生成一个颜色查找表,然后根据图像的一个标量值向颜色查找表中查找对应的颜色,并用新颜色值替代原来的像素值.VTK中vtkImageMapToColors负责 ...

  3. LUT查表法乘法器所犯下错误。。。。

    程序参见黑金时序篇一章实验五LUT查表法实验,不同的是LUT我用了一个ROM来实现,word depth 256,word size 16,数据用matlab生成,发现matlab确实好强大,不用操作 ...

  4. CRC8 CRC16 查表法

    转自:http://blog.chinaunix.net/uid-14114479-id-1988515.html CRC8查表法 /********************************* ...

  5. CRC查表法——表的由来及Java实现CRC8校验算法

    转载请标明出处: http://blog.csdn.net/xx326664162/article/details/51718857 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定 ...

  6. crc16modbus查表法_CRC16查表法校验,多项式A001,MODBUS的CRC16校验

    本帖最后由 努力的码农 于 2018-5-15 11:43 编辑 最近调试了CRC16的查表法校验,适合上位机走modbus与工业设备相连,采用查表法,速度很快,亲测10000+字节用时不超过1ms, ...

  7. 单片机c语言NTC温度查表程序,STM32查表法读NTC值并显示温度

    STM32查表法读NTC值并显示温度 #include "stm32f10x.h"Y'+F0IZ+ #include "delay.h"pU'`9fLi_ #i ...

  8. crc16modbus查表法_查表法计算CRC16校验值

    /******************************************************************************* * Copyright (c) 201 ...

  9. 嵌入式C语言查表法的项目应用

    嵌入式C实战项目开发技巧:如何对一个有规律的数组表进行位移操作 就像下面的这个表 之前写过上面这个标题的一篇文章,讲的是以位移的方式去遍历表中的数据,效率非常高,但是,如果要实现一个乱序的流水灯或者跑 ...

最新文章

  1. Fastsocket学习笔记之小结篇
  2. 【已解决】TypeError: bind() takes exactly one argument (2 given)
  3. Android之解决打补丁包后移动端为什么不升级,升级之后出现“应用未安装“,以及更新成功之后反复更新问题
  4. AUTOSAR从入门到精通100讲(三十四)-AUTOSAR的分层架构
  5. Mr.J-- 简单生日页面制作
  6. Bootstrap按钮支持的元素
  7. 优麒麟 20.04 LTS 版本发布,UKUI3.0 灵动转身
  8. JS 使用正则表达式参考,分组捕获,遍历输出所有匹配结果
  9. H.266/VVC代码学习:xCheckRDCostMerge2Nx2N函数
  10. 48小时备考TOGAF经验分享
  11. 关于XRD你知道多少
  12. 每天一段,成功拿到你心仪的offer
  13. linux下录音识别成文字软件,如何将录音转换成文字?录音转文字简单方法介绍...
  14. Spring Boot使用方法小札(3):应用启动后做一些事
  15. 总线 —— 总线标准
  16. 74HC165并转串级联芯片学习记录
  17. 大数据学情分析_大数据背景下的大学生学情分析研究
  18. 简信CRM:在线crm这两个指标非常重要!
  19. 替换空格(C++和Python 实现)
  20. 微信小程序直播有哪些优势

热门文章

  1. VMware Server 2.0简单学习!
  2. NIX***检测方法
  3. centos 静态ip_CentOS 6 静态 IP 配置
  4. nemanja AJAX,通过AJAX发送空值 - ASP.NET MVC
  5. 输电线路巡检机器人PPT_超高压输电线路巡检机器人系统
  6. python looper_入门级python线程问题
  7. linux syslogd 源码,syslogd 详解二
  8. 上升沿_为什么示波器上升时间 Tr=0.35/BW ?
  9. python开发应用程序错误怎么办_编程中遇到的Python错误和解决方法汇总整理
  10. 磁铁对于小型直流电机的影响