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.rhkb.cn/news/370965.html

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

相关文章

python 笔试面试八股(自用版~)

1 解释型和编译型语言的区别 解释是翻译一句执行一句&#xff0c;更灵活&#xff0c;eg&#xff1a;python; 解释成机器能理解的指令&#xff0c;而不是二进制码 编译是整个源程序编译成机器可以直接执行的二进制可运行的程序&#xff0c;再运行这个程序 比如c 2 简述下 Pyth…

【LInux】从动态库的加载深入理解页表机制

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

C语言实现【程序设计与实践】实验三:自动售货机

声明&#xff1a;著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 附上c版http://t.csdnimg.cn/BbDSL https://blog.csdn.net/As_sBomb/article/details/105485940 实验三&#xff1a;自动售货机 题目&#xff1a; 图所示为简易自动售货…

孩子很内向,是不是自闭症?

作为星启帆寄宿制自闭症学校的老师&#xff0c;我深知内向与自闭症之间存在着本质的区别&#xff0c;尽管两者在社交表现上可能有一定的相似性。 首先&#xff0c;内向是一种性格特质&#xff0c;表现为个体在社交场合中相对安静、羞涩&#xff0c;更喜欢独处或与小范围的人交往…

vue3+vite搭建第一个cesium项目详细步骤及环境配置(附源码)

文章目录 1.创建vuevite项目2.安装 Cesium2.1 安装cesium2.2 安装vite-plugin-cesium插件&#xff08;非必选&#xff09;2.3 新建组件页面map.vue2.4 加载地图 3.完成效果图 1.创建vuevite项目 打开cmd窗口执行以下命令&#xff1a;cesium-vue-app是你的项目名称 npm create…

二叉树的链式结构

前言 Hello,友友们&#xff0c;小编将继续重新开始数据结构的学习&#xff0c;前面讲解了堆的部分知识&#xff0c;今天将讲解二叉树的链式结构的部分内容。 1.概念回顾与新增 二叉树是一种数据结构&#xff0c;其中每个节点最多有两个子节点&#xff0c;分别是左子节点和右子…

在 PostgreSQL 中,如何处理数据的版本控制?

文章目录 一、使用时间戳字段进行版本控制二、使用版本号字段进行版本控制三、使用历史表进行版本控制四、使用 RETURNING 子句获取更新前后的版本五、使用数据库触发器进行版本控制 在 PostgreSQL 中&#xff0c;处理数据的版本控制可以通过多种方式实现&#xff0c;每种方式都…

【数据库】MySQL基本操作语句

目录 一、SQL语句 1.1 SQL分类 1.2 SQL语言规范 1.3 数据库对象与命名 1.3.1 数据库的组件(对象)&#xff1a; 1.3.2 命名规则&#xff1a; 1.4 SQL语句分类 二、基本命令 2.1 查看帮助信息 2.2 查看支持的字符集 2.3 查看默认使用的字符集 2.4 修改默认字符集 2.5…

使用Livox-Mid360激光雷达,复现FAST_LIO(保姆级教程)

前面我已经完成了mid360激光雷达的驱动安装&#xff0c;octomap的复现&#xff0c;昨天我去把这俩在正式环境中实测了一下&#xff0c;效果不好&#xff0c;走廊转角没建出来&#xff0c;我查了一下&#xff0c;应该是TF的原因&#xff0c;但这部分我还不太懂&#xff0c;看到有…

基于CentOS Stream 9平台搭建RabbitMQ3.13.4以及开机自启

1. erlang与RabbitMQ对应版本参考&#xff1a;https://www.rabbitmq.com/which-erlang.html 2. 安装erlang 官网&#xff1a;https://www.erlang.org/downloads GitHub: https://github.com/rabbitmq/erlang-rpm/releases 2.1 安装依赖&#xff1a; yum -y install gcc glib…

中英双语介绍美国苹果公司(Apple Inc.)

中文版 苹果公司简介 苹果公司&#xff08;Apple Inc.&#xff09;是一家美国跨国科技公司&#xff0c;总部位于加利福尼亚州库比蒂诺。作为全球最有影响力的科技公司之一&#xff0c;苹果以其创新的产品和设计引领了多个科技领域的变革。以下是对苹果公司发展历史、主要产品…

Go源码--channel源码解读

简介 channel顾名思义就是channel的意思&#xff0c;主要用来在协程之间传递数据&#xff0c;所以是并发安全的。其实现原理&#xff0c;其实就是一个共享内存再加上锁&#xff0c;底层阻塞机制使用的是GMP模型。可见 GMP模型就是那个道&#xff0c;道生一,一生二,二生三,三生…

[数据结构] 基于选择的排序 选择排序堆排序

标题&#xff1a;[数据结构] 基于选择的排序 选择排序&&堆排序 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 &#xff08;一&#xff09;选择排序 实现&#xff1a;(默认从小到大排序) 优化后实现方法&#xff1a; &#xff08;二&#xff09;堆排序…

UNIAPP_顶部导航栏右侧添加uni-icons图标,并绑定点击事件,自定义导航栏右侧图标

效果 1、导入插件 uni-icons插件&#xff1a;https://ext.dcloud.net.cn/plugin?nameuni-icons 复制 uniicons.ttf 文件到 static/fonts/ 下 仅需要那个uniicons.ttf文件&#xff0c;不引入插件、单独把那个文件下载到本地也是可以的 2、配置页面 "app-plus":…

1.Python学习笔记

一、环境配置 1.Python解释器 把程序员用编程语言编写的程序&#xff0c;翻译成计算机可以执行的机器语言 安装&#xff1a; 双击Python3.7.0-选择自定义安装【Customize installation】-勾选配置环境变量 如果没有勾选配置环境变量&#xff0c;输入python就会提示找不到命令…

论文略读:Large Language Models Relearn Removed Concepts

通过神经元修剪在模型编辑方面取得的进展为从大型语言模型中去除不良概念提供了希望。 然而&#xff0c;目前尚不清楚在编辑后模型是否具有重新学习修剪概念的能力——>论文通过在重新训练期间跟踪修剪神经元中的概念显著性和相似性来评估模型中的概念重新学习 研究结果表明…

vue3+electron项目搭建,遇到的坑

我主要是写后端,所以对前端的vue啊vue-cli只是知其然,不知其所以然 这样也导致了我在开发前端时候遇到了很多的坑 第一个坑, vue2升级vue3始终升级不成功 第二个坑, vue add electron-builder一直卡进度,进度条走完就是不出提示succes 第一个坑的解决办法: 按照网上说的升级v…

DAMA学习笔记(四)-数据建模与设计

1.引言 数据建模是发现、分析和确定数据需求的过程&#xff0c;用一种称为数据模型的精确形式表示和传递这些数据需求。建模过程中要求组织发现并记录数据组合的方式。数据常见的模式: 关系模式、多维模式、面向对象模式、 事实模式、时间序列模式和NoSQL模式。按照描述详细程度…

如何用简单的html,css,js写出一个带有背景层的删除弹出框

虽然每次项目都是主要写后端&#xff0c;但是有时候前端的样式太丑了&#xff0c;也有点看不下去。弹出框是项目中用的比较多的&#xff0c;比如删除&#xff0c;修改或者添加什么的&#xff0c;都需要一个弹出框。 所以这里简单记录一下&#xff0c;应该如何实现。实现效果如…

Android TextView的属性与用法

文本控件包括TextView、EditText、AutoCompleteTextView、CheckedTextView、MultiAutoCompleteTextView、TextInputLayout等&#xff0c;其中TextView、EditText是最基本最重要的文本控件&#xff0c;是必须要掌握的文本控件。 1.TextView TextView控件用于显示文本信息&…