Xilinx FPGA:vivado这里记录一个小小的问题

问题描述:uart_data从rx模块输入到ctrl模块后就没有值了。

问题一:首先我仿真例化了两个模块,并且,我选取了单独例化的rx模块中的uart_data 的值,所以在仿真中它是有值的。

Matlab 复制代码
`timescale 1ns / 1ps
module test_bench_TOP(  );
   reg                sys_clk  ;
   reg                rst_n    ;
   reg                key      ;
   reg                echo     ;
   wire               trig     ;
   wire               tx_data  ;
   reg                rx_data       ; 
   wire[7:0]          uart_data     ; 
   wire               rx_done       ; 

  parameter         SYSCLK =   50_000_000  ;
  parameter         Baud   =   115200      ;
  parameter         COUNT  =   SYSCLK/Baud ;//434   传输1比特所需要的时钟周期
  parameter         MID    =   COUNT/2     ;
  initial
      begin
           sys_clk = 0 ;
           rst_n   = 0 ;
           key     = 1 ;
           #10
           rst_n   = 1 ;
           #50000
           key     = 0 ;
           #50000
           key     = 1 ;
           #50000
           key     = 0 ;
           #50000
           key     = 1 ;
           #50000
           key     = 0 ;
           #50000
           key     = 1 ;
           
           
      end
  always #1 sys_clk = ~sys_clk ; //2ns
  
  initial
        begin
            uart_out (8'h33);  //0011_0011
            uart_out (8'hff);  //1111_1111
            uart_out (8'h18);  //0001_1000
            uart_out (8'h78);
            uart_out (8'h66);
        end
  
  
  //任务函数
  task     uart_out   ;
     input      [7:0]    DATA   ;
         begin
              rx_data = 1 ;///空闲位初始
              #20 
              rx_data = 0 ;///起始位
               ///传输1bit的计时次数*1周期时间=总时间
               #(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       ;
/*这一步相当于代替了串口调试工具,串口调试工具根据选择的"偶校验"
自动在数据位后面生成"0"或者"1",我们这边只能赋值一个数"0"或者"1"。
我选择赋值为0,所以注定了"8'h31""8'hef""8'h10"是通不过的。
*/
               #(COUNT*2)  rx_data = 1       ;
               #(COUNT*2)                    ;//停止位也需要时间
               # 80000                       ;
         end
  
  
  
  endtask

  
TOP TOP_1(
             .   sys_clk ( sys_clk) ,
             .   rst_n   ( rst_n  ) ,
             .   key     ( key    ) ,
//              .   rx_data  (rx_data  ) ,  //输入串行数据distance
             .   echo    ( echo   ) ,
             .   trig    ( trig   ) ,
             .   tx_data ( tx_data)

    );
uart_rx uart_rx_1(
               .   sys_clk  (sys_clk  ) ,
               .   rst_n    (rst_n    ) ,
               .   rx_data  (rx_data  ) ,  //输入串行数据distance
               .   uart_data(uart_data) , // 输出并行数据
               .   rx_done  (rx_done  )   //数据传输完成结束信号  
         
    );


endmodule

如果选取TOP模块中的uart_data,它同样是没有值的:

问题二:TOP模块中没有uart_data输入进来,我们仿真的是TOP模块,uart_data都没有输入进来,肯定是没有值的。

改正后:

Matlab 复制代码
`timescale 1ns / 1ps
module test_bench_TOP(  );
   reg                sys_clk  ;
   reg                rst_n    ;
   reg                key      ;
   reg                echo     ;
   wire               trig     ;
   wire               tx_data  ;
   reg                rx_data       ; 


  parameter         SYSCLK =   50_000_000  ;
  parameter         Baud   =   115200      ;
  parameter         COUNT  =   SYSCLK/Baud ;//434   传输1比特所需要的时钟周期
  parameter         MID    =   COUNT/2     ;
  initial
      begin
           sys_clk = 0 ;
           rst_n   = 0 ;
           key     = 1 ;
           #10
           rst_n   = 1 ;
           #50000
           key     = 0 ;
           #50000
           key     = 1 ;
           #50000
           key     = 0 ;
           #50000
           key     = 1 ;
           #50000
           key     = 0 ;
           #50000
           key     = 1 ;
           
           
      end
  always #1 sys_clk = ~sys_clk ; //2ns
  
  initial
        begin
            uart_out (8'h33);  //0011_0011
            uart_out (8'hff);  //1111_1111
            uart_out (8'h18);  //0001_1000
            uart_out (8'h78);
            uart_out (8'h66);
        end
  
  
  //任务函数
  task     uart_out   ;
     input      [7:0]    DATA   ;
         begin
              rx_data = 1 ;///空闲位初始
              #20 
              rx_data = 0 ;///起始位
               ///传输1bit的计时次数*1周期时间=总时间
               #(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       ;
/*这一步相当于代替了串口调试工具,串口调试工具根据选择的"偶校验"
自动在数据位后面生成"0"或者"1",我们这边只能赋值一个数"0"或者"1"。
我选择赋值为0,所以注定了"8'h31""8'hef""8'h10"是通不过的。
*/
               #(COUNT*2)  rx_data = 1       ;
               #(COUNT*2)                    ;//停止位也需要时间
               # 80000                       ;
         end
  
  
  
  endtask

  
TOP TOP_1(
             .   sys_clk ( sys_clk) ,
             .   rst_n   ( rst_n  ) ,
             .   key     ( key    ) ,
              .   rx_data  (rx_data  ) ,  //输入串行数据distance
             .   echo    ( echo   ) ,
             .   trig    ( trig   ) ,
             .   tx_data ( tx_data)

    );
//uart_rx uart_rx_1(
//               .   sys_clk  (sys_clk  ) ,
//               .   rst_n    (rst_n    ) ,
//               .   rx_data  (rx_data  ) ,  //输入串行数据distance
//               .   uart_data(uart_data) , // 输出并行数据
//               .   rx_done  (rx_done  )   //数据传输完成结束信号  
         
//    );


endmodule

问题背景:

我没有认识到rx_data信号只能由电脑产生发送给卡发版,我以为由超声波返回的echo信号计算出的distance也可以作为输入信号让rx接收。

相关推荐
坏孩子的诺亚方舟14 天前
FPGA系统架构设计实践15_高云Arora V系列时钟体系
fpga开发·系统架构
FPGA小徐14 天前
入门 CNN 结构全解析|从流程图理论到 FPGA Verilog 硬件实现(含习题带讲解)
fpga开发
FPGA小徐14 天前
FPGA 数字信号处理:并行 FIR 与串行滤波器设计原理、对比与完整 Verilog 实现
fpga开发
Saniffer_SH15 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
zlinear数据采集卡16 天前
双核架构深度解析:ARM+FPGA如何让数据采集卡实现500Ksps高性能?
arm开发·fpga开发·架构
9527华安16 天前
FPGA实现GTH Transceivers Wizard传输2路视频,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持
fpga开发·gth·aurora 8b10b·transceivers
FPGA小徐16 天前
FPGA 数字信号处理(二):并行 FIR 滤波器的 Verilog 全流程设计与实现
fpga开发
国科安芯16 天前
基于AS32S601ZIT2型抗辐照MCU的商业航天卫星姿态确定与控制系统研究
单片机·嵌入式硬件·安全·fpga开发·架构·risc-v
ALINX技术博客16 天前
【黑金云课堂】FPGA技术教程FPGA基础:I2C 总线通信技术
fpga开发·i2c
Hello-FPGA17 天前
Xilinx KU040 FPGA Camera Link 图像采集
c++·fpga开发