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. Rancher 2.x 安装

    Rancher 是一个容器管理平台.Rancher 简化了使用 Kubernetes 的流程. 下面记录一下手动安装Rancher的步骤 1.  部署 Rancher Server 执行以下命令即可( ...

  2. 解决ufw下pptp客户端连接问题

    解决ufw下pptp客户端连接问题 解决ubuntu在启动ufw的情况下pptp客户端无法链接的问题. 修改/etc/ufw/before.rules 在COMMIT之前添加如下内容: -A ufw- ...

  3. values_list()中参数flat用法

    先说下values from .models import Student student = Student.objects.values('number') student [{'number': ...

  4. 【LeetCode数组#1二分法】二分查找、搜索插入、在排序数组中查找元素的第一个和最后一个位置

    二分查找 题目 力扣704题目链接 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 ...

  5. 解析Spring中的循环依赖问题:再探三级缓存(AOP)

    前言 在之前的内容中,我们简要探讨了循环依赖,并指出仅通过引入二级缓存即可解决此问题.然而,你可能会好奇为何在Spring框架中还需要引入三级缓存singletonFactories.在前述总结中,我 ...

  6. Unity3D之OnTriggerEnter和OnCollisionEnter

    OnCollisionEnter方法要求碰撞的发起方必须拥有刚体,而被碰撞方有没有刚体并不重要; OnTriggerEnter方法则对此没有要求,只需要碰撞双方有一个具有刚体即可触发,当有物体勾选is ...

  7. 【Azure 应用服务】Azure Function Python函数部署到Azure后遇见 Value cannot be null. (Parameter 'receiverConnectionString') 错误

    问题描述 使用VS Code创建Python Function,处理Event Hub中的数据.当部署到Azure Function App后,函数无法执行,查看 Function 日志出现 Valu ...

  8. 【Azure 应用服务】本地Node.js部署上云(Azure App Service for Linux)遇到的三个问题解决之道

    问题描述 当本地Node.js(Linux + Node.js + npm + yarn)部署上云,选择 Azure App Service for Linux 环境.但是在部署时,遇见了以下三个问题 ...

  9. 用 nebula_dart_gdbc 在移动设备玩图数据库,泰酷辣!

    nebula_dart_gdbc,是访问 NebulaGraph 的 Dart 语言客户端,在 dart_gdbc 的规范下进行开发. dart_gdbc 是一套使用 Dart 语言定义的图数据库标准 ...

  10. Java 封装+构造器+this 小测试

    1 package com.bytezero.account; 2 3 4 public class Account 5 { 6 private int id; //账号 7 private doub ...