Entity: bram_to_vid

  • File: bram_to_vid.v

Diagram

Description

Company: Fpga Publish

Engineer: FP


Revision: 0.01

Revision 0.01 - File Created

Generics

Generic name Type Value Description
MD_SIM_ABLE 0 mode in sim mode enable
NB_BRAM_DLY 2 BRAM read delay
WD_BRAM_DAT 8 width of bram data
WD_BRAM_ADR 16 width of bram address
WD_BRAM_WEN 1 width of bram write en
MD_VGA_PARA "1280_720" vga mode, 640_480/800_600/1280_720/1920_1080/1024_600
WD_VID_DATA 24 RGB data
WD_VID_INFO 12 vid info width
WD_ERR_INFO 4 width of error info

Ports

Port name Direction Type Description
i_sys_clk input in system clock
i_sys_resetn input in system reset_n
i_fram_start_trig input frame start and VSYNC high
i_bram_full_trig input bram write full and allow read
o_bram_empt_trig output bram read empty and req write data
m_err_bram_info1 output [WD_ERR_INFO-1:0] [0]: [1]:
bram_master out Virtual bus --read data
vid_master out Virtual bus --write RGB data

Virtual Buses

bram_master

Port name Direction Type Description
m_bram_rd_addr output [WD_BRAM_ADR-1:0] bram address
m_bram_rd_clk output bram clock
m_bram_rd_din output [WD_BRAM_DAT-1:0] bram data in
m_bram_rd_dout input [WD_BRAM_DAT-1:0] bram data out
m_bram_rd_en output bram enable
m_bram_rd_rst output bram reset high
m_bram_rd_we output [WD_BRAM_WEN-1:0] bram write enable

vid_master

Port name Direction Type Description
m_vid_wr_pdata output [WD_VID_DATA-1:0]
m_vid_wr_phsync output hori sync
m_vid_wr_pvsync output vert sync
m_vid_wr_pvde output video info

Signals

Name Type Description
r_vid_wr_pdata = 0 reg [WD_VID_DATA-1:0] RGB data output
r_vid_wr_phsync = 0 reg hori sync
r_vid_wr_pvsync = 0 reg vert sync
r_vid_wr_pvde = 0 reg video info
r_vid_wr_hcunt = 0 reg [WD_VID_INFO-1:0] vid write hsync count
r_vid_wr_vcunt = 0 reg [WD_VID_INFO-1:0] vid write vsync count
r_bram_rd_addr = 0 reg [WD_BRAM_ADR-1:0] bram address
r_bram_rd_din = 0 reg [WD_BRAM_DAT-1:0] bram data in
r_bram_rd_en = 0 reg bram enable
r_bram_rd_rst = 0 reg bram reset high
r_bram_rd_we = 0 reg [WD_BRAM_WEN-1:0] bram write enable
r_bram_empt_trig = 0 reg frame sync

Constants

Name Type Value Description
H_FRONT MD_VGA hsync front
H_SYNC MD_VGA hsync time
H_BACK MD_VGA hsync back time
H_DISP MD_VGA_ hsync disp
H_TOTAL MD_VGA_ hsync total time
V_FRONT MD_VGA vsync front
V_SYNC MD_VG vsync time
V_BACK MD_VGA vsync back time
V_DISP MD_VGA_ vsync disp
V_TOTAL MD_VGA_ vsync total time

Processes

  • unnamed: ( @(posedge i_sys_clk) )

    • Type: always
    • Description

      vid interface
  • unnamed: ( @(posedge i_sys_clk) )
    • Type: always
    • Description

      BRAM interface
  • unnamed: ( @(posedge i_sys_clk) )
    • Type: always
    • Description

      frame sync

/*

code

*/
// *******************************************************************************
//!Company: Fpga Publish
//!
//!Engineer: FP
//!
//
// Create Date: 2024/01/20 13:03:28
// Design Name:
// Module Name: bram_to_vid
// Project Name:
// Target Devices: ZYNQ7010 | XCZU2CG | Kintex7
// Tool Versions: 2021.1 || 2022.2
// Description:
// *
// Dependencies:
// *
//!-----------------
//!Revision: 0.01
//!
//!Revision 0.01 - File Created
//!
// Additional Comments:
//
// *******************************************************************************
`timescale 1ns / 1ps
module bram_to_vid #(
//sim mode
parameter MD_SIM_ABLE = 0,//!mode in sim mode enable
//bram bus
parameter NB_BRAM_DLY = 2, //! BRAM read delay
parameter WD_BRAM_DAT = 8, //! width of bram data
parameter WD_BRAM_ADR = 16, //! width of bram address
parameter WD_BRAM_WEN = 1 , //! width of bram write en
//vid bus
parameter MD_VGA_PARA = "1280_720", //! vga mode, 640_480/800_600/1280_720/1920_1080/1024_600
parameter WD_VID_DATA = 24, //! RGB data
parameter WD_VID_INFO = 12, //! vid info width
//error info
parameter WD_ERR_INFO = 4 //!width of error info
)(
//sy stem signals
input i_sys_clk , //!in system clock
input i_sys_resetn, //!in system reset_n
//data full trig
input i_fram_start_trig, //! frame start and VSYNC high
input i_bram_full_trig, //! bram write full and allow read
output o_bram_empt_trig, //! bram read empty and req write data
//! @virtualbus bram_master @dir out --read data
output [WD_BRAM_ADR-1:0] m_bram_rd_addr, //! bram address
output m_bram_rd_clk , //! bram clock
output [WD_BRAM_DAT-1:0] m_bram_rd_din , //! bram data in
input [WD_BRAM_DAT-1:0] m_bram_rd_dout, //! bram data out
output m_bram_rd_en , //! bram enable
output m_bram_rd_rst , //! bram reset high
output [WD_BRAM_WEN-1:0] m_bram_rd_we , //! bram write enable
//! @end
//! @virtualbus vid_master @dir out --write RGB data
output [WD_VID_DATA-1:0] m_vid_wr_pdata , //! RGB data output
output m_vid_wr_phsync, //! hori sync
output m_vid_wr_pvsync, //! vert sync
output m_vid_wr_pvde , //! video info
//! @end
//![0]:
//![1]:
//error info feedback
output [WD_ERR_INFO-1:0] m_err_bram_info1 //!master of error info
);
//========================================================
//function to math and logic //========================================================
//localparam to converation and calculate
localparam H_FRONT = MD_VGA_PARA == "640_480" ? 12'd16 : //! hsync front
MD_VGA_PARA == "800_600" ? 12'd40 :
MD_VGA_PARA == "1280_720" ? 12'd110 :
MD_VGA_PARA == "1920_1080" ? 12'd88 :
MD_VGA_PARA == "1024_600" ? 12'd160 :
12'd16 ; localparam H_SYNC = MD_VGA_PARA == "640_480" ? 12'd96 : //! hsync time
MD_VGA_PARA == "800_600" ? 12'd128 :
MD_VGA_PARA == "1280_720" ? 12'd40 :
MD_VGA_PARA == "1920_1080" ? 12'd44 :
MD_VGA_PARA == "1024_600" ? 12'd40 :
12'd96 ; localparam H_BACK = MD_VGA_PARA == "640_480" ? 12'd48 : //! hsync back time
MD_VGA_PARA == "800_600" ? 12'd88 :
MD_VGA_PARA == "1280_720" ? 12'd220 :
MD_VGA_PARA == "1920_1080" ? 12'd148 :
MD_VGA_PARA == "1024_600" ? 12'd120 :
12'd48 ; localparam H_DISP = MD_VGA_PARA == "640_480" ? 12'd640 : //! hsync disp
MD_VGA_PARA == "800_600" ? 12'd800 :
MD_VGA_PARA == "1280_720" ? 12'd1280:
MD_VGA_PARA == "1920_1080" ? 12'd1920:
MD_VGA_PARA == "1024_600" ? 12'd1024:
12'd640; localparam H_TOTAL = MD_VGA_PARA == "640_480" ? 12'd800 : //! hsync total time
MD_VGA_PARA == "800_600" ? 12'd1056:
MD_VGA_PARA == "1280_720" ? 12'd1650:
MD_VGA_PARA == "1920_1080" ? 12'd2200:
MD_VGA_PARA == "1024_600" ? 12'd1344:
12'd800; localparam V_FRONT = MD_VGA_PARA == "640_480" ? 12'd10 : //! vsync front
MD_VGA_PARA == "800_600" ? 12'd1 :
MD_VGA_PARA == "1280_720" ? 12'd5 :
MD_VGA_PARA == "1920_1080" ? 12'd4 :
MD_VGA_PARA == "1024_600" ? 12'd12 :
12'd10 ; localparam V_SYNC = MD_VGA_PARA == "640_480" ? 12'd2 : //! vsync time
MD_VGA_PARA == "800_600" ? 12'd4 :
MD_VGA_PARA == "1280_720" ? 12'd5 :
MD_VGA_PARA == "1920_1080" ? 12'd5 :
MD_VGA_PARA == "1024_600" ? 12'd3 :
12'd2 ; localparam V_BACK = MD_VGA_PARA == "640_480" ? 12'd33 : //! vsync back time
MD_VGA_PARA == "800_600" ? 12'd23 :
MD_VGA_PARA == "1280_720" ? 12'd20 :
MD_VGA_PARA == "1920_1080" ? 12'd36 :
MD_VGA_PARA == "1024_600" ? 12'd20 :
12'd33 ; localparam V_DISP = MD_VGA_PARA == "640_480" ? 12'd480 : //! vsync disp
MD_VGA_PARA == "800_600" ? 12'd600 :
MD_VGA_PARA == "1280_720" ? 12'd720 :
MD_VGA_PARA == "1920_1080" ? 12'd1080:
MD_VGA_PARA == "1024_600" ? 12'd600 :
12'd480; localparam V_TOTAL = MD_VGA_PARA == "640_480" ? 12'd525 : //! vsync total time
MD_VGA_PARA == "800_600" ? 12'd628 :
MD_VGA_PARA == "1280_720" ? 12'd750 :
MD_VGA_PARA == "1920_1080" ? 12'd1125:
MD_VGA_PARA == "1024_600" ? 12'd635 :
12'd525; //========================================================
//register and wire to time sequence and combine // ----------------------------------------------------------
//! vid interface
reg [WD_VID_DATA-1:0] r_vid_wr_pdata = 0; //! RGB data output
reg r_vid_wr_phsync = 0; //! hori sync
reg r_vid_wr_pvsync = 0; //! vert sync
reg r_vid_wr_pvde = 0; //! video info
assign m_vid_wr_pdata = r_vid_wr_pdata ;
assign m_vid_wr_phsync = r_vid_wr_phsync ;
assign m_vid_wr_pvsync = r_vid_wr_pvsync ;
assign m_vid_wr_pvde = r_vid_wr_pvde ;
//write count
reg r_frame_wr_flag = 0; //! only when frame start then send data
reg [WD_VID_INFO-1:0] r_vid_wr_hcunt = 0; //! vid write hsync count
reg [WD_VID_INFO-1:0] r_vid_wr_vcunt = 0; //! vid write vsync count
// ----------------------------------------------------------
//! BRAM interface
reg [WD_BRAM_ADR-1:0] r_bram_rd_addr = 0;//! bram address
// reg r_bram_rd_clk ; //! bram clock
reg [WD_BRAM_DAT-1:0] r_bram_rd_din = 0;//! bram data in
// reg [WD_BRAM_DAT-1:0] r_bram_rd_dout; //! bram data out
reg r_bram_rd_en = 0;//! bram enable
reg r_bram_rd_rst = 0;//! bram reset high
reg [WD_BRAM_WEN-1:0] r_bram_rd_we = 0;//! bram write enable
assign m_bram_rd_addr = r_bram_rd_addr;
assign m_bram_rd_clk = i_sys_clk;
assign m_bram_rd_din = r_bram_rd_din; assign m_bram_rd_en = r_bram_rd_en;
assign m_bram_rd_rst = r_bram_rd_rst;
assign m_bram_rd_we = r_bram_rd_we;
// ----------------------------------------------------------
//! frame sync
reg r_bram_empt_trig = 0;
assign o_bram_empt_trig = r_bram_empt_trig;
//========================================================
//always and assign to drive logic and connect // ----------------------------------------------------------
//! vid interface
always@(posedge i_sys_clk)
begin
if(!i_sys_resetn) //system reset
begin
r_frame_wr_flag <= 1'b0; //
end
else if(i_fram_start_trig) //
begin
r_frame_wr_flag <= 1'b1;//
end
else if(r_vid_wr_hcunt >= H_TOTAL - 1'b1
&& r_vid_wr_vcunt >= V_TOTAL - 1'b1)
begin
r_frame_wr_flag <= 1'b0;
end
end
always@(posedge i_sys_clk)
begin
if(!i_sys_resetn) //system reset
begin
r_vid_wr_hcunt <= 1'b0; //
end
else if(!r_frame_wr_flag)
begin
r_vid_wr_hcunt <= 1'b0;
end
else if(r_vid_wr_hcunt >= H_TOTAL - 1'b1) //
begin
r_vid_wr_hcunt <= 1'b0; //
end
else
begin
r_vid_wr_hcunt <= r_vid_wr_hcunt + 1'b1;
end
end
always@(posedge i_sys_clk)
begin
if(!i_sys_resetn) //system reset
begin
r_vid_wr_vcunt <= 1'b0; //
end
else if(!r_frame_wr_flag) //frame sync
begin
r_vid_wr_vcunt <= 1'b0;
end
else if(r_vid_wr_hcunt >= H_TOTAL - 1'b1) //
begin
if(r_vid_wr_vcunt >= V_TOTAL - 1'b1) //
begin
r_vid_wr_vcunt <= 1'b0;
end
else
begin
r_vid_wr_vcunt <= r_vid_wr_vcunt + 1'b1;
end
end
end
//vid signal
always@(posedge i_sys_clk)
begin
if(!i_sys_resetn) //system reset
begin
r_vid_wr_pvde <= 1'b0; //
end
else if(r_vid_wr_hcunt >= H_SYNC + H_BACK - 1'b1
&& r_vid_wr_hcunt < H_SYNC + H_BACK + H_DISP - 1'b1
&& r_vid_wr_vcunt >= V_SYNC + V_BACK - 1'b1
&& r_vid_wr_vcunt < V_SYNC + V_BACK + V_DISP - 1'b1) //
begin
r_vid_wr_pvde <= 1'b1; //
end
else
begin
r_vid_wr_pvde <= 1'b0;
end
end
always@(posedge i_sys_clk)
begin
if(!i_sys_resetn) //system reset
begin
r_vid_wr_pvsync <= 1'b0; //
end
else if(r_vid_wr_hcunt >= H_TOTAL - 1'b1) //
begin
if(r_vid_wr_vcunt >= V_SYNC - 1'b1
&& r_vid_wr_vcunt < V_TOTAL - 1'b1) //when count last then set it low
begin
r_vid_wr_pvsync <= 1'b1;
end
else
begin
r_vid_wr_pvsync <= 1'b0; //
end
end
end
always@(posedge i_sys_clk)
begin
if(!i_sys_resetn) //system reset
begin
r_vid_wr_phsync <= 1'b0; //
end
else if(r_vid_wr_hcunt <= V_SYNC - 1'b1 - 1'b1) //prepare vsync valid
begin
r_vid_wr_phsync <= 1'b0; //
end
else
begin
r_vid_wr_phsync <= 1'b1;
end
end
always@(posedge i_sys_clk)
begin
if(!i_sys_resetn) //system reset
begin
r_vid_wr_pdata <= 1'b0; //
end
else if(1) //
begin
r_vid_wr_pdata <= {3{m_bram_rd_dout}}; //
end
end
// ----------------------------------------------------------
//! BRAM interface
always@(posedge i_sys_clk)
begin
if(!i_sys_resetn) //system reset
begin
r_bram_rd_en <= 1'b0; //
end
else if(1) //
begin
r_bram_rd_en <= r_vid_wr_phsync;//
end
end
always@(posedge i_sys_clk)
begin
if(!i_sys_resetn) //system reset
begin
r_bram_rd_addr <= 1'b0;//
end
else if(r_vid_wr_hcunt == 0)
begin
r_bram_rd_addr <= 1'b0;
end
else if(r_vid_wr_hcunt >= H_SYNC + H_BACK - 1 - NB_BRAM_DLY) //bram write addr add
begin
r_bram_rd_addr <= r_bram_rd_addr + 1'b1; //
end
end
// ----------------------------------------------------------
//! frame sync
always@(posedge i_sys_clk)
begin
if(!i_sys_resetn) //system reset
begin
r_bram_empt_trig <= 1'b0; //
end
else if(r_vid_wr_hcunt == H_SYNC + H_BACK + H_DISP - 2'd2
&& r_vid_wr_pvde) //video enable
begin
r_bram_empt_trig <= 1'b1; //
end
else
begin
r_bram_empt_trig <= 1'b0;
end
end
//========================================================
//module and task to build part of system //========================================================
//expand and plug-in part with version //========================================================
//ila and vio to debug and monitor endmodule /* end verilog

## logic

sim

  • BRAM read delay

  • video horizontal data

  • video vertical data

*/

随机推荐

  1. java利用hdfs api进行上传下载操作

    1.说明 最近项目中一部分大文件需要存储到hadoop的hdfs组件中,自己本地用3台centos7虚拟机搭建了一套集群.本地写点java代码测试一下. 代码部分改编自网络. 环境说明 一主二仆结构. ...

  2. 实操开源版全栈测试工具RunnerGo安装(四)Windows安装

    以windows 10系统为例 视频教程:https://www.bilibili.com/video/BV14H4y1C71u/?spm_id_from=333.999.0.0 1.设置手动进入系统 ...

  3. C++ 虚基类

    虚基类(Virtual Base Class)在面向对象编程中的作用是解决多重继承中的菱形继承问题(Diamond Inheritance Problem)和共享基类问题(Shared Base Cl ...

  4. QT - Day 1

    Date: 2021/3/12开始学习 教程视频: QT基本介绍: 跨平台图形界面引擎 优点  跨平台 接口简单,容易上手 一定程度上简化了内存回收 创建第一个QT程序  点击创建项目后,选择项目路径 ...

  5. win32-EnumChildWindows的使用

    #include <Windows.h> #include <iostream> #include <string> static BOOL CALLBACK en ...

  6. win32 - EnumDisplayDevices和EnumDisplayMonitors的使用

    EnumDisplayDevices枚举适配器 EnumDisplayMonitors枚举监视器 #pragma comment(lib, "dxva2.lib") #includ ...

  7. portainer docker可视化工具

    下载可视化工具 docker pull portainer/portainer 启动portainer --restart=always 只要挂掉了 就自动重启 docker run -d -p 80 ...

  8. 尝试通过uniapp仿微信页面

    最近一直想弄一个app,然后刚好看到Uniapp这个技术,然后最近就用几个晚上琢磨了下: 先看下成果: 1.通讯页面,这个是通过插件uni-indexed-list 索引列表 进行改造过后:改造过程还 ...

  9. ECMA Script Module(ES module)知识点

    1.每个 ES Module 都是运行在单独的私有作用,ESM 自动采用严格模式,忽略use strict <script type="module">console. ...

  10. 【Azure 环境】移动应用 SSO 登录AAD, MSAL的配置为Webview模式时登录页面无法加载

    问题描述 移动端集成MASL登录过程中,配置文件中配置项"authorization_user_agent"使用"DEFAULT"可以正常登录,但是改为&quo ...