Xilinx FPGA:vivado串口输入输出控制fifo中的数据

一、实验要求

实现同步FIFO回环测试,通过串口产生数据,写入到FIFO内部,当检测到按键信号到来,将FIFO里面的数据依次读出。

二、信号流向图

三、状态转换图

四、程序设计

(1)按键消抖模块

`timescale 1ns / 1ps
module key_debounce(input                  sys_clk    ,input                  rst_n      ,input                  key        ,output                 key_flag   );
//    parameter         delay = 10_000_00 ;parameter         delay = 10_0;//00_00 ; //测试用reg[19:0]         cnt      ;always@(posedge sys_clk )if(!rst_n)cnt <= 0 ;else if ( key == 0 )beginif ( cnt == delay -1 )cnt <= cnt ;elsecnt <= cnt +1 ;endelsecnt <= 0 ;assign key_flag = ( cnt == delay - 2 )?1:0 ;endmodule

(2)接收端模块

`timescale 1ns / 1ps
module rx_uart(input                    sys_clk   ,input                    rst_n     ,input                    rx_data   ,//[0]起始位 [12345678]数据位 [9]校验位 [10]停止位output     reg[7:0]     uart_data ,output     reg           rx_done  );parameter              SYSCLK = 50_000_000 ;parameter              Baud   = 115200     ; parameter              COUNT  = SYSCLK/Baud; parameter              MID    = COUNT/2    ; //start_flagwire            start_flag     ;reg              rx_reg1        ;reg              rx_reg2        ;always@(posedge sys_clk )if(!rst_n)beginrx_reg1 <= 1 ;rx_reg2 <= 1 ;endelsebeginrx_reg1 <= rx_data ;rx_reg2 <= rx_reg1 ;endassign  start_flag = ~rx_reg1 & rx_reg2  ;///rx_flagreg               rx_flag   ;reg[4:0]          cnt_bit   ;reg[9:0]          cnt       ;always@(posedge sys_clk )if(!rst_n)rx_flag <= 0 ;else if ( start_flag == 1 )rx_flag <= 1 ;else if ( cnt_bit == 10 && cnt == COUNT -1 )rx_flag <= 0 ;elserx_flag <= rx_flag  ;///cnt434always@(posedge sys_clk )if(!rst_n)cnt <= 0 ;else if ( rx_flag == 1 )beginif ( cnt == COUNT -1 )cnt <= 0 ;elsecnt <= cnt +1 ;endelsecnt <= 0 ;//cnt_bitalways@(posedge sys_clk )if(!rst_n)cnt_bit <= 0 ;else if ( rx_flag == 1 )beginif ( cnt == COUNT - 1 )beginif ( cnt_bit == 10 )cnt_bit <= 0 ;elsecnt_bit <= cnt_bit +1 ;endelsecnt_bit <= cnt_bit ;                   endelsecnt_bit <= 0 ;//data_regreg[8:0]             data_reg  ; always@(posedge sys_clk )if(!rst_n)         ///cnt_bit : [0] 12345678 [9] [10]data_reg <= 0 ;///data_reg : 01234567 [8]else if ( rx_flag == 1 )beginif ( cnt_bit > 0 && cnt_bit < 10 && cnt == MID - 1 )data_reg[ cnt_bit - 1 ] <= rx_data ;elsedata_reg <= data_reg  ;endelsedata_reg <= 0 ;///checkreg                 check  ;parameter          MODE_CHECK = 0 ;     always@(posedge sys_clk )if(!rst_n)check <= 0 ;else if ( rx_flag == 1 )beginif ( cnt_bit == 10 )check <= ^data_reg ;elsecheck <= check ;endelsecheck <= 0 ;//uart_dataalways@(posedge sys_clk )if(!rst_n)uart_data <= 0 ;else if ( rx_flag == 1 )beginif ( cnt_bit == 10 && cnt == MID - 1 && check == MODE_CHECK )uart_data <= data_reg[7:0] ;elseuart_data <= uart_data ;endelseuart_data <= uart_data  ;///rx_donealways@(posedge sys_clk )if(!rst_n)rx_done <= 0 ;else if ( rx_flag == 1 )beginif ( cnt_bit == 10 && cnt == COUNT -1 )rx_done <= 1 ;elserx_done <= 0 ;endelserx_done <= 0 ;endmodule

(3)发送端模块

`timescale 1ns / 1ps
module tx_uart(input                 sys_clk    ,input                 rst_n      ,input     [7:0]       fifo_out  ,input                 tx_start    ,output   reg          tx_data    ,output   reg          tx_done );parameter                 SYSCLK = 50_000_000 ; parameter                 Baud   = 115200     ;    parameter                 COUNT  = SYSCLK/Baud;   parameter                 MID    = COUNT/2    ;//start_flagreg              tx_reg1 ;reg              tx_reg2 ;wire            start_flag ;always@(posedge sys_clk )if(!rst_n)begintx_reg1 <= 0 ;tx_reg2 <= 0 ;endelsebegintx_reg1 <= tx_start  ;tx_reg2 <= tx_reg1  ;endassign  start_flag = tx_reg1 & ~tx_reg2 ;//tx_flagreg               tx_flag  ;reg[4:0]          cnt_bit  ;reg[9:0]          cnt      ;always@(posedge sys_clk )if(!rst_n)tx_flag <= 0 ;else if ( start_flag == 1 )tx_flag <= 1 ;else if ( cnt_bit == 10 && cnt == COUNT -1 )tx_flag <= 0 ;elsetx_flag <= tx_flag ;///cntalways@(posedge sys_clk )if(!rst_n)cnt <= 0 ;else if ( tx_flag == 1 )beginif ( cnt == COUNT -1 )cnt <= 0 ;elsecnt <= cnt +1 ;endelsecnt <= 0 ;///cnt_bit always@(posedge sys_clk )if(!rst_n)cnt_bit <= 0 ;else if ( tx_flag == 1 )beginif ( cnt == COUNT -1 )beginif ( cnt_bit == 10 )cnt_bit <= 0 ;elsecnt_bit <= cnt_bit +1 ;endelsecnt_bit <= cnt_bit ;endelsecnt_bit <= 0 ;//tx_dataparameter               MODE_CHECK = 0 ;always@(posedge sys_clk )if(!rst_n)        //cnt_bit:[0] 12345678 [9] [10]tx_data <= 0 ; //uart_data: 01234567else if ( tx_flag == 1 )beginif ( cnt_bit > 0 && cnt_bit < 9 && cnt == MID -1 )tx_data <= fifo_out[ cnt_bit -1 ] ;else if ( cnt_bit == 0 )tx_data <= 0 ;else if ( cnt_bit == 10)tx_data <= 1 ;else if ( cnt_bit == 9 )tx_data <= ( MODE_CHECK == 0 )?^fifo_out:~^fifo_out ;elsetx_data <= tx_data ;    endelsetx_data <= 1 ;///tx_donealways@(posedge sys_clk )if(!rst_n)tx_done <= 0 ;else if ( tx_flag == 1 )beginif ( cnt_bit == 10 && cnt == COUNT -1 )tx_done <= 1 ;elsetx_done <= 0 ;endelsetx_done <= 0 ;endmodule

(4)fifo控制模块

`timescale 1ns / 1ps
module common_fifo_ctrl(input                   sys_clk    ,input                   rst_n      ,input     [7:0]         uart_data  ,input                   rx_done    ,input                   tx_done    ,input                   key_flag   ,output     reg          tx_start   ,output     reg[7:0]     fifo_out   );reg  [7 : 0] din  ;       reg  wr_en        ;     reg  rd_en        ;     wire [7 : 0] dout      ; wire full              ;wire wr_ack            ;wire empty             ;wire valid             ;wire [3 : 0] data_count;localparam                  IDLE   = 3'd0 ;localparam                  WRITE  = 3'd1 ;localparam                  WAIT   = 3'd2 ;localparam                  TEXT   = 3'd3 ;reg[2:0]                    cur_state   ;reg[2:0]                    next_state  ;//state1always@(posedge sys_clk )if(!rst_n)cur_state <= IDLE ;elsecur_state <= next_state ;//state2always@(*)case(cur_state)IDLE  :beginnext_state = WRITE ;endWRITE :beginif( full == 1 )next_state = WAIT ;elsenext_state = cur_state ;endWAIT  :beginif ( key_flag == 1 )next_state = TEXT ;elsenext_state = cur_state ;endTEXT  :beginif( empty == 1 )next_state = IDLE ;elsenext_state = cur_state ;enddefault:;endcase///state3always@(posedge sys_clk )if(!rst_n)begindin   <= 0 ;wr_en <= 0 ;       rd_en <= 0 ; fifo_out <= 0 ;tx_start <= 0 ;      endelsecase(cur_state)IDLE  :begindin   <= 0 ;     wr_en <= 0 ;     rd_en <= 0 ;     fifo_out <= 0 ;  tx_start <= 0 ;  endWRITE :beginif ( rx_done )beginwr_en <= 1 ;     din <= uart_data ;endelsewr_en <= 0 ;endWAIT  :begintx_start <= 0 ;if (key_flag == 1 ) //只有一个时钟周期能读完吗?rd_en <= 1 ;    //答:此时uart_data是并行数据,传输仅需1个时钟周期elserd_en <= 0 ;endTEXT  :  beginif(valid)tx_start <= 1 ;elsetx_start <= 0 ;if(tx_done)rd_en <= 1 ;elserd_en <= 0 ;if(valid)fifo_out <= dout ;elsefifo_out <= fifo_out ;enddefault:;endcase//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
fifo_generator_0 fifo1 (.clk(sys_clk ),                // input wire clk.srst(~rst_n),              // input wire srst.din(din),                // input wire [7 : 0] din.wr_en(wr_en),            // input wire wr_en.rd_en(rd_en),            // input wire rd_en.dout(dout),              // output wire [7 : 0] dout.full(full),              // output wire full.wr_ack(wr_ack),          // output wire wr_ack.empty(empty),            // output wire empty.valid(valid),            // output wire valid.data_count(data_count)  // output wire [3 : 0] data_count
);
// INST_TAG_END ------ End INSTANTIATION Template ---------endmodule

(5)顶层

`timescale 1ns / 1ps
module TOP(input                    sys_clk    ,input                    rst_n      ,input                    key        ,input                    rx_data    ,output                   tx_data  );///key_debouncewire              key_flag  ;key_debounce key_debounce_u1(.    sys_clk  (sys_clk )  ,.    rst_n    (rst_n   )  ,.    key      (key     )  ,.    key_flag (key_flag)  );///uart_rxwire       [7:0]       uart_data  ;wire                   rx_done    ;rx_uart rx_uart_u1(.    sys_clk  ( sys_clk )  ,.    rst_n    ( rst_n   )  ,.    rx_data  ( rx_data )  ,//[0]起始位 [12345678]数据位 [9]校验位 [10]停止位.   uart_data (uart_data)  ,.    rx_done  ( rx_done ) );///uart_tx
wire               tx_done   ;
wire    [7:0]       fifo_out  ;
wire               tx_start  ; 
tx_uart tx_uart_u1(.   sys_clk    (sys_clk  ) ,.   rst_n      (rst_n    ) ,.   fifo_out   (fifo_out ) ,.   tx_start   (tx_start  ) ,.   tx_data    (tx_data  ) ,.   tx_done    (tx_done  ));///fifocommon_fifo_ctrl common_fifo_ctrl_u1(.     sys_clk    (sys_clk  )     ,.     rst_n      (rst_n    )     ,.     uart_data  (uart_data)     ,.     rx_done    (rx_done  )     ,.     tx_done    (tx_done  )     ,.     key_flag   (key_flag )     ,.     tx_start   (tx_start )     ,.     fifo_out   (fifo_out )     );endmodule

五、仿真结果

程序:

`timescale 1ns / 1ps
module test_TOP(  );reg                sys_clk    ;reg                rst_n      ;reg                key        ;reg                rx_data    ;wire               tx_data    ;parameter               SYSCLK = 50_000_000 ;parameter               Baud   = 115200     ;parameter               COUNT  = SYSCLK/Baud;parameter               MID    = COUNT/2    ;initialbeginsys_clk = 0 ;rst_n   = 0 ;key     = 1 ;#10rst_n   = 1 ;#200000key     = 0 ;endalways  #1  sys_clk = ~sys_clk ;initialbeginuart_out ( 8'hCC );uart_out ( 8'hE8 );uart_out ( 8'h18 );uart_out ( 8'h78 );uart_out ( 8'h66 );uart_out ( 8'h1E );uart_out ( 8'hCC );uart_out ( 8'h9F );uart_out ( 8'h66 );uart_out ( 8'h9F );uart_out ( 8'h33 );uart_out ( 8'h1E );uart_out ( 8'hCC );uart_out ( 8'h9F );uart_out ( 8'h18 );uart_out ( 8'h33 );uart_out ( 8'hCC );end//任务函数task            uart_out  ;input    [8:0]    DATA   ;beginrx_data = 1 ; ///空闲位初始#20rx_data = 0 ;#(COUNT*2)    rx_data = DATA[0]  ;#(COUNT*2)    rx_data = DATA[1]  ;#(COUNT*2)    rx_data = DATA[2]  ;#(COUNT*2)    rx_data = DATA[3]  ;#(COUNT*2)    rx_data = DATA[4]  ;#(COUNT*2)    rx_data = DATA[5]  ;#(COUNT*2)    rx_data = DATA[6]  ;#(COUNT*2)    rx_data = DATA[7]  ;#(COUNT*2)    rx_data = 0        ;#(COUNT*2)    rx_data = 1        ;#(COUNT*2)                       ;endendtaskTOP TOP_1(.     sys_clk (sys_clk)   ,.     rst_n   (rst_n  )   ,.     key     (key    )   ,.     rx_data (rx_data)   ,.     tx_data (tx_data) );endmodule

实验结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读书笔记-《魔鬼经济学》

这是一本非常有意思的经济学启蒙书&#xff0c;作者探讨了许多问题&#xff0c;并通过数据找到答案。 我们先来看看作者眼中的“魔鬼经济学”是什么&#xff0c;再选一个贴近我们生活的例子进行阐述。 01 魔鬼经济学 中心思想&#xff1a;假如道德代表人类对世界运转方式的期…

uniapp实现一个键盘功能

前言 因为公司需要&#xff0c;所以我.... 演示 代码 键盘组件代码 <template><view class"keyboard_container"><view class"li" v-for"(item, index) in arr" :key"index" click"changArr(item)" :sty…

初学Spring之 AOP 面向切面编程

AOP&#xff08;Aspect Oriented Programming&#xff09;面向切面编程 通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术 是面向对象&#xff08;OOP&#xff09;的延续 AOP 在 Spring 中的作用&#xff1a; 1.提供声明式事务 2.允许用户自定义切面 导…

Objects365数据集介绍

Objects365数据集介绍 什么是Objects365数据集&#xff1f;数据集的规模与内容数据集的特点数据集下载 什么是Objects365数据集&#xff1f; Objects365是一个大规模、高质量的物体检测数据集。该数据集旨在推动物体检测技术的发展&#xff0c;特别是在真实世界场景下的应用。O…

【python】python当当数据分析可视化聚类支持向量机预测(源码+数据集+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

基于java+springboot+vue实现的校园外卖服务系统(文末源码+Lw)292

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;外卖信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

使用Charles mock服务端响应数据

背景 服务端未提供接口/服务端接口返回结果有逻辑限制&#xff08;次数限制&#xff09;&#xff0c;不能通过原始接口返回多次模拟预期的返回结果&#xff0c;例如边界值情况 客户端受到接口响应数据的限制&#xff0c;无法继续开发或测试&#xff0c;会极大影响开发测试效率…

QT滑块图片验证程序

使用QT实现滑块验证程序&#xff0c;原理是画个图片&#xff0c;然后在图片上画个空白区域&#xff0c;再画个滑块图片。 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widg…

文心智能体平台快速创建一个HY(Lisp)编程小助手

现在可以在文心智能体平台&#xff0c;使用文心一言创建各种智能体了&#xff01;创建步骤如下&#xff1a; 创建知识库 可以使用本地上传的方式来提交&#xff0c;鼠标移动到”查看模板“&#xff0c;可以下载”知识库外链上传示例模版.xlsx“&#xff0c;按照模板里的格式&…

8.14 矢量图层面要素2.5D渲染

文章目录 前言2.5D渲染QGis设置面符号为2.5D二次开发代码实现2.5D 总结 前言 本章介绍矢量图层面要素2.5D渲染的使用说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 2.5D渲染 2.5D渲染可以将多边形渲染为类3D效果。 QGis设置面符号为2.5D 以"hou…

生成式AI的短板在于“Token”的存在

生成式AI模型处理文本的方式与人类不同。理解它们基于“token”的内部环境&#xff0c;可能有助于解释一些奇怪行为和固有局限性。 从小型设备上的Gemma到OpenAI领先行业的GPT-4o&#xff0c;大多数模型都是基于一种称为Transformer的架构。由于Transformer在将文本与其他类型…

[Multi-Modal] MDETR 论文及代码学习笔记

代码地址&#xff1a;https://github.com/ashkamath/mdetr 论文地址&#xff1a;https://arxiv.org/abs/2104.12763 多模态推理系统依靠预先训练的目标检测器从图像中提取感兴趣区域&#xff08;边界框包围区域&#xff09;。然而&#xff0c;这个关键模块通常被用作黑匣子&…

飞书 API 2-4:如何使用 API 将数据写入数据表

一、引入 上一篇创建好数据表之后&#xff0c;接下来就是写入数据和对数据的处理。 本文主要探讨数据的插入、更新和删除操作。所有的操作都是基于上一篇&#xff08;飞书 API 2-4&#xff09;创建的数据表进行操作。上面最终的数据表只有 2 个字段&#xff1a;序号和邮箱。序…

英语学习交流小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;每日打卡管理&#xff0c;备忘录管理&#xff0c;学习计划管理&#xff0c;学习资源管理&#xff0c;论坛交流 微信端账号功能包括&#xff1a;系统首页&#xff0c;学习资源&…

C++基础(八):类和对象 (下)

经过前面的学习&#xff0c;我们已经翻过了两座大山&#xff0c;类和对象入门知识就剩下这一讲了&#xff0c;加油吧&#xff0c;少年&#xff01; 目录 一、再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表&#xff08;理解&#xff09; 1.3 explicit关键字&#xff08;C…

【Java探索之旅】继承概念_语法_父类的成员访问

文章目录 &#x1f4d1;前言一、继承1.1 继承的概念1.2 继承语法1.3 继承发生后 二、父类的访问2.1 父类成员变量访问2.2 父类成员方法访问 &#x1f324;️全篇总结 &#x1f4d1;前言 在面向对象编程中&#xff0c;继承是一种重要的概念&#xff0c;它允许我们创建一个类&…

html的作业

目录 作业题目 1.用户注册 A图 B代码 2.工商银行电子汇款单 A图 B代码 3.李白诗词 A图 B代码 4.豆瓣电影 A图 B代码 学习产出&#xff1a; 作业题目 1.用户注册 A图 B代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset&qu…

Java技术栈总结:Redis篇

一、数据类型 Redis 自身是一个 Map&#xff0c;其中的所有数据均采用“key:value”的形式存储。 数据类型指的是存储的数据的类型&#xff0c;即 value 部分的类型&#xff0c;key 的部分只能是字符串。 value 部分的数据类型&#xff1a;<String、List、Hash、Set、Zse…

MSPM0G3507——编码器控制速度

绿色设置的为目标值100&#xff0c;红色为编码器实际数据 。 最后也是两者合在了一起&#xff0c;PID调试成功。 源码直接分享&#xff0c;用的是CCStheia&#xff0c;KEIL打不开。大家可以看一下源码的思路&#xff0c;PID部分几乎不用改 链接&#xff1a;https://pan.baid…

S32DS S32 Design Studio for S32 Platform 3.5 代码显示行号与空白符

介绍 NXP S32DS&#xff0c;全称 S32 Design Studio&#xff0c;s32 系列芯片默认使用 S32 Design Studio for S32 Platform 作为 IDE 集成开发环境&#xff0c;当前版本 S32 Design Studio for S32 Platform 3.5&#xff0c;IDE 可以简称 s32DS 使用 S32DS&#xff0c;可以认…