vhdl7我学习得第一个fpga项目——倒计时显示
之前也编写过fpga程序,但是那都相当于一个子程序,我们知道fpga是模块化设计,自顶向下的构造。那么今天学会了第一个fpga项目:倒计时显示。
1.功能:
1)开关控制计数器工作。
当开关作用,led亮并且保持,每隔一秒,计数器开始从16减到0,用数码管显示,并保持。
2.思路:
1)两个分频器,一个给1s钟的倒计时计数,一个用于驱动数码管。
2)一个计数开关,控制倒计时开始
3)数码管译码电路。
3.设计:
1)首先,从顶层把几个模块定义一下,相互之间接下线,有分频器,计数器,显示模块。
这是顶层设计,外部的clk,和key,输出的led和数码管。
内部结构就是:
通过这个电路图可以很清楚的看到倒计时计数器内部的结构。
那么在连线(编程实现)出现这样几个问题:1.有引脚定义错误,修改的时候,改了component而没有改port map。2.在port map定义时,u1:xianshi port map(…=>…,…=>…);这个结构搞错了。3.对于component可以直接用entity修改得到。直接componet 名字port(… : … ; … : …);end component;
2.当然接线可以使用手动连接。关掉刚刚设计好的top,用new project新建sch…文件,之后把分频器,计时器,显示器统统creat symbol,再点击add symbol就可以啦。之后add wire,add i/o。之后把i/o更改名字。注意端口位数不能改!
一同操作之后就是这个样子:
之后检查一下rtl电路。正确。可以开始写子模块
3.编写子模块
1)分频器:
1.1这个之前讲过。这次犯的错误是把端口放在process中直接not了,这样会报错,说要用inout。那我直接定义signal就好了。
1.2if语句一定是出现在process中的
1.3变量只可以在当前的process中使用,只有signal才可以全局。signa定义不要加in/out!。
1.4最后记得把signal赋值给相应的port
代码:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--ujs-lili
entity fenpinqi1 isPort ( clk : in STD_LOGIC;clk1hz : out STD_LOGIC;clk1khz : out STD_LOGIC);
end fenpinqi1;
architecture Behavioral of fenpinqi1 is
signal clk_1hz : STD_LOGIC;
signal clk_1khz : STD_LOGIC;
beginprocess(clk)variable q:integer range 1 to 2400000:=1;--48mhz,一个周期1/48m,1hz,一个周期1/1,那么1/1/(1/48m)/2,得到半个周期中clk1hz的次数2400000,因为程序中用not得到上升沿。variable p:integer range 1 to 24000:=1;--1khz时间快。beginif q = 2400000 thenq:=1;clk_1hz <= not clk_1hz;elseq:=q+1;end if;if q = 24000 thenp:=1;clk_1khz <= not clk_1khz;elsep:=p+1;end if; end process;clk1hz <= clk_1hz;clk1khz <= clk_1khz;
end Behavioral;
写完之后先check syntax。但是你想综合那肯定会报错!
2)设计定时器
首先明确“/=”的意思是不等于
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_arith.ALL;
use IEEE.STD_LOGIC_unsigned.ALL;
--ujs_lili
entity dingshiqi isPort ( clk1hz : in STD_LOGIC;key : in STD_LOGIC;led : out STD_LOGIC;data0 : out STD_LOGIC_VECTOR (3 downto 0);data1 : out STD_LOGIC_VECTOR (3 downto 0));
end dingshiqi;
architecture Behavioral of dingshiqi is
signal cnt0: STD_LOGIC_VECTOR (3 downto 0);
signal cnt1: STD_LOGIC_VECTOR (3 downto 0);
beginprocess(clk1hz,key)beginif key='1' thencnt1<="0001"; cnt0<="0110";--这里用的bcd码,便于显示led<='1';elseled<='0';--表示开关作用if clk1hz'event and clk1hz='1' then --1s到if cnt0/=0 then --如果个位不等于0,个位就可以自减,如果个位等于0,这时候就要看了如果十位为0,那么计数结束,如果十位不为0,那么置十位为0cnt0<=cnt0-1;elseif cnt1/=0 then--如果10位不等于0,也就是1,那么就剩下9,8,7,...cnt0<="1001";cnt1<=cnt1-1;else--如果十位为0,计数结束,因为if是顺序执行的cnt0<="0000";cnt1<="0000";led<='1';end if;end if;end if;end if;end process;data0<=cnt0;data1<=cnt1;
end Behavioral;
3)显示模块
主要是靠1khz时钟来驱动的,主要用并行。
4)仿真
仿真出现问题:
问题:1)led没有变化
2)seg没有变化
3)分频电路有问题
原因:
分频电路中出现了两个错误,首先没有判断clk的上升沿,就直接分频了,其次,signal没有初始值,这样修改之后,1khz和1hz看起来一样,肯定还有问题,继续找,发现第三个if写错了,是判断p,我写成了判断q。
故障图:
至于为什么两者之间会有间隔,那应该是fpga执行速度的问题。
更改之后会发现,clk1hz和clk1khz是有变化了,但是很明显1hz是一秒的周期,仿真图上还是不对。发现是clk_period没有修改。所有修改完毕,得到如下的仿真图:
代码如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--ujs-lili
entity ceshifenpin isPort ( clk : in STD_LOGIC;clk1hz : out STD_LOGIC;clk1khz : out STD_LOGIC);
end ceshifenpin;
architecture Behavioral of ceshifenpin is
signal clk_1hz : STD_LOGIC:='0';
signal clk_1khz : STD_LOGIC:='0';
beginprocess(clk)variable q:integer range 1 to 2400000:=1;--48mhz,一个周期1/48m,1hz,一个周期1/1,那么1/1/(1/48m)/2,得到半个周期中clk1hz的次数2400000,因为程序中用not得到上升沿。variable p:integer range 1 to 24000:=1;--1khz时间快。beginif clk'event and clk='1' thenif q = 2400000 thenq:=1;clk_1hz <= not clk_1hz;elseq:=q+1;end if;if p = 24000 then--这个地方没有改,应该时p!p:=1;clk_1khz <= not clk_1khz;elsep:=p+1;end if; end if;end process;clk1hz <= clk_1hz;clk1khz <= clk_1khz;
end Behavioral;
仿真代码:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
--ujs-lili
ENTITY ceshifenpin_tb IS
END ceshifenpin_tb;
ARCHITECTURE behavior OF ceshifenpin_tb IS -- Component Declaration for the Unit Under Test (UUT) COMPONENT ceshifenpinPORT(clk : IN std_logic;clk1hz : OUT std_logic;clk1khz : OUT std_logic);END COMPONENT;--Inputssignal clk : std_logic := '0';--Outputssignal clk1hz : std_logic;signal clk1khz : std_logic;-- Clock period definitionsconstant clk_period : time := 20.8 ns;--10ns是10的-8
BEGIN -- Instantiate the Unit Under Test (UUT)uut: ceshifenpin PORT MAP (clk => clk,clk1hz => clk1hz,clk1khz => clk1khz);-- Clock process definitionsclk_process :processbeginclk <= '0';wait for clk_period/2;clk <= '1';wait for clk_period/2;end process;
END;
那么把修改好的分频器放入top模块中可以得到如下波形:
从上面可以看出led还是存在问题的,一直是高电平,
后来发现原来是,key没有作用!
再把seg更改之后,看下仿真结果,正确!
6.总结
不知道是不是第六点。完成第一次项目是艰难的,做了得有4h,但是弄对了,还是不错的。尤其时波形仿真那块。任何时候不放弃,总会成功!
vhdl7我学习得第一个fpga项目——倒计时显示相关推荐
- Struts2 学习笔记 — 第一个struts2项目
创建struts2项目 勾选生成web.xml文件 配置项目 打开项目后,首先导入struts2所需的jar包,关于这个,我们可以在下载的struts包中struts-2.3.34/apps中找到st ...
- django language_Django基础学习-创建第一个Django项目
1. 创建项目 我们的第一个项目将会是一个完整的blog站点.Django提供了一个命令允许你方便的创建一个初始化的项目文件结构.在终端中运行以下命令: 目录结构 manage.py:一个实用的命令行 ...
- 第一个 iOS 项目开发小结 - SwiftUI 学习资料、开源项目
第一个 iOS 项目开发小结 SwiftUI 知识点小记 学习资料 开源项目 一些问题记录 项目预览 这段时间由于项目需要,我学习了一段时间 SwiftUI 并单独完成了一个系统的开发,耗时两个星期, ...
- 如何创建一个Web项目
文章目录 一.创建Web项目 1. 新建Maven工程 2. 在pom.xml中,添加servlet依赖 3. 创建web.xml文件 4. 通过tomcat配置启动项 5. 在webapp下创建ht ...
- vue.js示例_一个示例项目,展示了集成Vue.js和Lumino的一种方法
vue.js示例 Vue-lumino (vue-lumino) An example project showing one way to integrate Vue.js and Lumino ( ...
- FPGA项目实战学习分享_W2
FPGA项目实战学习分享_W2 Day1(210121Thu) 工程创建与Basys3计算器实例测试 Getting Started with the Basys 3 (Legacy) 约束文件与顶层 ...
- 【Java学习】从一个简单的HelloWorld项目中入门maven
创建一个maven项目 这里推荐官方文档:maven官方文档 [注]此篇文章也是笔者学习笔记,如有错误,请见谅. [注]我把Goal翻译成命令.比如Plugin Goal: ps:我他喵的写了一大半的 ...
- 全栈深度学习第1期:如何启动一个机器学习项目?
一 起 追 剧 鸭 ! 简介 Berkeley全栈深度学习追剧计划是由夕小瑶的卖萌屋发起的优质公开课打卡项目,通过微信群为同期追剧的小伙伴提供交流平台.关于该计划的详请见这里. 1. Berkeley ...
- GitHub 标星 1.6w+,我发现了一个宝藏项目,推荐大家学习
GitHub 标星 1.6w+,我发现了一个宝藏项目,推荐大家学习 本文链接:https://blog.csdn.net/u013486414/article/details/103274892 大家 ...
最新文章
- sudo提权实战讲解 对用户对组的权限配置分析
- Linux进程突然挂死,当主进程突然死亡时,我该如何杀死linux spawnProcess?
- golang 文件操作 创建 读写 复制移动 权限 删除
- python补全插件
- 人民日报智慧媒体研究院与第四范式合资成立智媒新创 赋能智慧媒体创新
- 【阿里妈妈数据科学系列】第二篇:在线分流框架下的AB Test
- php修改ini文件内容,php上传大文件需要修改的php.ini配置文件
- Android入门之简单拨号器
- 大数据之-Hadoop之HDFS_HDFS_Shell命令---大数据之hadoop工作笔记0052
- 海外新趋势:挑战Tiktok,跨境卖家的新红利流量渠道?
- java 笔记(3) —— 动态代理,静态代理,cglib代理
- html5制作网站谁的好处,HTML5网站对后期SEO工作有什么好处
- android adb sdk下载地址,Android SDK 下载和安装
- 服务器密码过期了咋修改,重置已过期的密码 (Sun Java System Directory Server Enterprise Edition 6.3 管理指南)...
- Centos7安装iNode客户端
- PVE安装威联通教程
- 针式打印机无电脑测试软件,针式打印机断针测试软件合集
- nopCommerce 3.9 大波浪系列 之 汉化-Roxy Fileman
- java脚手架_Java代码重构
- 十大超级老牌黑客逐个曝光
热门文章
- OSChina 周四乱弹 ——不是二奶不是寡妇,老娘的男人是程序员
- CodeGear公司正式推出delphi2007 for win32
- elasticsearch优化总结
- java.lang.RuntimeException: Although a UNIX domain socket path is configured as /opt/module/hadoop-2
- CTO 写低级 Bug,致公司 70 GB 数据泄露!
- Artetxe2018CoNLL_Uncovering divergent linguistic information in word embeddings...
- 友情链接查询工具 php源码,php 友情链接批量查询工具下载
- DM——数据处理基础之数据、数据统计特性
- 基于Antd Input组件自定义Input的成功状态
- 在后台删除新闻时,需要删除服务器上的文件夹