Xilinx FPGA:vivado关于单端ROM的一个只读小实验

一、实验要求

    将生成好的voe文件里的数据使用rom读取出来,采用串口工具发送给电脑(当按键来临时)。

二、程序设计

按键消抖模块:

`timescale 1ns / 1ps
module key_debounce(
  input           sys_clk    ,
  input           rst_n      ,
  input           key        ,
  output          key_flag 
    );
//    parameter              delay = 100_000_0   ; //20ms
    parameter              delay = 100;// 测试用
    reg[19:0]               cnt   ;
    
    always@(posedge sys_clk )
         if(!rst_n)
            cnt <= 0 ;
         else if ( key == 0 )begin
              if ( cnt == delay -1 )
                   cnt <= cnt ;
              else 
                   cnt <= cnt +1 ;
         end
         else
         cnt <= 0 ;
     
     assign  key_flag = ( cnt == delay -2 )?1:0 ;
    
    
    
    
    
    
endmodule

接收端模块:

`timescale 1ns / 1ps
module uart_tx(
   input                     sys_clk   ,
   input                     rst_n     ,
   input      [7:0]          ram_out   ,
   input                     tx_start  ,
   output      reg           tx_done   ,
   output      reg           tx_data
    );
    parameter               SYSCLK = 50_000_000 ;
    parameter               Baud   = 115200     ;
    parameter               COUNT  = SYSCLK/Baud;
    parameter               MID    = COUNT/2    ;
    
    //start_flag
    reg              tx_reg1  ;
    reg              tx_reg2  ;
    wire           start_flag ;
    
    always@(posedge sys_clk )
         if(!rst_n)begin
            tx_reg1 <= 0 ;
            tx_reg2 <= 0 ;
         end
         else
             begin
                 tx_reg1 <= tx_start  ;
                 tx_reg2 <= tx_reg1   ;
             end
    assign  start_flag = tx_reg1 & ~tx_reg2 ;
    
    ///tx_flag
    reg                   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 ;
         else
            tx_flag <= tx_flag ;
   
   //cnt
    always@(posedge sys_clk )
         if(!rst_n)
            cnt <= 0 ;
         else if ( tx_flag == 1 )begin
              if ( cnt == COUNT - 1 )
                   cnt <= 0 ;
              else
                   cnt <= cnt +1 ;
         end
         else
         cnt <= 0 ;
    
    //cnt_bit 
    always@(posedge sys_clk )
         if(!rst_n)
            cnt_bit <= 0 ;
         else if ( tx_flag == 1 )begin
              if ( cnt == COUNT - 1 )begin
                  if ( cnt_bit == 10 )
                       cnt_bit <= 0 ;
                  else
                       cnt_bit <= cnt_bit +1 ;
              end
              else
              cnt_bit <= cnt_bit ;
         end
         else
         cnt_bit <= 0 ;
   
   //tx_data
   parameter               MODE_CHECK = 0 ;
   always@(posedge sys_clk )
        if(!rst_n) 
           tx_data <= 0 ;
        else if ( tx_flag == 1 )begin
             if ( cnt_bit > 0 && cnt_bit < 9 )
                  tx_data <= ram_out[cnt_bit -1] ;
             else if ( cnt_bit == 0 )
                  tx_data <= 0 ;
             else if ( cnt_bit == 9 )
                  tx_data <= ( MODE_CHECK == 0 )?^ram_out : ~^ram_out ;
             else if ( cnt_bit == 10 )
                  tx_data <= 1 ;
             else
                  tx_data <= tx_data ;    
        end
        else
        tx_data <= 1 ;
 
 ///tx_done 
     always@(posedge sys_clk )
          if(!rst_n)
             tx_done <= 0 ;
          else if ( tx_flag == 1 )begin
               if ( cnt_bit == 10 && cnt == COUNT -1 )
                    tx_done <= 1 ;
               else
                    tx_done <= 0 ;
          end
          else
          tx_done <= 0 ;
    

    
endmodule

顶层(ROM)模块:

IP参数:

`timescale 1ns / 1ps
///按键来临时,将rom中的数据读出,并通过tx模块返回给PC端
module rom(
     input            sys_clk    ,
     input            rst_n      ,
     input            key        ,
     output           tx_data  
    );
    wire             key_flag    ;
    wire             tx_done     ;
    reg              tx_start    ;
    reg              ena         ;
    reg[4:0]         addra       ;
    wire[7:0]        douta       ;
    
    always@(posedge sys_clk )
         if(!rst_n)
            addra <= 0 ;
         else if ( tx_done && addra == 15 )
            addra <= 15 ;   ///保持在15,不连续输出
         else if ( tx_done || key_flag )//key_flag 是因为第一个数据要输出,地址要+1
            addra <= addra +1 ;
         else
            addra <= addra ;
            
   always@(posedge sys_clk )
        if(!rst_n)
            ena <= 0 ;
        else if ( key_flag )
            ena <= 1 ;
        else if ( tx_done && addra <= 14 )
            ena <= 1 ;
        else if ( addra == 15 )
            ena <= 0 ;  
        else
            ena <= 0 ; 
    
    always@(posedge sys_clk )
         if (!rst_n)
             tx_start <= 0 ;
         else if ( key_flag )
             tx_start <= 1 ;   ///发送第一个数据
         else if ( tx_done && addra <= 14)///发送后面的数据 
             tx_start <= 1 ;
         else
             tx_start <= 0 ;
   
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
blk_mem_gen_0 rom (
  .clka(sys_clk ),    // input wire clka
  .ena(ena),      // input wire ena
  .addra(addra),  // input wire [3 : 0] addra
  .douta(douta)  // output wire [7 : 0] douta
);
// INST_TAG_END ------ End INSTANTIATION Template ---------
   
key_debounce key_debounce_u1(
                  .      sys_clk  (sys_clk )  ,
                  .      rst_n    (rst_n   )  ,
                  .      key      (key     )  ,
                  .      key_flag (key_flag)
    );
   
uart_tx uart_tx_u1(   
                   .     sys_clk (sys_clk )  ,   
                   .     rst_n   (rst_n   )  ,
                   .     ram_out (douta )  ,
                   .     tx_start(tx_start)  ,
                   .     tx_done (tx_done )  ,
                   .     tx_data (tx_data )
    );



endmodule

三、仿真结果

仿真程序:

`timescale 1ns / 1ps
module test_rom(  );

     reg            sys_clk    ;
     reg            rst_n      ;
     reg            key        ;
     wire           tx_data    ;
     
     initial 
            begin
                   sys_clk = 0 ;
                   rst_n   = 0 ;
                   key     = 1 ;
                   #10   
                   rst_n   = 1 ;
                   #1000
                   key     = 0 ;
            end
  always #1 sys_clk = ~sys_clk ;   


rom rom_1(
     .          sys_clk  (sys_clk)  ,
     .          rst_n    (rst_n  )  ,
     .          key      (key    )  ,
     .          tx_data  (tx_data)
    );












endmodule

实验结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vcruntime140_1.dll下载——修复vcruntime140_1.dll方法解析

vcruntime140_1.dll 是 Microsoft Visual C Redistributable 中的一个重要动态链接库文件。它在许多应用程序的正常运行中起着关键作用。然而&#xff0c;有时用户可能会遇到 vcruntime140_1.dll 丢失或损坏的情况&#xff0c;导致相关程序无法启动。在这种情况下&#xff0c;下…

代码随想录-二叉搜索树①

目录 二叉搜索树的定义 700. 二叉搜索树中的搜索 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 98. 验证二叉搜索树 题目描述&#xff1a; 输入输出示例&#xff1a; 思路和想法&#xff1a; 530. 二叉搜索树的最小绝对差 题目描述&#x…

Windows Server 2008近源应急OS-1

前景需要&#xff1a;小王从某安全大厂被优化掉后&#xff0c;来到了某私立小学当起了计算机老师。某一天上课的时候&#xff0c;发现鼠标在自己动弹&#xff0c;又发现除了某台电脑&#xff0c;其他电脑连不上网络。感觉肯定有学生捣乱&#xff0c;于是开启了应急。 我们需要…

第三方软件测试公司分享:软件渗透测试的测试内容和注意事项

软件渗透测试是一种通过模拟攻击的方式来评估软件系统的安全性和漏洞&#xff0c;以发现并修复系统中的安全弱点。保护用户的数据和信息不被恶意攻击者利用&#xff0c;也是软件产品开发流程中重要的环节&#xff0c;可以帮助开发团队完善产品质量&#xff0c;提高用户满意度。…

VSG虚拟同步发电机simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 VSG虚拟同步发电机simulink建模与仿真&#xff0c;虚拟同步发电机&#xff08;Virtual Synchronous Generator, VSG&#xff09;技术是电力电子领域的一项重要创新&#xff0c…

Modbus RTU协议简介即CRC算法实现

目录 1 Modbus 介绍2 Modbus RTU协议传输方式2.1 地址码2.2 功能码2.3 数据码2.4 校验码 3 CRC算法实现2.1 代码3.2 运行结果 1 Modbus 介绍 Modbus是一种串行通信协议&#xff0c;是Modicon公司&#xff08;现在的施耐德电气 Schneider Electric&#xff09;于1979年为使用可编…

2024 6G无线通信AI大赛分享交流会暨颁奖典礼圆满落幕

7月1日&#xff0c;由IMT-2030(6G)推进组、IMT-2020(5G)推进组5G与AI融合研究任务组主办&#xff0c;OPPO广东移动通信有限公司承办的2024 6G无线通信AI大赛在北京顺利举行分享交流会暨颁奖典礼。主承办方专家、10支获奖团队代表及6G无线通信相关领域专业人才齐聚北京&#xff…

企业元宇宙3D云端数字化展厅扩大客户触及面

在浩瀚无垠的元宇宙中&#xff0c;一个立体、虚拟的数字空间正在等待您的探索与创造。如何在这片无边界的数字领域中快速搭建起属于您自己的虚拟展馆&#xff0c;已成为当今企业关注的焦点。 元宇宙数字展馆搭建&#xff0c;不仅是对新技术领域的探索&#xff0c;更是品牌创新与…

股指期货看盘技巧和方法分享!

股指期货看盘技巧&#xff0c;简单来说&#xff0c;就是要找到适合自己的方法&#xff0c;同时要考虑大的经济环境。做交易时&#xff0c;要勇敢&#xff0c;不要后悔。 1. 了解自己&#xff1a;首先&#xff0c;你得清楚自己是哪种类型的投资者。你是喜欢长期投资&#xff0c;…

迅睿CMS 后端配置项没有正常加载,上传插件不能正常使用

首先&#xff0c;尝试迅睿CMS官方提供的【百度编辑器问题汇总】解决方案来解决你的问题。你可以访问这个链接&#xff1a;官方解决方案。 如果按照【百度编辑器问题汇总】解决方案操作后&#xff0c;依然遇到“后端配置项没有正常加载&#xff0c;上传插件不能正常使用”的问题…

JL-33 手持式气象站/便携式气象站 小型气象站厂家 微型气象站

产品概述 手持式气象站是一款携带方便&#xff0c;操作简单&#xff0c;集多项气象要素于一体的可移动式气象观测仪器。产品采用传感器及芯片&#xff0c;能同时对空气温度、空气湿度、风速、风向、光照、大气压力、颗粒物、噪声等要素进行准确测量、记录并存储。仪器带有机械…

未对文件 xxx.ps1 进行数字签名,无法在当前系统上运行该脚本解决

无法执行PS1脚本&#xff1a; 解决方法: 启用远程签名策略 set-ExecutionPolicy RemoteSigned 启用签名策略后&#xff0c;成功执行ps1脚本 解决方法2: 使用当前用户签名策略&#xff1a; Set-ExecutionPolicy -Scope CurrentUser RemoteSigned 成功运行ps1脚本 PowerShell I…

【计算机网络】网络层(作业)

【一】 1、某主机的 IP 地址为 166.199.99.96/19。若该主机向其所在网络发送广播 IP 数据报&#xff0c; 则目的地址可以是&#xff08;D&#xff09;。 A. 166.199.99.255B. 166.199.96.255C. 166.199.96.0D. 166.199.127.255 解析&#xff1a; 166.199.99.96/19166.199.0…

【FPGA】STA静态时序分析

文章目录 一.定义二.分类1. 静态时序分析2. 静态时序分析 三. 概念四. 时间余量1.场景2.建立时间余量3.保持时间余量 一.定义 时序分析:检查电路是否满足时序要求&#xff1b; 二.分类 1. 静态时序分析 STA,遍历所有的时序路径&#xff0c;根据时序库&#xff08;.lib文件&…

【前端】HTML+CSS复习记录【5】

文章目录 前言一、padding、margin、border&#xff08;边框边距&#xff09;二、样式优先级三、var&#xff08;使用 CSS 变量更改多个元素样式&#xff09;四、media quary&#xff08;媒体查询&#xff09;系列文章目录 前言 长时间未使用HTML编程&#xff0c;前端知识感觉…

分享 6 款用于管理Docker容器的免费开源工具

Docker 是一个开源平台&#xff0c;可自动执行应用程序的部署、扩展和管理。它使用容器化技术将应用程序及其依赖项打包到软件开发的标准化单元中。 这使得使用容器创建、部署和运行应用程序变得更加容易&#xff0c;容器允许开发人员将应用程序及其所需的所有部分&#xff08…

使用Scrapy进行网络爬取时的缓存策略与User-Agent管理

缓存策略的重要性 缓存策略在网络爬虫中扮演着至关重要的角色。合理利用缓存可以显著减少对目标网站的请求次数&#xff0c;降低服务器负担&#xff0c;同时提高数据抓取的效率。Scrapy提供了多种缓存机制&#xff0c;包括HTTP缓存和Scrapy内置的缓存系统。 HTTP缓存 HTTP缓…

Conmi的正确答案——ESP32-C3开启安全下载模式

IDF版本&#xff1a;4.4.7 注意事项&#xff1a;一旦烧录“安全下载模式”&#xff0c;模组将无法被读取或清理&#xff0c;只能通过eclipse原项目烧录程序进行重新烧录&#xff0c;无法再烧录其他固件。 20240703110201——追加解法&#xff0c;暂时无法解安全下载模式 &…

运营商如何与第三方服务商合作,共同建设PCDN网络?

运营商与第三方服务商合作&#xff0c;共同建设PCDN&#xff08;P2P CDN&#xff09;网络是一个复杂且涉及多方面的过程。以下是具体的操作步骤&#xff1a; 一&#xff0e;明确合作目标与需求&#xff1a; 1.运营商与第三方服务商首先需明确合作目标&#xff0c;如提升内容分…

【YOLOv5进阶】——引入注意力机制-以SE为例

声明&#xff1a;笔记是做项目时根据B站博主视频学习时自己编写&#xff0c;请勿随意转载&#xff01; 一、站在巨人的肩膀上 SE模块即Squeeze-and-Excitation 模块&#xff0c;这是一种常用于卷积神经网络中的注意力机制&#xff01;&#xff01; 借鉴代码的代码链接如下&a…