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接收。

相关推荐
2601_961845422 小时前
2027考研数学大纲|数一数二数三
考研·fpga开发·ar·vr·mr·oneflow
X_xcccc5 小时前
2026年嵌入式智能核心,从异构计算到敏捷开发的硬核指南
fpga开发·敏捷流程·zynq-7000·fpga板卡定制
9527华安7 小时前
FPGA实现GTX Transceivers Wizard传输2路视频,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持
fpga开发·aurora·gtx·高速接口·高速收发器·transceivers
ALINX技术博客9 小时前
【黑金云课堂】FPGA技术教程Linux开发:摄像头GPU渲染显示/Qt OpenGLES使用
linux·qt·fpga开发·gpu
S&Z34639 小时前
SZ901下载器烧写国产Flash指南
fpga开发
liuluyang5309 小时前
Verilog-1995风格,reg变量声明两次
fpga开发
cjie22111 小时前
安路好用的调试工具VPI
fpga开发
chenlance1 天前
基于FPGA的激光器多通道数据采集与波形控制系统设计
fpga开发
9527华安1 天前
FPGA实现GTP高速收发器2路视频传输,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持
图像处理·fpga开发·aurora·高速收发器·8b10b·derdes
cjie2211 天前
lanczos插值引起的振铃现象
计算机视觉·fpga开发