当前位置: 首页 > news >正文

Xilinx FPGA MIPI DSI TX Subsystem 仿真笔记

MIPI DSI TX Subsystem IP接口如图。

测试文件:

`timescale 1ns / 100ps

module Parallel2DSI_tb();


parameter periode_1     = 20; 
parameter periode_2     = 20;
parameter periode_3     = 20;
parameter CLKT = 2;

reg rstn;
reg i_clk;

parameter C_M_AXI_ADDR_WIDTH = 7;

//s_axi
  wire    s_axi_awready   ; 
  reg    s_axi_awvalid   ; 
  reg  [C_M_AXI_ADDR_WIDTH-1:0]  s_axi_awaddr   ;  
  wire    s_axi_arready   ; 
  reg    s_axi_arvalid   ; 
  reg  [C_M_AXI_ADDR_WIDTH-1:0]  s_axi_araddr   ; 
  wire    s_axi_wready   ; 
  reg    s_axi_wvalid   ; 
  reg  [31:0]  s_axi_wdata   ; 
  reg  [3:0]  s_axi_wstrb   ; 
  reg    s_axi_rready   ; 
  wire    s_axi_rvalid   ; 
  wire  [31:0]  s_axi_rdata   ; 
  wire  [1:0]  s_axi_rresp   ; 
  reg    s_axi_bready   ; 
  wire    s_axi_bvalid   ; 
  wire  [1:0]  s_axi_bresp   ; 
  
  
//s_axis  
  reg    s_axis_aclk   ; 
  reg    s_axis_aresetn   ; 
  // reg    s_axis_tvalid   ; 
  wire    s_axis_tvalid   ; 
  wire    s_axis_tready   ; 
  reg  [7:0]  s_axis_tdata   ; 
  // reg    s_axis_tlast   ; 
  wire    s_axis_tlast   ; 
  // reg  [95:0]  s_axis_tuser   ; 
  wire  [0:0]  s_axis_tuser   ; 
  reg  [0:0]  s_axis_tkeep   ; 
  reg  [1:0]  s_axis_tdest   ;     
  
  
wire  mipi_phy_if_clk_hs_n;
wire  mipi_phy_if_clk_hs_p;
wire  mipi_phy_if_clk_lp_n;
wire  mipi_phy_if_clk_lp_p;
wire  [3 : 0] mipi_phy_if_data_hs_n;
wire  [3 : 0] mipi_phy_if_data_hs_p;
wire  [3 : 0] mipi_phy_if_data_lp_n;
wire  [3 : 0] mipi_phy_if_data_lp_p;  
  
  
wire interrupt;
wire  s_axi_init_rdy;

   
    initial begin                       
          rstn       = 1'b0; 
        s_axis_aresetn = 0;
        s_axis_tdest = 0;   
        s_axis_aclk = 0;
        s_axis_tdata = 0;   
        s_axis_tkeep = 1'b1; 
        //s_axi_bready = 1'b0; 
                       
                                
      #1600;
      #1600 rstn = 1'b1;  
      
        #90000;
        s_axis_aresetn = 1;        
      
    end

    initial  begin
           s_axi_awaddr    = 7'd0;
           s_axi_araddr    = 7'd0;
           s_axi_awvalid   = 1'b0;
           s_axi_wvalid    = 1'b0;
           s_axi_arvalid   = 1'b0;
           s_axi_rready   = 1'b0;
           s_axi_bready   = 1'b0;
           s_axi_wdata = 32'h0104_15bc;
           s_axi_wstrb = 4'b1001;
       #99000;           
           s_axi_awaddr    = 7'd0;
           s_axi_araddr    = 7'd0;
           s_axi_awvalid   = 1'b1;
           s_axi_wvalid    = 1'b1;
           s_axi_arvalid   = 1'b1;
           s_axi_rready   = 1'b1;
           s_axi_bready   = 1'b1;
           s_axi_wdata = 32'h0104_15bc;
           s_axi_wstrb = 4'b1001;           
           
           
           wait(s_axi_awready == 1'b1) #(20 * 1) s_axi_awvalid = 1'b0;
           
           
    end

    initial  begin
           i_clk    = 1'b0;
    end  


    always i_clk    = #periode_1  ~i_clk;
    always #20  s_axis_aclk = ~s_axis_aclk;
    
  
    
    
//assign s_axis_aresetn = locked;
    
reg [10:0]  cnt_h = 0;
reg [10:0]  cnt_v = 0;

// 128*32
always @(posedge s_axis_aclk)
    if(s_axis_aresetn && s_axi_init_rdy==1 )
    begin
        if(s_axis_tready)
            if(cnt_h==200)
                cnt_h <= 40;
            else
                cnt_h <= cnt_h + 1;
            
        if(cnt_h==200)
            if(cnt_v >= 31)
                cnt_v <= 0;
            else
                cnt_v <= cnt_v + 1;
    end
    
//----------------------------------------------------------------------------------
 
// assign s_axis_tvalid = 0;
assign s_axis_tvalid = (cnt_h >= 73) ? 1:0;
assign s_axis_tuser[0] = (cnt_v==0 && cnt_h==73)? 1 : 0 ;
assign s_axis_tlast = (cnt_h==200)? 1 : 0 ;
// s_axis_tuser[0] = 0;  //Frame start
 
always @(posedge s_axis_aclk)
    if(s_axis_tvalid && s_axis_tready) begin
        s_axis_tdata[7:0]  <= s_axis_tdata[7:0]  + 1;
    end

    
clk_wiz_0 clk_wiz_0inst
(
.clk_in1        (i_clk)       
,.resetn     (rstn) 
,.clk_out1     (dphy_clk_200M)   
,.clk_out2     (txclkesc_in)                           
,.clk_out3     (oserdes_clk_in)   
,.clk_out4     (oserdes_clk90_in)   
,.clk_out5     (txbyteclkhs_in)   
,.locked     (locked)   
);

mipi_dsi_tx_subsystem_0 tx_inst
(
.s_axis_aclk        (s_axis_aclk)       
,.s_axis_aresetn     (s_axis_aresetn) 
,.dphy_clk_200M     (dphy_clk_200M)   
,.txclkesc_out     (txclkesc_out)                           
,.oserdes_clk_out    (oserdes_clk_out)     
,.txbyteclkhs    (txbyteclkhs)     
,.oserdes_clkdiv_out    (oserdes_clkdiv_out)  
,.system_rst_out    (system_rst_out)  
,.mmcm_lock_out    (mmcm_lock_out)  
,.interrupt (interrupt) 
,.s_axi_araddr (s_axi_araddr) 
,.s_axi_arready   (s_axi_arready)   
,.s_axi_arvalid   (s_axi_arvalid)   
,.s_axi_awaddr   (s_axi_awaddr)   
,.s_axi_awready   (s_axi_awready)     
,.s_axi_awvalid   (s_axi_awvalid)   
,.s_axi_bready   (s_axi_bready)   
,.s_axi_bresp   (s_axi_bresp)  
,.s_axi_bvalid   (s_axi_bvalid)  
,.s_axi_rdata   (s_axi_rdata)  
,.s_axi_rready   (s_axi_rready)  
,.s_axi_rresp   (s_axi_rresp)  
,.s_axi_rvalid   (s_axi_rvalid)  
,.s_axi_wdata   (s_axi_wdata)  
,.s_axi_wready   (s_axi_wready)  
,.s_axi_wstrb   (s_axi_wstrb)  
,.s_axi_wvalid   (s_axi_wvalid)  
,.s_axis_tdata   (s_axis_tdata)  
,.s_axis_tlast   (s_axis_tlast)  
,.s_axis_tready   (s_axis_tready)  
,.s_axis_tuser   (s_axis_tuser)  
,.s_axis_tvalid   (s_axis_tvalid)  
,.mipi_phy_if_clk_hs_n   (mipi_phy_if_clk_hs_n)  
,.mipi_phy_if_clk_hs_p   (mipi_phy_if_clk_hs_p)  
,.mipi_phy_if_clk_lp_n   (mipi_phy_if_clk_lp_n)  
,.mipi_phy_if_clk_lp_p   (mipi_phy_if_clk_lp_p)  
,.mipi_phy_if_data_hs_n   (mipi_phy_if_data_hs_n)  
,.mipi_phy_if_data_hs_p   (mipi_phy_if_data_hs_p)  
,.mipi_phy_if_data_lp_n   (mipi_phy_if_data_lp_n)  
,.mipi_phy_if_data_lp_p   (mipi_phy_if_data_lp_p) 
);

endmodule
       
启动仿真后,发现MIPI并没有信号发出来。

查看指导,需要先对MIPI DSI TX Controller Core Registers进行初始化。

初始化后,读寄存器查看Controller ready是否OK。OK后才可以继续操作。

初始化步骤:软件复位Soft Reset,等待Soft Reset释放后Controller readyOK,初始化参数和模式等,最后启动Core Enable,发送视频流。

配置例子:

        按照上面配置后,发送视频流。MIPI接口正常发出MIPI波形。MIPI DSI TX Subsystem可以正常工作。

MIPI  PHY

欢迎讨论交流。

微:moning_hello

http://www.xdnf.cn/news/916165.html

相关文章:

  • 向日葵远程控制debian无法进入控制画面的解决方法
  • 征文投稿:如何写一份实用的技术文档?——以软件配置为例
  • PHP文件包含漏洞详解:原理、利用与防御
  • 低代码平台前端页面表格字段绑定与后端数据传输交互主要有哪些方式?华为云Astro在这方面有哪些方式?
  • R语言AI模型部署方案:精准离线运行详解
  • Ubuntu2404 下搭建 Zephyr 开发环境
  • 【JVM】Java虚拟机(二)——垃圾回收
  • YOLO11解决方案之分析
  • Go 语言实现高性能 EventBus 事件总线系统(含网络通信、微服务、并发异步实战)
  • altium designer2024绘制stm32过程笔记x`
  • CRMEB 中 PHP 快递查询扩展实现:涵盖一号通、阿里云、腾讯云
  • 力扣-17.电话号码的字母组合
  • 以SMMUv2为例,使用Trace32可视化操作SMMU的常用命令详解
  • SAP 在 AI 与数据统一平台上的战略转向
  • hmdp知识点
  • 华为OD机试真题——数字螺旋矩阵(2025B卷:100分)Java/python/JavaScript/C++最佳实现
  • aws(学习笔记第四十三课) s3_sns_sqs_lambda_chain
  • 【STM32F1标准库】理论——定时器中的输出比较
  • 桑荫不徙 · 时之沙 | 在筛选与共生之间,向轻盈之境远航
  • C++组合
  • C++.OpenGL (12/64)光照贴图(Lightmaps)
  • 【飞腾AI加固服务器】全国产化飞腾+昇腾310+PCIe Switch的AI大模型服务器解决方案
  • SQL Server 日期时间类型全解析:从精确存储到灵活转换
  • 限流算法java实现
  • 使用 Redisson 实现分布式锁—解决方案详解
  • Gradle 7.0 及以上版本集中管理项目依赖项的版本号、插件版本和库坐标
  • 【Fiddler工具判断前后端Bug】
  • Modbus RTU/TCP 协议详解与Spring Boot集成指南
  • 开疆智能Ethernet/IP转Modbus网关连接西门子BW500积算仪配置案例
  • 【软件工具】批量OCR指定区域图片自动识别内容重命名软件使用教程及注意事项