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

相关推荐
乌恩大侠3 小时前
O-RAN Fronthual CU/Sync/Mgmt 平面和协议栈
5g·平面·fpga开发·架构
DS小龙哥16 小时前
基于Zynq FPGA的雷龙SD NAND存储芯片性能测试
fpga开发·sd nand·雷龙·spi nand·spi nand flash·工业级tf卡·嵌入式tf卡
上理考研周导师1 天前
第二章 虚拟仪器及其构成原理
fpga开发
FPGA技术实战1 天前
《探索Zynq MPSoC》学习笔记(二)
fpga开发·mpsoc
bigbig猩猩2 天前
FPGA(现场可编程门阵列)的时序分析
fpga开发
Terasic友晶科技2 天前
第2篇 使用Intel FPGA Monitor Program创建基于ARM处理器的汇编或C语言工程<二>
fpga开发·汇编语言和c语言
码农阿豪2 天前
基于Zynq FPGA对雷龙SD NAND的测试
fpga开发·sd nand·spi nand·spi nand flash·工业级tf卡·嵌入式tf卡
江山如画,佳人北望2 天前
EDA技术简介
fpga开发
淘晶驰AK2 天前
电子设计竞赛准备经历分享
嵌入式硬件·fpga开发