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. Ubuntu20.04 PyCharm不能输入中文的解决办法

    在2020.3之后的PyCharm, 无法输入中文, 我使用的是ibus, 据网上搜索结果看, fctix也一样有问题. 在网上查到的, 修改环境变量的方式无效. 实际的原因在于JetBrain使用的 ...

  2. 【Android】使用 MediaMetadataRetriever 获取视频信息

    1 环境配置与初始化 ​ (1)申请权限 ​ 在 AndroidManifest.xml 中的 manifest 标签(application 同级标签)下添加外部存储读写权限,如下: <use ...

  3. Springboot+Vue+ElementUI实现的宿舍管理系统

    项目说明 doman是一个基于Springboot+Vue实现的前后端分离的宿舍管理系统.项目为本人亲手打造,需要的朋友可以拿去做个修改也是不错的.大神请忽略:) 项目功能 详细请看功能演示: Spr ...

  4. Acrobat 教程

    https://helpx.adobe.com/cn/acrobat/using/pdf-form-field-properties.html

  5. 产品分享:Qt鸿图电子智慧白板(适合会议机、电子黑板、电子笔记、电子阅读器等场景),当前版本v1.0.0

    产品   鸿途电子智慧白板.   原理   使用Qt技术为基础,开发的windows/ubuntu/arm电子绘图板,主要为windows,支持触摸鼠标,可以定制跨平台.   适合场景   1.会议机 ...

  6. AI与人类联手,智能排序人类决策:RLHF标注工具打造协同标注新纪元,重塑AI训练体验

    AI与人类联手,智能排序人类决策:RLHF标注工具打造协同标注新纪元,重塑AI训练体验 在大模型训练的 RLHF 阶段,需要人工对模型生成的多份数据进行标注排序,然而目前缺乏开源可用的 RLHF 标注 ...

  7. Redis缓存应用场景

    记录一下自己的听课笔记,看的网课. 参考资料:https://zhuanlan.zhihu.com/p/157717158 常见应用场景 1 数据缓存 缓存一些常用的.经常访问的.不经常变化的数据,也 ...

  8. 【生成对抗网络学习 其二】GAN(keras实现)代码阅读笔记

    想来想去还是记录一下吧,主要是怕以后时间长忘了 好记性不如烂笔头 代码来自eriklindernoren的开源GAN实现:https://github.com/eriklindernoren/Kera ...

  9. 【LeetCode二叉树#00】二叉树的基础知识

    基础知识 分类 满二叉树 如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树. 完全二叉树 除了底层外,其他部分是满的,且底层从左到右是连续的,称为完全二叉树 满二叉树一定是完全二 ...

  10. UG474

    为了对工程的资源利用率进行优化,我们首先需要知道当前工程对资源的利用率情况.在Vivado下,我们可以查看工程的资源利用率情况,在下面这张图中,其罗列出了整个工程所使用的资源情况.首先,下面我们需要一 ...