记录FPGA(Xilinx-Ego1)学习调试时遇到的坑和Bug解决方法,以及Vivado开发FPGA的代码编写技巧,为之后复习留个底子。通篇文章均用单片机的开发思路去开发FPGA,只为帮助读者能快速上手,开发语言为最常用的Verilog。

关于如何使用Vivado创建一个工程见Ego1使用说明文档,很详细,详细见 依元素 官网:EGO1 (e-elements.com)

点击资源,然后注册邮箱,下载资料包,里面有很多例程:

源码或者现成的工程见 3c-EGo1配置实验vivado2017.2_v1.2 文件夹里的source与project文件夹

学习了基础操作后,教你怎么写代码,先对整个代码有个宏观认识:

这是一个工程的文件夹,里面只有lab5_uart.srcs文件夹里的代码是自己写或者创建的,其余是你在仿真综合时,vivado自动生成的;代码分两大部分:约束文件(.xdc)和源文件(.v)

讲解一下我对Vivado编写FPGA工程的认识:

源文件(.v)文件编写逻辑为分层(top层和模块层)编写,将你需要用到的硬件的驱动代码设计成一个模块,模块即有输入和输出,比方说我要让一个数码管按一定的频率亮,那就需要定时器,就设计一个时钟作为输入,当然,你想复位的话,还可以设计一个按键(rst)作为输入,然后输出呢就是数码管的8个段(8段LED),设计好输入输出后就是你的逻辑编写,即你什么时候让数码管亮,比如我1s让数码管亮一次,1s后再灭一次,就写相应的逻辑,当然写逻辑就要用到相关的语法,语法就去菜鸟教程看verilog语言教程就行;然后是需要即需要定义一个top层,将你所有模块的输入和输出在这个模块进行例化(相当于单片机的引脚初始化)。top层是在你设计的功能模块在2个及以上时编写,这样你看起来也比较方便,系统所有的输入输出都在top层,也方便你查看。

约束文件的作用相当于在使用单片机时对引脚进行定义,这里是将你源文件的top文件里设计的输入和输出约束到相关的引脚上,虽然像时钟,数码管这样的输入输出你看不见引脚,但你可以这样去理解,就是使用FPGA驱动硬件的逻辑就是:你设计输入和输出,然后将他们约束到相关硬件上或者引脚上,然后引脚再去接硬件。

那么我这个工程呢就是关于Ego1的循迹小车,所有硬件驱动代码都由ego1写成他具备以下功能:

基础功能:能用Ego1输出PWM波控制直流编码器电机和舵机转动,能用Ego1读取红外循迹模块的循迹反馈信号,能用Ego1的输入捕获采集编码器的信号实现电机转速测量,能用Ego1输出特定频率的方波驱动无缘蜂鸣器播放音乐,能用Ego1的数码管显示车速。

终极功能:小车上电后能在赛道上一边播放车载音乐一边进行自动循迹。

系统硬件配置设计

(根据实验的需要,论述平台的系统硬件配置,包括硬件选择、硬件配套、网络连接和参数配置等)

(1)控制器:Xilinx-Ego1(FPGA)

(2)执行元件:舵机

(3)执行元件:编码器电机

(4)执行元件:无源蜂鸣器

(5)测量元件:循迹模块(5路红外传感器)

(6)电机驱动:tb6612fng

(7)功率放大单元:L298N

(8)稳压模块:

其中舵机和电机模块的代码展示如下:(因为都是PWM,所以写在一起了)

时钟主频:clk约束到了P17,具体是50MHz还是100MHz我忘了

`timescale 1ns / 1psmodule  pwm_cont(clk,sw7,rst_n,da_in,pwm_out,pwm_outz,hw_in,djfz1,djfz2,djfy1,djfy2,pwm_outy
);input                 clk;
input                   rst_n;
input                   sw7;
input   [6:0]       da_in;output    reg     djfz1;
output  reg     djfz2;
output  reg     djfy1;
output  reg     djfy2;output    reg     pwm_out;
output  reg     pwm_outz;
output  reg     pwm_outy;
input   [4:0]       hw_in;
parameter          s=1000_000,//20ms-----min:s4(左偏)   max:s7(右偏)   中间:s1s7=190_000,//4ms----右满//s6=190_000,//3.5ms----270s5=185_000,//3ms----225s0=175_000,//2.5ms----右s1=150_000,//2ms---中间s2=125_000,//1.5ms----90s3=95_000,//1ms-----45 100_000s4=80_000;//0.5ms---0 左满reg   [31:0]   cnt_r;
reg [31:0]  cnt;                reg [31:0]   cnt_r1;
reg [31:0]  cnt1;
reg biaoqian;
reg wr_reg,wr_up,wr_down;always@(posedge clk or posedge rst_n)    beginif(rst_n)beginwr_reg        <=      1'b0;wr_up     <=      1'b0;wr_down       <=      1'b0;      cnt_r1 <= s1;endelsebeginwr_reg     <=      sw7;wr_up       <=      sw7&(~wr_reg);//sw1上升沿检测,选择循迹模式wr_down      <=      ~sw7&wr_reg;if(wr_up)biaoqian=1;if(wr_down)biaoqian=0;if(biaoqian==1)begindjfz1=0;djfz2=1;djfy1=0;djfy2=1;case(hw_in)5'b00000: begin//cnt_r1 <= s1;//中间biaoqian<=0;end//5'b11111: cnt_r1 <= s1;//中间5'b11000: cnt_r1 <= s7;//右转s7满5'b11110: cnt_r1 <= s7;//右转s7满5'b11100: cnt_r1 <= s5;//左转5'b11101: cnt_r1 <= s0;//左转5'b11001: cnt_r1 <= s1;//中间5'b11011: cnt_r1 <= s1;//中间5'b10011: cnt_r1 <= s1;//中间5'b10111: cnt_r1 <= s2;//右转             5'b00111: cnt_r1 <= s3;//右转5'b01111: cnt_r1 <= s4;//左转s4满5'b00011: cnt_r1 <= s4;//右转endcaseendif(!biaoqian)begindjfz1=0;djfz2=0;djfy1=0;djfy2=0;endend
end//速度选择
always@(posedge clk or posedge rst_n)beginif(rst_n)begincnt_r <= 31'd0;endelsebegin
//          case(da_in)//速度选择
//              7'b0000001: cnt_r <= s/20;//90
//              //8'b00000011: cnt_r <= s4;//0
//              7'b0000010: cnt_r <= s/15;//45
//              7'b0000100: cnt_r <= s/10;//90
//              7'b0001000: cnt_r <= s/8;//135
//              7'b0010000: cnt_r <= s/4;//180
//              7'b0100000: cnt_r <= s/2;//225
//              7'b1000000: cnt_r <= s;//满速case(hw_in)5'b11000: cnt_r <= s/8;//右转s7满5'b11110: cnt_r <= s/7;//右转s7满5'b11100: cnt_r <= s/7;//左转5'b11101: cnt_r <= s/7;//左转5'b11001: cnt_r <= s/5;//中间5'b11011: cnt_r <= s/5;//中间5'b11111: cnt_r <= s/5;//中间5'b10011: cnt_r <= s/5;//中间5'b10111: cnt_r <= s/7;//右转               5'b00111: cnt_r <= s/7;//右转5'b01111: cnt_r <= s/7;//左转s4满5'b00011: cnt_r <= s/7;//右转5'b00000: cnt_r <= 0;//停止default: cnt_r <= s/8;//停止endcaseend
endalways@(posedge clk or negedge rst_n)beginif(rst_n)begincnt <= 31'd0;cnt1 <= 31'd0;endelse if(cnt >= s)begincnt <= 31'd0;cnt1 <= 31'd0;endelsebegincnt <= cnt + 1'b1;cnt1 <= cnt1 + 1'b1;end
endalways@(posedge clk or negedge rst_n)beginif(rst_n)beginpwm_outz <= 1'b0;pwm_outy <= 1'b0;endelse if(cnt <= cnt_r)begin   pwm_outz <= 1'b1;pwm_outy <= 1'b1;if(wr_down)beginpwm_outz <= 1'b0;pwm_outy <= 1'b0;endendelsebeginpwm_outz <= 1'b0;pwm_outy <= 1'b0;end
endalways@(posedge clk or negedge rst_n)beginif(rst_n)begin//pwm_out<= s1;//中间pwm_out <= 1'b0;endelse if(cnt1 <= cnt_r1)beginpwm_out <= 1'b1;endelsebeginpwm_out <= 1'b0;end
end
endmodule

代码写好了之后需要生成bit流,当然这还不够,我们需要让小车不连接电脑去跑这就需要将代码固化到Ego1里面,下面是代码固化的方法:(13条消息) vivado纯verilog代码固化程序_Kiss丶小坏-CSDN博客

简单步骤:当然你直接生成bit流之后

选择Tools——>Generate Memory Configuration File,也可以打开hardware之后右键找到。

注:这一步是产生mcs文件进行程序加载,同时也会产生prm文件(也可以不需要,例如直接在生成bit文件时,勾选bin文件,最后一步时直接加载bin文件)。详情看文档去。

配置:

 如果报错就将Interface改成报错要求的值

之后是Add Configuration Memory Device。三种方法:

方法1.

方法2.

方法3.

接下来,出现如下界面,选择flash芯片。

如果报错就选择n25q64-3.3v-spi-xi_x2_x4

最后一步,在选择芯片之后会出现如下界面,也就是加载Flash,固化程序。

整个工程见如下链接:

Xilinx-Ego1(FPGA)寻迹小车-硬件开发文档类资源-CSDN文库

基于FPGA的循迹小车,控制器:Xilinx-Ego1相关推荐

  1. 【FPGA-Spirit_V2】基于FPGA的循迹小车-小精灵V2开发板

  2. 基于CW32遥控循迹小车

    题目要求 1.完成小车组装: 2.小车具有循迹功能: 3.小车具有遥控功能: 4.可显示电池电压及左右轮分别的转速. 题目分析 由题可知小车大致可分为主控.显示.蓝牙.循迹四个部分 主控我选用的是CW ...

  3. 基于arduino的循迹小车(含有PID算法)

           循迹小车一般分为两方面:一方面是简单的闭环赛道只有直道和弯道,另一方面是毕设类型的包括一些元素:90度弯道.十字道路.S形弯道等. 1.CSDN下载: 含有PID:https://dow ...

  4. 基于Arduino3路循迹小车

    本人西伯利亚蟑螂,最近抽空回顾了一下arduino,顺手做了个arduino循迹小车 (条件所限我的小车为两驱三路循迹模块小车) 话不多说,先上干货. #define STOP      0 #def ...

  5. 单片机寻迹小车ppt_基于单片机循迹小车的设计.doc

    目录 [摘   要]  2 第一章  绪论  3 1.1智能小车的来源  3 1.2研究智能小车的目的和意义  4 1.3智能小车的现状及未来  4 第二章  方案的设计与论证  4 2.1主控系统  ...

  6. 基于STM32开发板的循迹小车设计

    STM32的简单应用之循迹小车 前言 智能寻迹基于自动引导机器人系统,可以实现小车自动识别路线.智能寻迹小车运用传感器.单片机.电机驱动及自动控制等技术实现,管理时自动寻迹导航.该技术已经应用于无人驾 ...

  7. 基于arduino的5路循迹小车(1)

    基于arduino的5路循迹小车(1) 初步小车运动 1.硬件选用 1.开发板使用arduino 2560 2.电机驱动板使用 大功率电机驱动板(PWM由两个端子控制) 3.电源12V锂电池 4.降压 ...

  8. 基于STC89C52RC单片机制作的红外循迹小车(4个传感器)

    单片机:基于STC89C52RC单片机制作的红外循迹小车(4个传感器) 个人感觉红外循迹小车和那些遥控小车的区别就是信号发射不同:遥控小车是通过遥控器发出信号执行相应的动作,而红外循迹是通过红外传感器 ...

  9. 基于STM32,TB6612,TCRT5000的简易红外循迹小车

            提醒:本文章只叙述此小车相关大概内容(如模块的设置,C语言基础实现等),单片机详细教学不涉及. 摘要 循迹小车是学习单片机的"地基",它能够让初学者认识单片机内部硬 ...

  10. 基于arduino的5路循迹小车(2)

    基于arduino的5路循迹小车(2) 小车5路红外循线 接第一篇链接 https://blog.csdn.net/weixin_45984029/article/details/103437347 ...

最新文章

  1. 除了不要 SELECT * ,数据库还有哪些技巧
  2. 谈谈架构的本质和架构分类
  3. 精诚合作 共创未来——阿里云数据智能合作策略介绍
  4. ORL 人脸库 BP神经网络人脸识别
  5. JAVA项目中遇到URLEncoder URLDecoder编码解码问题
  6. protel99se基本教程及使用教程
  7. 中控指纹考勤机软件登录用户名和密码忘记的解决办法
  8. 计算机开机界面图片怎么修改,电脑win7系统怎么修改开机画面的方法
  9. 打印机质量测试软件,打印机断针测试软件
  10. J2Cache缓存的使用
  11. CentOS 7 - Securing OpenSSH(一)
  12. 微信小程序考勤签到管理系统+后台管理系统
  13. 新浪微博登陆页面html代码,仿新浪微博登陆邮箱提示效果...-页面右下角弹出提示框示例代...-js获取IP和PcName(IE)在vs中可用_169IT.COM...
  14. 渔乡朱朱的三农短视频账号运作和变现方法
  15. mkfs.ext3 --Discarding device blocks: 4096/196608
  16. Python下的自然语言处理利器-LTP语言技术平台 pyltp 学习手札
  17. 【话题】致敬伟大的科学家史蒂芬·霍金,他留下的预言能实现吗?
  18. $size 和$bits 的区别
  19. bat 批处理 批量调整 srt 字幕文件时间
  20. 手下两个应届生:一个踏实喜欢加班,一个技术强挑活,怎么选?

热门文章

  1. 来看一看 Google 给你的标签是什么
  2. 云计算是什么?云计算开发学习路线
  3. javascript中this和super用法
  4. html看汉字选拼音小游戏
  5. 常用分辨率、帧率、码率
  6. 数学与计算机专业的论文,数学与计算机论文
  7. 如何免费使用内网穿透
  8. LeetCode刷题-中心对称数
  9. 《nik collection》怎么用
  10. 微信小程序添加体验成员,根据微信号搜索不到