使用system verilog进行流水灯和VGA打印字符

使用system verilog进行流水灯和VGA打印字符

目录

  • **使用system verilog进行流水灯和VGA打印字符**
    • **system verilog的优点**
    • **VGA程序编写**
      • VGA 控制器模块
      • 字符生成模块
      • 顶层模块
      • 测试基准程序
      • **效果**
    • **流水灯程序设计**
      • **效果**
    • **总结**

system verilog的优点

面向对象编程:SystemVerilog 引入了面向对象的编程特性,如类(class)和继承,这有助于创建可重用的代码和设计模式。

增强的验证能力:SystemVerilog 支持断言(assertions)和覆盖率(coverage)分析,这些是验证复杂设计的关键工具。

并发建模:SystemVerilog 允许更自然地建模并发事件,通过使用 fork-join 语句来创建并行线程。

更丰富的数据类型:SystemVerilog 增加了多种数据类型,例如枚举(enum)、结构体(struct)、联合体(union)和数组,这些使得数据建模更加灵活和强大。

参数化编程:通过宏和参数化编程,SystemVerilog 允许更灵活的设计,可以更容易地创建可配置和可重用的设计组件。

改善的模块间连接:SystemVerilog 引入了接口(interface)的概念,简化了模块间的连接,并使得设计更加模块化。

更高级的建模能力:SystemVerilog 支持更高层次的抽象建模,有助于设计者在系统级别进行设计和验证。

随机化测试:SystemVerilog 支持随机化测试,可以自动生成测试向量,这有助于更全面地验证设计。

更有效的代码复用:通过封装和模块化,SystemVerilog 促进了代码的复用,提高了设计效率。

标准和兼容性:SystemVerilog 作为 IEEE 标准的一部分,确保了设计和验证方法的兼容性和标准化。

VGA程序编写

VGA 控制器模块

首先是 VGA 控制器模块,负责生成 VGA 信号和像素坐标。

module VGAController (
  input logic clk,      // 时钟
  input logic reset,    // 复位
  output logic hsync,   // 水平同步信号
  output logic vsync,   // 垂直同步信号
  output logic [9:0] pixelX,  // 像素 X 坐标
  output logic [9:0] pixelY,  // 像素 Y 坐标
  output logic displayOn       // 是否显示像素
);
  // VGA 时序参数
  parameter H_VISIBLE_AREA = 640;
  parameter H_FRONT_PORCH = 16;
  parameter H_SYNC_PULSE = 96;
  parameter H_BACK_PORCH = 48;
  parameter H_TOTAL = H_VISIBLE_AREA + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;

  parameter V_VISIBLE_AREA = 480;
  parameter V_FRONT_PORCH = 10;
  parameter V_SYNC_PULSE = 2;
  parameter V_BACK_PORCH = 33;
  parameter V_TOTAL = V_VISIBLE_AREA + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;

  // 水平和垂直计数器
  logic [9:0] hCounter;
  logic [9:0] vCounter;

  // 水平计数器更新
  always_ff @(posedge clk or posedge reset) begin
    if (reset) begin
      hCounter <= 0;
      vCounter <= 0;
    end else begin
      if (hCounter == H_TOTAL - 1) begin
        hCounter <= 0;
        if (vCounter == V_TOTAL - 1) begin
          vCounter <= 0;
        end else begin
          vCounter <= vCounter + 1;
        end
      end else begin
        hCounter <= hCounter + 1;
      end
    end
  end

  // 生成同步信号
  assign hsync = !(hCounter >= H_VISIBLE_AREA + H_FRONT_PORCH && hCounter < H_VISIBLE_AREA + H_FRONT_PORCH + H_SYNC_PULSE);
  assign vsync = !(vCounter >= V_VISIBLE_AREA + V_FRONT_PORCH && vCounter < V_VISIBLE_AREA + V_FRONT_PORCH + V_SYNC_PULSE);

  // 输出像素坐标和显示信号
  assign pixelX = hCounter;
  assign pixelY = vCounter;
  assign displayOn = (hCounter < H_VISIBLE_AREA) && (vCounter < V_VISIBLE_AREA);
endmodule

字符生成模块

接下来是字符生成模块,根据像素坐标生成 “你好FPGA” 字符。

module CharGen (
  input logic clk,          // 时钟
  input logic reset,        // 复位
  input logic [9:0] pixelX, // 像素 X 坐标
  input logic [9:0] pixelY, // 像素 Y 坐标
  input logic displayOn,    // 是否显示像素
  output logic [3:0] red,   // 红色分量
  output logic [3:0] green, // 绿色分量
  output logic [3:0] blue   // 蓝色分量
);
  // 字符映射表,可以通过像素坐标获取相应的像素值
  reg [63:0] charMap [0:6] = '{64'h7C121212127C00, 64'h42427E424200, 64'h7E0909090000, 64'h7E0909090600, 64'h3E414949493200, 64'h7E09097E0000, 64'h00000000000000};

  // 计算字符索引和像素在字符中的位置
  reg [3:0] charIndex;
  reg [2:0] charRow, charCol;
  reg [2:0] pixelXInChar, pixelYInChar;
  reg charPixel;

  always_ff @(posedge clk or posedge reset) begin
    if (reset) begin
      charIndex <= 0;
      charRow <= 0;
      charCol <= 0;
      pixelXInChar <= 0;
      pixelYInChar <= 0;
      charPixel <= 0;
    end else begin
      // 计算当前字符索引
      charCol <= pixelX / 8;
      charRow <= pixelY / 12;
      charIndex <= charCol + (charRow * 8);

      // 计算像素在字符中的位置
      pixelXInChar <= pixelX % 8;
      pixelYInChar <= pixelY % 12;

      // 获取当前像素值
      charPixel <= (charMap[charIndex])[63 - (pixelYInChar * 8 + pixelXInChar)];
    end
  end

  // 生成 RGB 信号
  always_comb begin
    case (charPixel)
      1'b0: begin
        red = 4'h0;
        green = 4'h0;
        blue = 4'h0;
      end
      1'b1: begin
        red = 4'hF;
        green = 4'hF;
        blue = 4'hF;
      end
      default: begin
        red = 4'h0;
        green = 4'h0;
        blue = 4'h0;
      end
    endcase
  end
endmodule

顶层模块

以下是顶层模块,将 VGA 控制器和字符生成模块结合在一起,并输出到开发板上。

module Top (
  input logic clk,   // 时钟
  input logic reset, // 复位
  output logic [3:0] red,     // 红色信号
  output logic [3:0] green,   // 绿色信号
  output logic [3:0] blue,    // 蓝色信号
  output logic hsync,         // 水平同步信号
  output logic vsync          // 垂直同步信号
);
  // 实例化 VGA 控制器和字符生成模块
  VGAController vgaController (
    .clk(clk),
    .reset(reset),
    .hsync(hsync),
    .vsync(vsync),
    .pixelX(pixelX),
    .pixelY(pixelY),
    .displayOn(displayOn)
  );

  CharGen charGen (
    .clk(clk),
    .reset(reset),
    .pixelX(pixelX),
    .pixelY(pixelY),
    .displayOn(displayOn),
    .red(red),
    .green(green),
    .blue(blue)
  );

endmodule

测试基准程序

最后是测试基准程序,用于测试顶层模块的功能。

module Top_tb;

  // 时钟和复位信号
  logic clk;
  logic reset;

  // VGA 控制器和字符生成模块的信号
  logic hsync;
  logic vsync;
  logic [9:0] pixelX;
  logic [9:0] pixelY;
  logic displayOn;
  logic [3:0] red;
  logic [3:0] green;
  logic [3:0] blue;

  // 实例化被测试的模块
  Top dut (
    .clk(clk),
    .reset(reset),
    .hsync(hsync),
    .vsync(vsync),
    .red(red),
    .green(green),
    .blue(blue)
  );

  // 时钟生成
  always #5 clk = ~clk;

  // 复位信号生成
  initial begin
    reset = 1;
    #10;
    reset = 0;
    #10000;
    $finish;
  end

  // 输出测试结果
  always @(posedge clk) begin
    $display("hsync: %b, vsync: %b, red: %h, green: %h, blue: %h", hsync, vsync, red, green, blue);
  end

endmodule

效果

在这里插入图片描述

流水灯程序设计

流水灯模块

module LED(
    input clk,
    input rst_n,  // _n低电平有效
    output logic [3:0] led
);

// 1.5s计数器
logic [27:0] cnt;
parameter int TIME_1_5S = 75_000_000;
// 由于cnt已经声明为logic类型,不需要额外的信号声明
 logic add_cnt;
 logic end_cnt;

// 赋值语句不需要阻塞赋值的begin-end结构
always_ff @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        cnt <= 28'd0;
    end else if (add_cnt) begin
        if (end_cnt) begin
            cnt <= 28'd0;
        end else begin
            cnt <= cnt + 1;
        end
    end
end

// 使用always_comb声明组合逻辑
always_comb begin
    add_cnt = 1'b1;
    end_cnt = add_cnt && cnt == (TIME_1_5S - 1);
end

// 拼接法控制LED
always_ff @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        led <= 4'b1110;
    end else if (end_cnt) begin
        led <= {led[2:0], led[3]}; // 流水灯
    end
end

endmodule

顶层模块设计

`timescale 1ns/1ns
module     LED_tb();

reg   tb_clk;
reg   tb_rst_n;
wire  [3:0]tb_led;


LED #(.TIME_1_5S(750))           inst_LED(
   .clk      (tb_clk     ) ,
   .rst_n    (tb_rst_n   ) ,
   .led      (tb_led )   
);
            parameter cycle =20 ;//时钟周期为20ns
            always#(cycle/2)tb_clk=~tb_clk;//过时钟周期一半取反

        initial begin
            tb_clk=1'b0;
            tb_rst_n=1'b0;
            #(cycle*3);
            tb_rst_n=1'b1;
            #(cycle*751*16);
            $stop;
        end

endmodule

效果

在这里插入图片描述

在这里插入图片描述

总结

这次对system verilog的编写让我对system verilog有了清晰的认识。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# WinForm —— 27 28 29 30 ListView 介绍与应用

1. 简介 和ListBox的外观类似&#xff0c;都可以多列显示&#xff0c;但 ListView 功能更强大&#xff0c;提供了5种不同的显示方式 2. 属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到Enabled控件是否启用CheckBoxes复选框是否显示在项旁边ContextMenuStri…

浏览器渲染优--防抖节流懒加载

合理选择css选择器 相比于.content-title-span&#xff0c;使用.content .title span时&#xff0c;浏览器计算样式所要花费的时间更多。使用后面一种规则&#xff0c;浏览器必须遍历页面上所有 span 元素&#xff0c;先过滤掉祖先元素不是.title的&#xff0c;再过滤掉.title…

拿笔记下来!产品采购制造类合同怎样写比较稳妥?

拿笔记下来&#xff01;产品采购制造类合同怎样写比较稳妥&#xff1f; 近日&#xff0c;几经波折&#xff0c;泰中两国终于完成了潜艇采购谈判&#xff01;你知道吗&#xff1f;产品制造类合同或协议在起草前如果没有充分考虑各种因素&#xff0c;可能会导致一系列问题和不利…

奶茶店、女装店、餐饮店是高危创业方向,原因如下:

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 现在的俊男靓女们&#xff0c;心中都有一个执念&#xff1a; (1)想证明自己了&#xff0c;开个奶茶去…… (2)想多赚点钱了&#xff0c;加盟餐饮店去…… (3)工作不顺心了&#xff0c;搞个女装店去…… 但凡抱着…

【scau数据库实验一】mysql_navicat_数据库定义实验、基本命令

实验一开始之前&#xff0c;如果还有不会使用navicat建议花五分钟补课哦~ 补课地址&#xff1a;【scau数据库实验先导】mysql_navicat_数据库新建、navicat的使用-CSDN博客 实验目的&#xff1a; 理解和掌握数据库DDL语言&#xff0c;能够熟练地使用SQL DDL语句创建、修改和删…

mac电脑用谷歌浏览器对安卓手机H5页面进行inspect

1、mac上在谷歌浏览器上输入 chrome://inspect 并打开该页面。 2、连接安卓手机到Mac电脑&#xff1a;使用USB数据线将安卓手机连接到Mac电脑。 3、手机上打开要的h5页面 Webview下面选择要的页面&#xff0c;点击inspect&#xff0c;就能像谷歌浏览器页面打开下面的页面&#…

Vue——初识组件

文章目录 前言页面的构成何为组件编写组件组件嵌套注册 效果展示 前言 在官方文档中&#xff0c;对组件的知识点做了一个很全面的说明。本篇博客主要写一个自己的案例讲解。 vue 官方文档 组件基础 页面的构成 说到组件之前&#xff0c;先大致说明下vue中页面的构成要素。 在…

Claude 3可使用第三方API,实现业务流程自动化

5月31日&#xff0c;著名大模型平台Anthropic宣布&#xff0c;Claude3模型可以使用第三方API和工具。 这也就是说&#xff0c;用户通过文本提问的方式就能让Claude自动执行多种任务&#xff0c;例如&#xff0c;从发票中自动提取姓名、日期、金额等&#xff0c;该功能对于开发…

【问题随记】System policy prevents Wi-Fi scans,解决连接 WIFI 需要权限的问题

问题随记 System policy prevents Wi-Fi scans&#xff0c;每次打开我的开发板连接 wifi 都会出现下面的弹窗&#xff0c;这也阻挡了我的WIFI自动连接&#xff0c;然后就需要连上屏幕&#xff0c;输入 wifi 密码&#xff0c;这样才能进行 VNC、SSH 等一系列的连接。 问题解决 …

『 Linux 』缓冲区(万字)

文章目录 &#x1f9a6; 什么是缓冲区&#x1f9a6; 格式化输入/输出&#x1f9a6; 刷新策略&#x1fab6; 块缓冲(fully buffered)&#x1fab6; 无缓冲(unbuffered)&#x1fab6; 行缓冲(line buffered) &#x1f9a6; 现象解释&#x1f9a6; exit()与_exit()&#x1f9a6; 进…

CPU 使用率过高问题排查

文章目录 CPU 使用率过高问题排查1. CPU使用率过高常见问题2. 压力测试2.1 stress安装参数说明测试示例 2.2 stress-ng安装参数说明测试示例 3. 问题排查3.1 使用 top 命令3.2 使用 ps 命令3.3 使用 perf top3.4 vmstat 命令常用信息内存信息磁盘信息 CPU 使用率过高问题排查 …

Plotting World Map in Python

1. 方法一 pygal Plotting World Map Using Pygal in Python import pygal # create a world map worldmap pygal.maps.world.SupranationalWorld() # set the title of map worldmap.title Continents# adding the continents worldmap.add(Africa, [(africa)]) worl…

【微信小程序】小锦哥小程序工具 v2.3.8.0

# 简介 小锦哥小程序工具是一款可以对微信小程序进行解密或者反编译的工具&#xff0c;通过这款工具&#xff0c;可以对别人已经发布的小程序进行解密或者是反编译&#xff0c;然后查看源代码。对于网络安全人员来说&#xff0c;可以使用该工具进行安全审计&#xff0c;发现其…

四川汇聚荣聚荣科技有限公司评价怎么样?

四川汇聚荣聚荣科技有限公司评价如何?在科技日新月异的今天&#xff0c;四川汇聚荣聚荣科技有限公司作为业界的一员&#xff0c;其表现自然引起了广泛关注。那么&#xff0c;这家公司究竟如何呢?接下来&#xff0c;我们将从四个不同方面对其进行深入剖析。 一、技术实力 四川…

3DGS语义分割之LangSplat

LangSplat是CVPR2024的paper. 实现3DGS的语义分割&#xff08;可文本检索语义&#xff09; github: https://github.com/minghanqin/LangSplat?tabreadme-ov-file 主要思想是在3DGS中加入了CLIP的降维语义特征&#xff0c;可用文本检索目标&#xff0c;实现分割。 配置环境&…

三十四、openlayers官网示例Dynamic clusters解析——动态的聚合图层

官网demo地址&#xff1a; https://openlayers.org/en/latest/examples/clusters-dynamic.html 这篇绘制了多个聚合图层。 先初始化地图 &#xff0c;设置了地图视角的边界extent&#xff0c;限制了地图缩放的范围 initMap() {const raster new TileLayer({source: new XYZ…

导入和使用标准模块

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;自带了很多实用的模块&#xff0c;称为标准模块&#xff08;也可以称为标准库&#xff09;&#xff0c;对于标准模块&#xf…

韩顺平0基础学java——第15天

p303-326 重写override 和重载做个对比 注&#xff1a;但子类可以扩大范围&#xff0c;比如父类是protected&#xff0c;子类可以是public 多态 方法或对象具有多种形态&#xff0c;是面向对象的第三大特征&#xff0c;多态是建立在封装和继承基础之上的。 多态的具体体现…

Ubuntu server 24 (Linux) 安装部署smartdns 搭建智能DNS服务器

SmartDNS是推荐本地运行的DNS服务器&#xff0c;SmartDNS接受本地客户端的DNS查询请求&#xff0c;从多个上游DNS服务器获取DNS查询结果&#xff0c;并将访问速度最快的结果返回给客户端&#xff0c;提高网络访问速度和准确性。 支持指定域名IP地址&#xff0c;达到禁止过滤的效…

【YOLOv5/v7改进系列】引入ODConv——即插即用的卷积块

一、导言 提出了一种称为全维度动态卷积(ODConv)的新颖设计&#xff0c;旨在克服当前动态卷积方法的局限性并提升卷积神经网络(CNN)的性能。以下是该论文提出的全维度动态卷积设计的优点和存在的缺点分析&#xff1a; 优点&#xff1a; 增强特征学习能力&#xff1a; ODConv通…