[转]FPGA实践——基于ROM访问的直接波形合成

本文原创,转载请注明出处:http://www.cnblogs.com/risten/p/4166169.html

1.系统原理

通过频率控制字选择相位步进,产生访问ROM的地址,进而控制DAC的输出波形与频率。整个系统由时钟生成、相位累加、ROM、DAC组成。限于basys2开发板的限制,本次将输出DAC替换为8个led灯显示。

2.系统设计

2.1 时钟生成

 1 library IEEE;
 2 use IEEE.STD_LOGIC_1164.ALL;
 3 use IEEE.STD_LOGIC_ARITH.ALL;
 4 use IEEE.STD_LOGIC_UNSIGNED.ALL;
 5
 6 entity clock_gen is
 7 port (
 8         clk        :    IN        STD_LOGIC;
 9         rst        :    IN        STD_LOGIC;
10         clka        :    OUT    STD_LOGIC
11         );
12 end clock_gen;
13
14 architecture Behavioral of clock_gen is
15 signal    cnt        :    INTEGER;
16 signal    clk_reg    :    STD_LOGIC;
17
18 begin
19 clka<=clk_reg;
20 process(clk,rst)
21 begin
22 if    (rst=‘0‘)    then
23     cnt<=0;
24     clk_reg<=‘0‘;
25 elsif    (clk‘event and clk=‘1‘) then
26     if (cnt=250000) then    --生成时钟为0.01s
27         cnt<=0;
28         clk_reg<=not clk_reg;
29     else
30         cnt<=cnt+1;
31     end if;
32 end if;
33 end process;
34 end Behavioral;

2.2相位累加(地址生成)

 1 library IEEE;
 2 use IEEE.STD_LOGIC_1164.ALL;
 3 use IEEE.STD_LOGIC_ARITH.ALL;
 4 use IEEE.STD_LOGIC_UNSIGNED.ALL;
 5
 6 entity phase_adder is
 7 port(
 8         clka        :    IN        STD_LOGIC;
 9         rst        :    IN        STD_LOGIC;
10         f_level    :    IN        STD_LOGIC_VECTOR(6 DOWNTO 0);
11         addr        :    OUT    STD_LOGIC_VECTOR(9 DOWNTO 0)
12         );
13 end phase_adder;
14
15 architecture Behavioral of phase_adder is
16 signal    cnt        :    STD_LOGIC_VECTOR(9 DOWNTO 0);
17
18 begin
19 addr<=cnt;
20 process(clka,rst,f_level)
21 begin
22 if    (rst=‘0‘)    then
23     cnt<=(others=>‘0‘);
24 elsif    (clka‘event and clka=‘1‘) then
25     cnt<=cnt+f_level;
26 end if;
27 end process;
28
29 end Behavioral;

2.3 ROM

新建源文件选择IP核

存储类型

存储大小

数据初始化

正弦余弦初始化coe文件的生成(使用matlab)

 1 clc
 2 clear all
 3 close all
 4 x = linspace(0, 2*pi ,1024);     % 在区间[0,2*pi]之间等间隔地取1024个点
 5 y_cos = cos(x);
 6 y_sin = sin(x);
 7 y_cos = y_cos * 2^15;
 8 y_sin = y_sin * 2^15;
 9 fid = fopen(‘D:/cos.coe‘,‘wt‘);
10 fprintf(fid, ‘%5.0f,\n‘ , y_cos);
11 fclose(fid);
12 fid = fopen(‘D:/sin.coe‘,‘wt‘);
13 fprintf(fid, ‘%5.0f,\n‘ , y_sin);
14 fclose(fid);

用记事本在生成文件开头添加

并把最后的结尾换为 ; 号

存储器选项都设置完毕后点击generate即可。

2.4 LED显示(DAC)

 1 library IEEE;
 2 use IEEE.STD_LOGIC_1164.ALL;
 3 use IEEE.STD_LOGIC_ARITH.ALL;
 4 use IEEE.STD_LOGIC_UNSIGNED.ALL;
 5 use IEEE.STD_LOGIC_SIGNED.ALL;
 6
 7 entity led is
 8 port (
 9         data        :    IN        STD_LOGIC_VECTOR(15 DOWNTO 0);
10         led_seg    :    OUT    STD_LOGIC_VECTOR(7 DOWNTO 0)
11         );
12 end led;
13
14 architecture Behavioral of led is
15 begin
16 process(data)
17 begin
18 if (signed(data)<-24576) then
19     led_seg<="10000000";
20 elsif (signed(data)<-16348) then
21     led_seg<="01000000";
22 elsif (signed(data)<-8192) then
23     led_seg<="00100000";
24 elsif (signed(data)<0) then
25     led_seg<="00010000";
26 elsif (signed(data)<8192) then
27     led_seg<="00001000";
28 elsif (signed(data)<16348) then
29     led_seg<="00000100";
30 elsif (signed(data)<24576) then
31     led_seg<="00000010";
32 else
33     led_seg<="00000001";
34 end if;
35 end process;
36
37 end Behavioral;

2.5 顶层设计TOP

 1 library IEEE;
 2 use IEEE.STD_LOGIC_1164.ALL;
 3
 4 entity top is
 5 port (
 6         clk        :    IN        STD_LOGIC;
 7         rst        :    IN        STD_LOGIC;
 8         f_level    :    IN        STD_LOGIC_VECTOR(6 DOWNTO 0);
 9         led_seg    :    OUT    STD_LOGIC_VECTOR(7 DOWNTO 0)
10         );
11 end top;
12
13 architecture Behavioral of top is
14 COMPONENT clock_gen
15 PORT (
16         clk        :    IN        STD_LOGIC;
17         rst        :    IN        STD_LOGIC;
18         clka       :    OUT    STD_LOGIC
19         );
20 END COMPONENT;
21 COMPONENT phase_adder
22 PORT (
23         clka       :    IN        STD_LOGIC;
24         rst        :    IN        STD_LOGIC;
25         f_level    :    IN        STD_LOGIC_VECTOR(6 DOWNTO 0);
26         addr       :    OUT    STD_LOGIC_VECTOR(9 DOWNTO 0)
27         );
28 END COMPONENT;
29 COMPONENT rom
30 PORT (
31     clka : IN STD_LOGIC;
32     addra : IN STD_LOGIC_VECTOR(9 DOWNTO 0);
33     douta : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)
34         );
35 END COMPONENT;
36 COMPONENT led
37 PORT (
38         data       :    IN        STD_LOGIC_VECTOR(15 DOWNTO 0);
39         led_seg    :    OUT    STD_LOGIC_VECTOR(7 DOWNTO 0)
40         );
41 END COMPONENT;
42
43 signal    clka        :    STD_LOGIC;
44 signal    addr        :    STD_LOGIC_VECTOR(9 DOWNTO 0);
45 signal    data        :    STD_LOGIC_VECTOR(15 DOWNTO 0);
46
47 begin
48 u1    :    clock_gen          PORT MAP (clk,rst,clka);
49 u2    :    phase_adder        PORT MAP (clka,rst,f_level,addr);
50 u3    :    rom                PORT MAP (clka,addr,data);
51 u4    :    led                PORT MAP    (data,led_seg);
52
53 end Behavioral;

3. 引脚定义

 1 NET    "clk"                LOC="B8";
 2 NET    "rst"                LOC="P11";
 3
 4 NET    "f_level<0>"    LOC="L3";
 5 NET    "f_level<1>"    LOC="K3";
 6 NET    "f_level<2>"    LOC="B4";
 7 NET    "f_level<3>"    LOC="G3";
 8 NET    "f_level<4>"    LOC="F3";
 9 NET    "f_level<5>"    LOC="E2";
10 NET    "f_level<6>"    LOC="N3";
11
12 NET    "led_seg<0>"    LOC="M5";
13 NET    "led_seg<1>"    LOC="M11";
14 NET    "led_seg<2>"    LOC="P7";
15 NET    "led_seg<3>"    LOC="P6";
16 NET    "led_seg<4>"    LOC="N5";
17 NET    "led_seg<5>"    LOC="N4";
18 NET    "led_seg<6>"    LOC="P4";
19 NET    "led_seg<7>"    LOC="G1";

时间: 2024-10-26 01:08:20

[转]FPGA实践——基于ROM访问的直接波形合成的相关文章

FPGA实践——基于ROM访问的直接波形合成

本文原创,转载请注明出处. 1.系统原理 通过频率控制字选择相位步进,产生访问ROM的地址,进而控制DAC的输出波形与频率.整个系统由时钟生成.相位累加.ROM.DAC组成.限于basys2开发板的限制,本次将输出DAC替换为8个led灯显示. 2.系统设计 2.1 时钟生成 1 library IEEE; 2 use IEEE.STD_LOGIC_1164.ALL; 3 use IEEE.STD_LOGIC_ARITH.ALL; 4 use IEEE.STD_LOGIC_UNSIGNED.AL

源码编译安装LAMP环境及配置基于域名访问的多虚拟主机

实验环境及软件版本: CentOS版本: 6.6(2.6.32.-504.el6.x86_64) apache版本: apache2.2.27 mysql版本:  Mysql-5.6.23 php版本:    php-5.3.27 一.关闭防火墙:service iptables stop chkconfig iptables off 二.关闭selinux: sed -i 's/SELINUX=disabled/SELINUX=enforcing/g' /etc/selinux/config

Nginx虚拟主机配置实践之nginx访问同一个地址方法(二)

Nginx虚拟主机配置实践之nginx访问同一个地址方法(二) 一.虚拟主机别名介绍 虚拟主机别名就是为虚拟主机设置除了主域名以外的另一个或多个域名名字,这样就能实现用户访问的多个域名对应于同一个虚拟主机网站的功能.在生产环境中,以www.afeilinux.com域名的虚拟主机为例,为其增加一个别名afeilinux.com时,在该域名出现的网站内容和访问www.afeilinux.com得到的结果是一样的. 二.实施方法 第一种方法:Nginx虚拟主机的别名配置 更改wtf.conf配置文件

Spring+MyBatis实践—MyBatis数据库访问

关于spring整合mybatis的工程配置,已经在Spring+MyBatis实践—工程配置中全部详细列出.在此,记录一下几种通过MyBatis访问数据库的方式. 通过sqlSessionTemplate来进行数据库访问. 通过Dao接口来进行数据库访问. 使用@Select注解形式访问数据库 1.在spring框架中使用mybatis来进行数据操作配置,参考Spring+MyBatis实践—工程配置的spring-datasources.xml文件. 2.Demo1—通过sqlSession

memcached基于socket访问memcache缓存服务器

memcached基于socket访问memcache缓存服务器 操作memcache常用三种方法: 1.memcache基于php_memcache.dll扩展(php扩展) 2.memcached基于php_memcached.dll扩展(php扩展) 3.memcached基于socket访问(基于网络) memcached-client.php 调用很简单,调用方法如下: <?php header("content-type:text/html; charset=utf-8&quo

【阿里云产品公测】OTS使用之简单线上产品实践基于PythonSDK

阿里云用户:morenocjm 实践是检验真理的唯一标准,学习技术需要通过实践过程中的不断尝试,才能够快速掌握要领.OTS是构建在阿里云飞天分布式系统之上的NoSQL数据库服务,提供海量结构化数据的存储和实时访问.刚好想用手上的一台ECS做点什么,既然如此,那就通过搭建简单线上产品(alijot.com 快速记)的过程,学习下NoSQL数据库OTS吧. ------------------------------------------------------------------------

Laravel + go-micro + grpc 实践基于 Zipkin 的分布式链路追踪系统 摘自https://mp.weixin.qq.com/s/JkLMNabnYbod-b4syMB3Hw?

分布式调用链跟踪系统,属于监控系统的一类.系统架构逐步演进时,后期形态往往是一个平台由很多不同的服务.组件构成,用户请求过来后,可能会经过其中多个服务,如图 不过,出问题时往往很难排查,如整个请求变慢.偶尔报错.不可用等,我们很难得知具体是由哪一个或哪些服务引起的,通常开发同学都会互相甩锅,最后不得不花大量时间人肉 tracing 项目初期时,可以简单处理,通过生成唯一 request_id ,在各个方法记录日志,方便排查问题.中后期系统拆分为各个子服务时,要么继续推进原有的 request_i

MySQL在本机无法基于localhost访问的问题解决

引言: 在本地访问数据库之时,一般使用localhost, 127.0.0.1来进行数据库访问,但是笔者这几天就碰到了只能通过127.0.0.1来访问,但是无法基于localhost来访问,非常之诡异-.. 环境介绍 Centos 7, mariadb 10.2 tomcat 8 , JavaWar应用 问题表现 在数据库连接中使用了localhost:3306之类的连接信息,但是在启动服务过程中,一直在报连接数据库的错误信息: Java.sql.SQLException: Access den

基于wsdl2java访问外来service服务

一.wsdl2java介绍 Wsdl2java是cxf提供的一个用于生成客户端代码的工具,它的功能跟wsimport差不多.但是wsdl2java工具只能生成访问基于cxf发布的服务的代码.Wsdl2java位于cxf_home/bin目录下,因此使用这个工具时需要添加目录到path中.Wsdl2java工具的参数与wsimport有所不同,主要有: -d 参数,指定生成代码的目录 -p 参数,指定生成的新的包结构 (Wsdlurl) –http://server.port/service?ws