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

发布于:2024-06-30 ⋅ 阅读:(19) ⋅ 点赞:(0)

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

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

`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都没有输入进来,肯定是没有值的。

改正后:

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


网站公告

今日签到

点亮在社区的每一天
去签到