FPGA project : rom_vga_jump

news2024/12/28 3:30:21

只有vga_pix 模块代码与rom_vga不同,所以只上传了这个模块的代码与仿真代码。

 

// #define   BLACK     0x0000       //   黑色    
// #define   NAVY      0x000F       //    深蓝色  
// #define   DGREEN    0x03E0       //  深绿色  
// #define   DCYAN     0x03EF       //   深青色  
// #define   MAROON    0x7800       //   深红色      
// #define   PURPLE    0x780F       //   紫色  
// #define   OLIVE     0x7BE0       //   橄榄绿      
// #define   LGRAY     0xC618       //  灰白色
// #define   DGRAY     0x7BEF       //  深灰色      
// #define   BLUE      0x001F       //  蓝色    
// #define   GREEN     0x07E0       //  绿色          
// #define   CYAN      0x07FF       //  青色  
// #define   RED       0xF800       //  红色       
// #define   MAGENTA   0xF81F       //  品红    
// #define   YELLOW    0xFFE0       //  黄色        
// #define   WHITE     0xFFFF       //  白色  
// rgb 565
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          wire    [15:0]  pix_data  
);

    // parameter  
    parameter   PIC_SIZE= 14'd1_0000 ,
                H_PIC   = 10'd100  ,
                V_PIC   = 10'd100  ,
                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 ;

    // wire signal define
    wire            rden_w   ;
    wire    [13:0]  address_w;
    wire    [15:0]  data_pic ; // 图片的像素

    // reg signal define
    reg     [15:0]  data_pix; // 10 个彩条
	reg 	        rden    ; // 读使能信号超前图像数据一个时钟周期。
	reg 	[13:0]  address ; // 在读使能信号拉高,每个时钟周期自加一,0 ~ PIC_SIZE - 1
    reg             pic_vald; // 图片使能
    reg     [9:0]   x_move  ; // x轴方向的,偏移量
    reg             x_flag  ; // 为0 表示向右移动;为1 表示向左移动。
    reg     [9:0]   y_move  ;
    reg             y_flag  ; // 为0 表示向下移动;为1 表示向上移动。
    
    // reg     [15:0]  data_pix; // 10 个彩条
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            data_pix <= 10'h3ff ;
        end else begin // 有简便写法 ( H_VALID / 10 ) * n
            if((pix_y >= 10'd0) && (pix_y <= V_VALID / 10 - 1'b1))
                data_pix <= RED ;
            else 
            if((pix_y >= V_VALID / 10) && (pix_y <= (V_VALID / 10) * 2 - 1'b1))
                data_pix <= ORANGE ;
            else
            if((pix_y >= (V_VALID / 10) * 2) && (pix_y <= (V_VALID / 10) * 3 - 1'b1))
                data_pix <= YELLOW ;
            else 
            if((pix_y >= (V_VALID / 10) * 3) && (pix_y <= (V_VALID / 10) * 4 - 1'b1))
                data_pix <= GREEN ;
            else 
            if((pix_y >= (V_VALID / 10) * 4) && (pix_y <= (V_VALID / 10) * 5 - 1'b1))
                data_pix <= QING ;
            else 
            if((pix_y >= (V_VALID / 10) * 5) && (pix_y <= (V_VALID / 10) * 6 - 1'b1))
                data_pix <= BLUE ;
            else 
            if((pix_y >= (V_VALID / 10) * 6) && (pix_y <= (V_VALID / 10) * 7 - 1'b1))
                data_pix <= PURPLE ;
            else 
            if((pix_y >= (V_VALID / 10) * 7) && (pix_y <= (V_VALID / 10) * 8 - 1'b1))
                data_pix <= BLACK ;
            else 
            if((pix_y >= (V_VALID / 10) * 8) && (pix_y <= (V_VALID / 10) * 9 - 1'b1))
                data_pix <= WHITE ;
            else 
            if((pix_y >= (V_VALID / 10) * 9) && (pix_y <= V_VALID - 1'b1) )
                data_pix <= GRAY ;
            else 
                data_pix <= BLACK ;
        end
    end
	// reg 	        rden    ; 
    // wire         rden_w  ;
    always @(posedge vga_clk or negedge vga_rst_n) begin 
        if(~vga_rst_n) begin
            rden <= 1'b0 ;
        end else begin
            if(((pix_y >= y_move) && (pix_y <= (y_move + V_PIC - 1))) && ((pix_x >= x_move) && (pix_x <= (x_move + H_PIC - 1)))) begin
                rden <= 1'b1 ;
            end else begin
                rden <= 1'b0 ;
            end
        end
    end
    assign rden_w = rden ;
	// reg 	[13:0]  address ;
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            address <= 0 ;
        end else begin
            if(rden == 1'b1) begin
                if(address == PIC_SIZE - 1) begin
                    address <= 0 ;
                end else begin
                    address <= address + 1'b1 ;
                end
            end else begin
                address <= address ;
            end
        end
    end
    assign address_w = address ;
    // reg             pic_vald;
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            pic_vald <= 1'b0 ;
        end else begin
            pic_vald <= rden ;
        end
    end
    // reg     [9:0]   x_move  ;
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            x_move <= 10'd0 ;
        end else begin
            if(pix_x == H_VALID - 1 && x_flag == 1'b0 && pix_y == V_VALID - 1) begin
                x_move <= x_move + 1'b1 ;
            end else begin
                if(pix_x == H_VALID - 1 && x_flag == 1'b1 && pix_y == V_VALID - 1) begin
                    x_move <= x_move - 1'b1 ;
                end else begin
                    x_move <= x_move ;
                end
            end
        end
    end
    // reg             x_flag  ;
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            x_flag <= 1'b0 ;
        end else begin
            if((pix_x == H_VALID - 1 && pix_y == V_VALID - 10 && x_move == 538 && x_flag == 1'b0) || (pix_x == H_VALID - 1 && pix_y == V_VALID - 10 && x_move == 0 && x_flag == 1'b1)) begin
                x_flag <= ~x_flag ;
            end else begin
                x_flag <= x_flag ;
            end
        end
    end
    // reg     [9:0]   y_move  ;
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            y_move <= 10'd0 ;
        end else begin
            if(pix_x == H_VALID - 1 && y_flag == 1'b0 && pix_y == V_VALID - 1) begin
                y_move <= y_move + 1'b1 ;
            end else begin
                if(pix_x == H_VALID - 1 && y_flag == 1'b1 && pix_y == V_VALID - 1) begin
                    y_move <= y_move - 1'b1 ;
                end else begin
                    y_move <= y_move ;
                end
            end
        end
    end
    // reg             y_flag  ;
    always @(posedge vga_clk or negedge vga_rst_n) begin
        if(~vga_rst_n) begin
            y_flag <= 1'b0 ;
        end else begin
            if((pix_x == H_VALID - 1 && pix_y == V_VALID - 10 && x_move == 379 && y_flag == 1'b0) || (pix_x == H_VALID - 1 && pix_y == V_VALID - 10 && x_move == 0 && y_flag == 1'b1)) begin
                y_flag <= ~y_flag ;
            end else begin
                y_flag <= y_flag ;
            end
        end
    end
    // wire    [15:0]  data_pic;
/*****************output signal*******************************************/
    // reg     [15:0]  pix_data  
    assign pix_data = (pic_vald == 1'b1) ? data_pic : data_pix ;
/****************新增代码*******************/
rom_pic rom_pic_insert(
	.address        ( address_w ),
	.clock          ( vga_clk   ),
	.rden           ( rden_w    ),
	.q              ( data_pic  )
);

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

    wire    [15:00] rgb         ;
    wire            hsync       ;
    wire            vsync       ;


top top_insert(
    .sys_clk            ( sys_clk   ) ,
    .sys_rst_n          ( sys_rst_n ) ,

    .rgb                ( rgb       ) ,
    .hsync              ( hsync     ) ,
    .vsync              ( vsync     ) 
);
    defparam    top_insert.vga_pix_insert_top.H_VALID = 60   , 
                top_insert.vga_pix_insert_top.V_VALID = 50   , 
                top_insert.vga_pix_insert_top.H_PIC   = 10   , 
                top_insert.vga_pix_insert_top.V_PIC   = 10   , 
                top_insert.vga_pix_insert_top.PIC_SIZE= 100  ;


    defparam    top_insert.vga_ctrl_insert_top.H_SYNC  = 10'd2  , 
                top_insert.vga_ctrl_insert_top.H_BACK  = 10'd2  , 
                top_insert.vga_ctrl_insert_top.H_LEFT  = 10'd2  , 
                top_insert.vga_ctrl_insert_top.H_VALID = 10'd60 , 
                top_insert.vga_ctrl_insert_top.H_RIGHT = 10'd2  ,
                top_insert.vga_ctrl_insert_top.H_FORNT = 10'd2  , 
                top_insert.vga_ctrl_insert_top.H_TOTAL = 10'd70 ; 

    defparam    top_insert.vga_ctrl_insert_top.V_SYNC  = 10'd2  ,
                top_insert.vga_ctrl_insert_top.V_BACK  = 10'd2  ,
                top_insert.vga_ctrl_insert_top.V_TOP   = 10'd2  ,
                top_insert.vga_ctrl_insert_top.V_VALID = 10'd50 ,
                top_insert.vga_ctrl_insert_top.V_BOTTOM= 10'd2  ,
                top_insert.vga_ctrl_insert_top.V_FRONT = 10'd2  ,
                top_insert.vga_ctrl_insert_top.V_TOTAL = 10'd60 ;

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

endmodule

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1038090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux系统下安装Mysql

1、执行命令&#xff1a;rpm -qa | grep -i mysql&#xff0c;先查看系统之前是否有安装相关的rpm包&#xff0c;如果有&#xff0c;会显示类似下面的信息&#xff1b; 2、通过命令yum -y remove mysql-*  一次性删除系统上所有相关的rpm包&#xff0c;或者通过命令yum -y …

zemax显微镜设计

光学显微镜&#xff08;Optical Microscope&#xff0c;简写OM&#xff09;是利用光学原理&#xff0c;把人眼所不能分辨的微小物体放大成像&#xff0c;以供人们提取微细结构信息的光学仪器&#xff0c;第一架复式光学显微镜是于1665年由英国物理学家虎克制作。 首先做物镜 入…

(第三百篇BLOG记录)写于象牙终章与从零开始-20230924

启 由于若干原因&#xff08;包括但不限于紧锣密鼓的完成博士毕业的一系列实验和论文撰写、学习各种百花齐放的有意思的领域、完成人生身份的重大转变&#xff09;&#xff0c;导致卡在299篇博客已经很久了&#xff0c;不过算了一下还是在一个较长时间维度上可以基本保持每周一…

数据库——理论基础

目录 1.1 什么是数据库 1.2 数据库管理系统&#xff08;DBMS&#xff09; 1.3 数据库和文件系统的区别 1.4 数据库的发展史 1.5常见的数据库 1.5.1关系型数据库 1.5.2 非关系型数据库 1.6 DBMS支持的数据模型 1.1 什么是数据库 数据&#xff1a;描述事物的符号记录 数…

云计算中的关键技术——虚拟化

在数据中心里面&#xff0c;也有一种类似的开源技术 qemu-kvm&#xff0c;能让你在一台巨大的物理机里面&#xff0c;掏出一台台小的机器。这套软件就能解决上面的问题&#xff1a;一点就能创建&#xff0c;一点就能销毁。你想要多大就有多大&#xff0c;每次创建的系统还都是新…

Windows系统如何临时关闭“Windows安全中心实时保护”

前言 启动windows depender实时保护可能会使系统不太流畅&#xff0c;也可能会导致我们的程序无法正常运行&#xff0c;因为它会拦截或搜索我们的正常工作。 暂时关闭windows depender的实时保护对许多用户来说非常重要。 一、Win10系统关闭方法 打开Windows安全中心&#…

Spring面试题20:Spring怎样开启注解装配?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring怎样开启注解装配? 要在Spring中开启注解装配,需要进行以下几个步骤: 添加必要的依赖:在项目的构建工具(如Maven或Gradle)配置文件中…

【从0学习Solidity】34. ERC721

【从0学习Solidity】34. ERC721 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0c;探索全栈开…

详解MySQL存储引擎

前言: 📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。 😇😇😇有兴趣的话关注博主一起学习,一起进步吧! 一、MySQL存…

Redis学习笔记-003

Redis企业实战—基于Redis短信验证功能 文章目录 Redis企业实战---基于Redis短信验证功能一、短信登录实现1.1、导入[黑马点评项目](https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11)1.2、基于Session实现1.3、集群的session的共享问题1.4、基于Redis实现共享sessio…

【算法】排序——插入排序及希尔排序

目录 前言 一、排序的概念及其应用 1.1排序的概念 1.2排序的应用 1.3常见的排序算法 二、插入排序的实现 基于插入排序的优化——希尔排序&#xff08;缩小增量排序 个人主页 代码仓库 C语言专栏 初阶数据结构专栏 Linux专栏 LeetCode刷题 算法专栏 前言 这…

Tensorflow1架构内核和学习方法论

目录 概念简介 总体介绍 名词解释 疑问辨析 工程构建 代码生成 技术栈 模型类型 系统架构 分层架构 图控制 运行机制 会话机制 队列 运行模型 本地模式 分布式模式 技能方法论 发现领域模型 挖掘系统架构 细节是魔鬼 适可而止 发现她的美 形式化 独…

代码随想录算法训练营 60天总结

emmmm,总结怎么写呢。 暑假和高中一个同学聊天&#xff0c;因为都参加了蓝桥杯&#xff0c;我连省三也没有&#xff0c;同学竟然省一然后去北京参加国赛获得国三&#xff0c;就问问他学习编程的方法。他推荐我加入了知识星球里的代码随想录&#xff0c;里面有学习路线还有好多讨…

LVS: ambighouse pin count in file “xx“ but none has xx pins问题

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 一些foundry的standard cell的cdl没有衬底pin&#xff08;例如VNW VPW&#xff09;&#xff0c;如果pr过程中globalNetConnect 或者connect_pg_net把衬底pin接到power/ground n…

Qt5开发及实例V2.0-第二十二章-Qt.Quick Controls 2新颖界面开发

Qt5开发及实例V2.0-第二十二章-Qt.Quick Controls 2新颖界面开发 第22章 Qt Quick Controls 2新颖界面开发22.1 Qt Quick Controls 2简介22.1.1 第一个Qt Quick Controls 2程序22.1.2 Qt Quick Controls 2程序的构成 22.2 Qt Quick Controls 2与1的比较22.2.1 ApplicationWindo…

ElementUI实现登录注册+axios全局配置+CORS跨域

一、搭建项目 1.1 安装 Element-UI 先确保是否安装了vue-cli脚手架工具 !!! 安装vue脚手架可以看看我的上一篇博客 构建好项目后通过npm安装element-ui cd 项目根路径 #进入新建项目的根目录 npm install element-ui -S #安装…

MySQL简介以及安装和部署(Linux)

MySQL简介 MySQL是一个小型关系数据库管理系统&#xff0c;开发者为瑞典MySQL AB公司。在2008年1月16号被sun公司10亿美金收购。2009年&#xff0c;SUN又被Oracle以74亿美金收购。 目前MySQL被广泛地应用在Internet上的中小型网站中。由于体积小、速度快、总体拥有成本低&…

C#__简单使用TCP/UDP发送消息

Socket(套接字、插口) TCP和UCP的区别&#xff1a; 1、基于连接和无连接 2、对系统资源的要求&#xff08;TCP较多&#xff0c;UCP少&#xff09; 3、UDP程序结构简单 4、流模式和数据报模式 5、TCP保证数据正确性和数据先后顺…

【腾讯云国际站】CDN内容分发网络特性介绍

为什么使用腾讯云国际站 CDN 内容分发网络&#xff1f; 当用户直接访问源站中的静态内容时&#xff0c;可能面临的体验问题&#xff1a; 客户离服务器越远&#xff0c;访问速度越慢。客户数量越多&#xff0c;网络带宽费用越高。跨境用户访问体验较差。 腾讯云国际站CDN 如何改…

yum和vim工具的使用

目录 yum工具的使用 yum下载原理 软件的查找&下载&删除操作 查找lrzsz软件&#xff08;文件上传或者下载软件&#xff09; 下载lrzsz软件 删除lrzsz软件 vim工具的使用 vim命令模式 命令模式与光标相关的快捷键&#xff1a; 插入模式 底行模式 在本次的博客当中我们主要…