FPGA project : VGA

2023-10-31

 

module vga_ctrl(
    input       wire                vga_clk     ,
    input       wire                vga_rst_n   ,
    input       wire    [15:00]     pix_data    ,

    output      wire                hsync       ,
    output      wire                vsync       ,
    output      wire    [ 9: 0]     pix_x       ,
    output      wire    [ 9: 0]     pix_y       ,
    output      wire    [15:00]     rgb         
);

    parameter   H_SYNC  = 10'd96    , 
                H_BACK  = 10'd40    , 
                H_LEFT  = 10'd8     , 
                H_VALID = 10'd640   , 
                H_RIGHT = 10'd8     , 
                H_FORNT = 10'd8     , 
                H_TOTAL = 10'd800   ; 

    parameter   V_SYNC  = 10'd2     ,
                V_BACK  = 10'd25    ,
                V_TOP   = 10'd8     ,
                V_VALID = 10'd480   ,
                V_BOTTOM= 10'd8     ,
                V_FRONT = 10'd2     ,
                V_TOTAL = 10'd525   ;
    // reg define signal
    reg     [9:0]       cnt_h ;
    reg     [9:0]       cnt_v ;
    wire                rgb_valid ;
    wire                rgb_valid_req ;

    //  [9:0] cnt_h : period counter for line signal ,0 ~ 799
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            cnt_h <= 10'd0 ;
        end else begin
            if(cnt_h == H_TOTAL - 1'b1) begin
                cnt_h <= 10'd0 ;
            end else begin
                cnt_h <= cnt_h + 1'b1 ;
            end
        end
    end
    //  [9:0] cnt_v ; period counter field scan 0 ~ 524. “行”计数1次,“场”计数+1。
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            cnt_v <= 10'd0 ;
        end else begin
            if((cnt_h == H_TOTAL - 1'b1) && (cnt_v == V_TOTAL - 1'b1)) begin
                cnt_v <= 10'd0 ;
            end else begin
                if(cnt_h == H_TOTAL - 1'b1) begin
                    cnt_v <= cnt_v + 1'b1 ;
                end else begin
                    cnt_v <= cnt_v ;
                end
            end
        end
    end
    // rgb_valid 两个周期计数器,都计数到“有效图像周期”内,rgb_valid 拉高。
    assign rgb_valid = (cnt_h <= H_SYNC + H_BACK + H_LEFT + H_VALID - 1'b1) 
                && (cnt_h >= H_SYNC + H_BACK + H_LEFT) 
                && (cnt_v >= V_SYNC + V_BACK + V_TOP) 
                && (cnt_v <= V_SYNC + V_BACK + V_TOP + V_VALID - 1'b1) ? 1'b1 : 1'b0 ;

    assign rgb_valid_req = (cnt_h <= H_SYNC + H_BACK + H_LEFT + H_VALID - 1'b1) 
                && (cnt_h >= H_SYNC + H_BACK + H_LEFT - 1'b1 ) 
                && (cnt_v >= V_SYNC + V_BACK + V_TOP) 
                && (cnt_v <= V_SYNC + V_BACK + V_TOP + V_VALID - 1'b1) ? 1'b1 : 1'b0 ;

    // out_signal_describe
    // hsync , 行同步信号,只有在“行同步周期”内才拉高
    assign hsync = ((cnt_h <= H_SYNC - 1'b1) && (cnt_h >= 10'd0)) ? 1'b1 : 1'b0 ;
    // vsync , 场同步信号, 只有在“场同步周期”内才拉高
    assign vsync = ((cnt_v <= V_SYNC - 1'b1) && (cnt_v >= 10'd0)) ? 1'b1 : 1'b0 ;
    // pix_x  , 像素横坐标, 只有在rgb_valid_req 拉高才进行扫描。0 ~ 639。 等于行计数器(144 ~ 783) - 前面三个阶段的计数 (144).
    assign pix_x = (rgb_valid_req == 1'b1) ? cnt_h - (H_SYNC + H_BACK + H_LEFT - 1'b1) : 10'h3ff ; 
    // pix_y  , 像素纵坐标, 只有在rgb_valid_req 拉高才进行扫描。0 ~ 479。 等于场计数器(35 ~ 514 ) - 前面三个阶段的计数 (35) .
    assign pix_y = (rgb_valid_req == 1'b1) ? cnt_v - (V_SYNC + V_BACK + V_TOP)  : 10'h3ff ; 
    // [15:00]     rgb 只有在valid == 1 时,进行像素赋值
    assign rgb   = (rgb_valid_req == 1'b1) ? pix_data : 10'd0 ; 
endmodule
`timescale 1ns/1ns
module test_vga_ctrl ();
    reg                   sys_clk_50m ;
    reg                   sys_rst_n   ;
    reg     [15:00]       pix_data    ;

    wire                  vga_clk     ;
    wire                  locked      ;

    wire                  vga_rst_n   ;
    
    assign vga_rst_n = sys_rst_n && locked;

    wire                  hsync       ;
    wire                  vsync       ;
    wire    [ 9: 0]       pix_x       ;
    wire    [ 9: 0]       pix_y       ;
    wire    [15:00]       rgb         ;

pll_25m	pll_25m_inst (
	.areset             ( ~sys_rst_n   ),
	.inclk0             ( sys_clk_50m  ),
	.c0                 ( vga_clk      ),
	.locked             ( locked       )
);

vga_ctrl vga_ctrl_insert(
    .vga_clk            ( vga_clk  ) ,
    .vga_rst_n          ( vga_rst_n) ,
    .pix_data           ( pix_data ) ,

    .hsync              ( hsync    ) ,
    .vsync              ( vsync    ) ,
    .pix_x              ( pix_x    ) ,
    .pix_y              ( pix_y    ) ,
    .rgb                ( rgb      )      
); // 640X480@60

    parameter CYCLE = 20  ;
    initial begin
        sys_clk_50m    = 1'b1  ;
        sys_rst_n <= 1'b0  ;
        pix_data  <= 16'd0 ;
        #(CYCLE * 2)       ;
        sys_rst_n <= 1'b1  ;
        #(CYCLE * 10000)   ;
    end
    always #(CYCLE / 2) sys_clk_50m = ~sys_clk_50m ;
    // pix_data
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            pix_data <= 16'd0 ;
        end else begin
            if(pix_x >= 10'd0 && pix_x <= 10'd639 && pix_y >= 10'd0 && pix_y <= 10'd479) begin
                pix_data <= 16'hffff ;
            end else begin
                pix_data <= 16'd0 ;
            end
        end
    end
    // assign pix_data = (pix_x >= 10'd0 && pix_x <= 10'd639 && pix_y >= 10'd0 && pix_y <= 10'd479) ? 16'hffff : 16'd0 ; 

endmodule

 

坐标不重要。要让vga_rgb 和vga_valid时序对齐。

虽然横坐标看上去多了一个,但是vga_valid 和cnt_h (144 ~ 783)对齐了,那就是对的。

还差一个模块,明天写。 

数据产生模块:

 

module vga_pix (
    input           wire            vga_clk   ,
    input           wire            vga_rst_n ,
    input           wire    [9:0]   pix_x     ,
    input           wire    [9:0]   pix_y     ,

    output          reg     [15:0]  pix_data  
);
    // parameter   H_VALID = 10'd640 ,
    //             V_VALID = 10'd480 ;

    parameter   RED     = 16'hF800 ,
                ORANGE  = 16'hFC00 ,
                YELLOW  = 16'hFFe0 ,
                GREEN   = 16'h07e0 ,
                QING    = 16'h07FF ,
                BLUE    = 16'h001F ,
                PURPLE  = 16'hF81F ,
                BLACK   = 16'h0000 ,
                WHITE   = 16'hFFFF ,
                GRAY    = 16'hD69A ;

    // output signal
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            pix_data <= 10'h3ff ;
        end else begin // 有简便写法 ( H_VALID / 10 ) * n
            if((pix_x >= 10'd0) && (pix_x <= 10'd63))
                pix_data <= RED ;
            else 
            if((pix_x >= 10'd64) && (pix_x <= 10'd127))
                pix_data <= ORANGE ;
            else
            if((pix_x >= 10'd128) && (pix_x <= 10'd191))
                pix_data <= YELLOW ;
            else 
            if((pix_x >= 10'd192) && (pix_x <= 10'd255))
                pix_data <= GREEN ;
            else 
            if((pix_x >= 10'd256) && (pix_x <= 10'd319))
                pix_data <= QING ;
            else 
            if((pix_x >= 10'd320) && (pix_x <= 10'd383))
                pix_data <= BLUE ;
            else 
            if((pix_x >= 10'd384) && (pix_x <= 10'd447))
                pix_data <= PURPLE ;
            else 
            if((pix_x >= 10'd448) && (pix_x <= 10'd511))
                pix_data <= BLACK ;
            else 
            if((pix_x >= 10'd512) && (pix_x <= 10'd575))
                pix_data <= WHITE ;
            else 
            if((pix_x >= 10'd576) && (pix_x <= 10'd639))
                pix_data <= GRAY ;
            else 
                pix_data <= BLACK ;
        end
    end

endmodule 
`timescale 1ns/1ns
module test_top ();
    reg                 sys_clk   ;
    reg                 sys_rst_n ;

    wire    [15:00]     rgb   ;
    wire                hsync ;
    wire                vsync ;
top_vga top_vga_insert(
    .sys_clk                ( sys_clk    ) ,
    .sys_rst_n              ( sys_rst_n  ) ,

    .rgb                    ( rgb        ) ,
    .hsync                  ( hsync      ) ,
    .vsync                  ( vsync      ) 
);

    parameter CYCLE = 20  ;
    initial begin
        sys_clk    = 1'b1  ;
        sys_rst_n <= 1'b0  ;
        #(CYCLE * 2)       ;
        sys_rst_n <= 1'b1  ;
        #(CYCLE * 10000)   ;
    end
    always #(CYCLE / 2) sys_clk = ~sys_clk ;
endmodule

 

 

 修改一下,虽然从仿真结果上看,rgb赋值用这两个valid信号都是一样的。

但是从逻辑上看,确实要用 rgb_valid 赋值才是正确的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA project : VGA 的相关文章

  • FPGA设计篇之流水线思想

    FPGA设计篇之流水线思想 一 写在前面 二 正文开始 2 1举个栗子 2 2 1情况一 组合逻辑 2 1 2情况二 流水线设计 2 1 4 小总结 2 2举第二个栗子 写在最后 一 写在前面 流水线 大家好 我是富土康三号流水线的张全蛋
  • 各种FIFO硬件设计(FIFO概念、异步、同步、非2次幂深度FIFO)

    文章目录 一 FIFO概述 二 FIFO分类 三 FIFO重要信号与参数 3 1 信号 3 2 参数 3 2 1 data depth的确定 四 FIFO存储原理 五 同步FIFO 5 1 空满信号判断 5 2 同步FIFO源码 5 3 测
  • modelsim 关联 notepad++

    modelsim 控制窗口敲入 1 proc external editor filename linenumber exec I notepad notepad exe filename 2 set PrefSource altEdito
  • 【FPGA入门】第八篇、FPGA驱动VGA实现动态图像移动

    目录 第一部分 实现效果 第二部分 动态VGA显示的原理 1 将动态显示的区域提前进行赋值 2 图像块的移动是每张图片叠加后的效果 3 如何实现图像块位置的改变 第三部分 系统结构和驱动波形 1 系统的Top down结构 2 图像块移动的
  • PLL时钟约束

    方法 1 自动创建基时钟和 PLL 输出时钟 例 derive pll clocks 这一方法使您能够自动地约束 PLL 的输入和输出时钟 ALTPLL megafunction 中指定的 所有 PLL 参数都用于约束 PLL 的输入和输出
  • 【科普】波特率和比特速率的理解

    什么是波特率 单位时间内传输的码元个数称为波特率 单位为 Baud 那码元又是什么呢 码元又称为 符号 即 symbol 维基百科上对码元的解释 持续一段固定时间的通信信道有效状态就是码元 这么解释比较抽象 可以解释码元的物理意义 在通信信
  • Matlab 高斯信道下QPSK通带通信系统的简单仿真

    1 原理 2 仿真 3 总结反思 4 参考资料 1 原理 QPSK的具体内容请参考百度 QPSK的调制jie框图大致如下 QPSK信号可以采用正交调制的方式产生 如第一张图片的左半部分 I路信号与cos 信号相乘 Q 路信号与sin信号相乘
  • DEBUG:Generate Bitstream失败

    问题 约束失败 解决 确保IO初始化引脚正确 和选择合适的电平
  • SD卡读写实验(SPI模式)

    对于 SD 卡的 SPI 模式而言 采用的 SPI 的通信模式为模式 3 即 CPOL 1 CPHA 1 在 SD 卡 2 0 版 本协议中 SPI CLK 时钟频率可达 50Mhz SD 卡的 SPI 模式 只用到了 SDIO D3 SP
  • 手把手教你Modelsim仿真【2020.4版本】

    首先新建一个文件夹 test5 打开Modelsim 依次选择 File gt Change Directory 把目录选择到创建的 test5 文件夹 创建库 依次选择 File gt New gt Library 一般我们选择第三个 库
  • 笔试

    文章目录 前言 40 复位电路设计 1 recovery time和removal time 2 同步复位和异步复位 3 异步复位同步释放 本文参考 往期精彩 前言 嗨 今天来学习复位电路设计相关问题 微信关注 FPGA学习者 获取更多精彩
  • 握手2倍速率进,一倍速率出[verilog]

    module two to one parameter WORD LEN 33 input clk input arst input 2 WORD LEN 1 0 i din input i din valid output o din r
  • FPGA_时钟显示(时钟可调)

    1 实验说明 在数码管显示数据的基础上 让六位数码管显示数字时钟 并且通过按键可以对时间进行修改 实验目标 六位数码管分别显示时间的时分秒 且通过按键可实现加减调整时间及清零功能 key1 切换键 选择待调整的时间单位 时 分 秒 key2
  • 【数字IC】从零开始的Verilog SPI设计

    从零开始的Verilog SPI协议设计 一 写在前面 1 1 协议标准 1 2 数字IC组件代码 1 3 设计要求 1 4 其他协议解读 1 4 1 UART协议 1 4 2 SPI协议 1 4 3 I2C协议 1 4 4 AXI协议 二
  • 蓝桥杯真题:迷宫

    目录 题目描述 运行限制 dfs bfs 结果 题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 下图给出了一个迷宫的平面图 其中标记为 11 的为障碍 标记为 00 的为可以通行的地方 010000 000
  • 【FPGA多周期时序约束详解】- 解读FPGA多周期时序约束的全过程

    FPGA多周期时序约束详解 解读FPGA多周期时序约束的全过程 FPGA作为数字电路设计的常见工具 其设计中必然会遇到时序约束的问题 而多周期时序约束更是FPGA设计中不可避免的难点之一 本文将详细介绍FPGA多周期时序约束的全过程 并结合
  • 画时序图软件——TimeGen和Timing Designer下载

    在写实验报告的时候需要画波形图 但是手头没有很好的软件 就上网搜了一些 分享出来 这里分享的是TimeGen和Timing Designer两个软件 资源均来自网上 有侵权请联系 TimeGen使用和安装都比较简单 我发的应该里面有破解方法
  • [Verilog] Verilog 基本格式和语法

    主页 元存储博客 全文 3000 字 文章目录 1 声明格式 1 1 模块声明 1 2 输入输出声明 1 3 内部信号声明 1 4 内部逻辑声明
  • Matlab图像处理系列——图像复原之噪声模型仿真

    微信公众号上线 搜索公众号 小灰灰的FPGA 关注可获取相关源码 定期更新有关FPGA的项目以及开源项目源码 包括但不限于各类检测芯片驱动 低速接口驱动 高速接口驱动 数据信号处理 图像处理以及AXI总线等 本节目录 一 图像复原的模型 二
  • MINI-UTDE 10 BASE-T 集成控制器

    MINI UTDE 10 BASE T 集成控制器 MINI UTDE 10 BASE T 拥有多达三个本地I O板和远程I OS总线通信 为用户提供了一系列生产单元功能的单一控制点 包括诸如夹头 反馈器和辅助机器等外围生产设备 支持所有主

随机推荐

  • [LeetCode]235 二叉查找树的最近公共父亲节点

    Lowest Common Ancestor of a Binary Search Tree 二叉查找树的最近公共父亲节点 难度 Easy Given a binary search tree BST find the lowest com
  • 解决项目中出现问题 Cannot resolve com.xpand:starter-canal:0.0.1-SNAPSHOT

    解决方案 https www cnblogs com dalianpai p 14010753 html 亲测有效 编译通过 第一步 前往https github com chenqian56131 spring boot starter
  • Homebrew 更换国内源

    eval opt homebrew bin brew shellenv export HOMEBREW BREW GIT REMOTE https mirrors ustc edu cn brew git export HOMEBREW C
  • 【Spring】Feign客户端发送HTTPS请求绕过认证

    1 概述 转载 https www jianshu com p ea627708ab52 一个Spring Boot项目 为了使用Harbor仓库 起初通过Spring RestTemplate完成了对Harbor仓库的HTTPS请求 后想
  • 编程调节Win7/Win8系统音量的一种方法

    include
  • Cheat Engine使用教程

    系列文章目录 文章目录 系列文章目录 前言 一 解决办法 二 使用步骤 1 下载Cheat Engine 2 设置 前言 计算机硬盘不够用 但里面很多文件也舍不得删除 只有靠百度网盘来撑撑大小了 所以省吃俭用购买了百度会员 心疼每个月好几十
  • MPI_Bcast函数的用法

    程序功能 MPI Bcast函数用法 作成日期 2016 12 14 详细说明 include
  • AltiumDesigner如何绘制PCB封装

    AltiumDesigner如何绘制PCB封装 一 为什么要自己画PCB封装 当我们需要用的一些元器件PCB封装库中找不到的时候 我们就需要自己手动绘制一些元器件的PCB封装 当然也可以选择用相似的代替 但是在一些长场合中并不允许我们这样做
  • openwrt编译问题记录

    目录 1 git clone 速度太慢甚至断开连接 2 编译openwrt镜像make时发生错误 3 scripts feeds install a 时出现警告 1 git clone 速度太慢甚至断开连接 解决办法 在clone时将git
  • 如何显示文件后缀

    一 如何显示文件后缀 1 首先打开电脑上的本地磁盘D 2 然后点击组织 3 在弹出的窗口中点击文件夹和搜索 4 在弹出的窗口在点击查看 5 下拉滚动条 6 最后取消勾选隐藏已知文件类型的扩展名
  • 编程珠玑第三章习题5——英语中的连字符问题

    编程珠玑第三章习题5 英语中的连字符问题 问题 本问题将处理一小部分用连字符连接的英语单词方面的问题 下面的规则列表描述了一些以字母c结尾的单词的有效连字符连接 et ic al is tic s tic p tic lyt ic ot i
  • 使用Python语言实现凯撒密码的加密和解密

    使用Python语言实现凯撒密码的加密和解密 介绍 在密码学中 恺撒密码 英语 Caesar cipher 或称恺撒加密 恺撒变换 变换加密 是一种最简单且最广为人知的加密技术 它是一种替换加密的技术 明文中的所有字母都在字母表上向后 或向
  • Nginx配置https访问

    1 准备好证书和秘钥 如果是云服务器 可以到对应的云服务器上购买ssl证书 我这里是百度云 我以百度云为例子 直达链接 https console bce baidu com cas cas apply create 这个是免费1年的 可以
  • sql server数据库常见语句——增删查改

    一表数据增删查改 1 查询 select from 表名 select from test 2 新增 insert 表名 字段1 字段2 values 值1 值2 insert test a b values 1 2 3 修改 update
  • Meetup回顾|星策社区FeatureStore Meetup V2

    继2021年12月11日举办第一次Feature Store Meetup之后 星策开源社区于2022年4月10日举办了第二期 FeatureStore Meetup V2 本次活动邀请星策社区发起人 中国开源推进联盟副秘书长 开放原子基金
  • ADC外部RC电路电阻和电容选取计算方法

    ADC采样过程中遇到的问题 ADC是从模拟到数字世界的桥梁 当前ADC模块基本是MCU的标配 而且在转换速度和精度都有很好的表现 如NXP Kinetis KE15内部有2个16bit SAR型ADC模块 以精度制胜 可以配合EDMA完美实
  • vue实现音频audio列表循环,实现暂停播放切换

    功能界面如下 功能使用如下 首先根据后端返回的音频地址进行渲染 其中playAudioSrc字段用来控制暂停样式还是播放样式 audio进行隐藏 ul class virtualAvararFooterRightContentAudio l
  • vue局部注册指令和全局注册指令

    全局注册 1 目录下创建directive文件夹 然后下面就是各指令文件 还有一个总包括指令directive js 标识所有的指令都会引入到这里 import testA from testA import testB from test
  • STM32 CubeMx教程 -- 基础知识及配置使用教程

    文章目录 前言 一 STM32CubeMx 界面介绍 File 界面 Windows 界面 Help 界面 Updater Settings 界面 二 STM32CubeMx 使用教程 新建工程 配置RCC时钟参数 配置SYS参数 配置时钟
  • FPGA project : VGA

    module vga ctrl input wire vga clk input wire vga rst n input wire 15 00 pix data output wire hsync output wire vsync ou