当前位置: 首页 > wzjs >正文

湖南网站推广公司中国企业500强最新排名名单

湖南网站推广公司,中国企业500强最新排名名单,网站建设推进方案,昆明seo技术培训Quartus中使用Verilog实现 根据之前所学内容,打开Quartus 软件,新建FPGA项目文件,建立好空项目过后,选择Verilog HDL File,因为我们要使用Verilog代码实现仿真。 详细操作可参考往期博客: FPGA 实验报告&a…

Quartus中使用Verilog实现

根据之前所学内容,打开Quartus 软件,新建FPGA项目文件,建立好空项目过后,选择Verilog HDL File,因为我们要使用Verilog代码实现仿真。

详细操作可参考往期博客:

FPGA 实验报告:四位全加器与三八译码器仿真实现_quartus 四位二进制全加器-CSDN博客

然后输入以下代码:

代码展示

module led_flow #(parameter TIME_1S = 50_000_000)(  input               sys_clk     ,input               sys_rst_n   ,output  reg [5:0]   led         );reg     [25:0]      cnt     ;  wire                add_cnt ;wire                end_cnt ;reg     [2:0]       cnt1;wire                add_cnt1;wire                end_cnt1;// 时间基准计数器模块always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n) begincnt <= 26'b0;  // 修改为26位清零endelse if(add_cnt) beginif(end_cnt) begincnt <= 26'b0;  // 26位清零endelse begincnt <= cnt+1'b1;endendelse begincnt <= cnt;endend// LED状态计数器模块always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)begincnt1 <= 3'b0;endelse if(add_cnt1) beginif(end_cnt1)begincnt1 <= 3'b0;endelse begincnt1 <= cnt1 + 1'b1;endendend// LED控制逻辑模块always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)beginled <= 6'b0;  // 6位LED清零endelse begincase (cnt1)3'b000 : led <= 6'b000001;  // 6位LED的点亮顺序3'b001 : led <= 6'b000010;3'b010 : led <= 6'b000100;3'b011 : led <= 6'b001000;3'b100 : led <= 6'b010000;3'b101 : led <= 6'b100000;3'b110 : led <= 6'b000001;  // 循环回到第一个LEDdefault: led <= led;endcaseendend// 信号赋值模块assign add_cnt = 1'b1;assign end_cnt = add_cnt && cnt == TIME_1S - 1;  // 1秒的时间基准assign add_cnt1 = (cnt == TIME_1S-1);  assign end_cnt1 = add_cnt1 && cnt1 == 3'b110;  // 6个LED的状态计数器最大值endmodule

模块讲解

在上述代码中共有四个显著的模块,分别为

时间基准计数器模块

这部分实现了一个计数器,用于产生1秒的时间基准。在代码中定义了一个26位的寄存器cnt,用于存储计数值。当系统复位信号sys_rst_n为低电平时,计数器cnt被清零。

在每个时钟上升沿,如果add_cnt信号有效(始终为高电平),计数器cnt会增加。当计数器cnt达到TIME_1S - 1(即49,999,999)时,end_cnt信号有效,表示1秒的时间基准已到,计数器会清零并重新开始计数。

LED状态计数器模块:

这部分实现了一个计数器,用于控制6个LED的点亮顺序。在代码中定义了一个3位的寄存器cnt1,用于存储LED的状态计数值。

当系统复位信号sys_rst_n为低电平时,计数器cnt1被清零。

在每个时钟上升沿,如果add_cnt1信号有效(当时间基准计数器达到预设值时),计数器cnt1会增加。当计数器cnt1达到6(即3'b110)时,end_cnt1信号有效,表示LED状态计数器已到最大值,计数器会清零并重新开始计数。

LED控制逻辑模块:

这部分实现了控制6个LED灯的点亮顺序。当系统复位信号sys_rst_n为低电平时,所有LED被设置为熄灭状态。

根据LED状态计数器cnt1的值,控制6个LED灯的点亮顺序。使用case语句实现不同状态下的LED点亮模式。

当cnt1为3'b000时,点亮第一个LED(led[0])。

当cnt1为3'b001时,点亮第二个LED(led[1])。

依此类推,直到cnt1为3'b101时,点亮第六个LED(led[5])。

当cnt1为3'b110时,循环回到第一个LED,实现跑马灯效果。

信号赋值模块:

这部分实现了对控制信号进行赋值,用于协调计数器和LED控制逻辑的工作。

dd_cnt:始终为高电平(1'b1),表示时间基准计数器cnt始终在计数。

end_cnt:当时间基准计数器cnt达到TIME_1S - 1(即49,999,999)时,end_cnt信号有效,表示1秒的时间基准已到。

add_cnt1:当时间基准计数器cnt达到TIME_1S - 1时,add_cnt1信号有效,表示需要增加LED状态计数器cnt1的值。

end_cnt1:当LED状态计数器cnt1达到6(即3'b110)时,end_cnt1信号有效,表示LED状态计数器已到最大值,需要清零。

在这里要注意:module led_flow #(......)中,led_flow要和顶层模块名称相同,不然编译会出错。

运行与烧录

完成代码的copy过后,点击保存:

然后选择file文件,右键led.v将其设置为顶层文件;

点击Assignments',选择目录下的Pin Planner进行引脚分配;

随后进行烧录,详细烧录教程可以参考CSDN博客:

Nios实验入门——用Verilog编程方式完成LED流水灯显示并使用串口输出“Hello Nios-II”字符到笔记本电脑_verilog led灯-CSDN博客

运行效果截图:

VScode分模块化实现

vscode下载与汉化

首先下载VScode:code.visualstudio.com

在官网链接下载并成功安装过后,打开软件,根据操作,选择汉化扩展:

扩展下载

随后再下载两个扩展,实现FPGA的Verilog代码;

代码示例

随后根据我们的代码,用模块化设计实现,在这里分为top顶层模块(比如LedBlink.v)、分频模块(fenpin.v)、显示模块(display.v);

1、顶层模块 LedBlink.v

module LedBlink (input sys_clk,      // 系统时钟input sys_rst_n,    // 系统复位信号,低电平有效output reg [5:0] led // 6个LED输出);// 分频模块信号wire clk_1s; // 1秒时钟信号// 实例化分频模块fenpin #(.TIME_1S(50_000_000)) u_fenpin (.sys_clk(sys_clk),.sys_rst_n(sys_rst_n),.clk_out(clk_1s));// 实例化显示模块display u_display (.sys_clk(sys_clk),.sys_rst_n(sys_rst_n),.clk_1s(clk_1s),.led(led));endmodule

2、分频模块 fenpin.v

module fenpin #(parameter TIME_1S = 50_000_000 // 1秒的时间基准,假设系统时钟为50MHz)(input sys_clk,      // 系统时钟input sys_rst_n,    // 系统复位信号,低电平有效output reg clk_out  // 分频后的1秒时钟信号);reg [25:0] cnt; // 计数器,用于产生1秒的时间基准always @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n) begincnt <= 26'b0; // 复位时计数器清零clk_out <= 1'b0; // 分频时钟信号初始化endelse beginif (cnt == TIME_1S - 1) begincnt <= 26'b0; // 计数器达到预设值时清零clk_out <= ~clk_out; // 翻转分频时钟信号endelse begincnt <= cnt + 1'b1; // 计数器加1endendendendmodule

3、显示模块 display.v

module display (input sys_clk,      // 系统时钟input sys_rst_n,    // 系统复位信号,低电平有效input clk_1s,       // 1秒时钟信号output reg [5:0] led // 6个LED输出);reg [2:0] cnt1; // LED状态计数器always @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n) begincnt1 <= 3'b0; // 复位时计数器清零led <= 6'b0; // LED初始化为熄灭状态endelse if (clk_1s) begin // 在1秒时钟信号的上升沿更新LED状态case (cnt1)3'b000: led <= 6'b000001; // 点亮第一个LED3'b001: led <= 6'b000010; // 点亮第二个LED3'b010: led <= 6'b000100; // 点亮第三个LED3'b011: led <= 6'b001000; // 点亮第四个LED3'b100: led <= 6'b010000; // 点亮第五个LED3'b101: led <= 6'b100000; // 点亮第六个LED3'b110: beginled <= 6'b000001; // 循环回到第一个LEDcnt1 <= 3'b000; // 计数器清零enddefault: led <= led; // 默认情况保持当前状态endcaseif (cnt1 != 3'b110) begincnt1 <= cnt1 + 1'b1; // 计数器加1endendendendmodule

  分模块化设计能降低复杂度,让每个模块功能明确且简单,同时提高代码可读性和维护性,便于团队协作和后期功能扩展。它还能增强代码复用性,减少重复开发,通过清晰的模块接口和职责划分,使系统更灵活、更易调试和升级,从而提升整体设计质量和开发效率。

实验结果

fpga流水灯视频

总结与思考

  本次实验让我对FPGA开发有了更深入的理解和实践,不仅掌握了Verilog HDL编程的基本技巧,还学会了如何运用模块化设计思想将复杂系统分解为功能明确的模块,从而降低开发难度并提高代码的可维护性和复用性。在实验中遇到的问题,如顶层模块名称不匹配、信号连接错误以及时钟分频不准确等,通过仔细检查和逻辑分析得以解决,这个过程显著提升了我的问题解决能力。展望未来,我将继续深入学习FPGA的高级功能,探索其与物联网技术的结合点,并积极参与实际项目和竞赛,以积累更多经验,为未来的职业发展打下坚实基础。

http://www.dtcms.com/wzjs/808558.html

相关文章:

  • 开源wiki做网站国际交流网站平台有哪些
  • 行业网站开发运营方案公司网站制作应该注意些什么
  • 学校网站怎么做优化电子商务网站建设考试试题
  • 网站用什么系统好用免费做网站公司推荐
  • 手机端网站建设的注意事项网站切图怎么切
  • 个人网站 备案 类型网页制作教程图解
  • 房地产楼盘微信网站建设营销方案怎么用wordpress做模板
  • 信阳网站建设费用广州房产信息网官网
  • 做视频网站的方法在线生成logo设计
  • 整站优化该怎么做免费网站推广平台排行榜
  • 做网站的科技公司代理上海建站公司注册
  • 优良的网站邮箱服务器提供商isp万博法务网站建设项目
  • 网站记录ip 修改静态网站 站内搜索
  • 三 加强门户网站等新媒体建设斜杠青年seo工作室
  • 手机建立网站app用什么做网站 优化
  • php个人网站医院的 建设网站的策划书
  • 长沙做网站团队织梦模板库
  • 厦门 网站建设 闽icp赵公口网站建设
  • 郑州 手机网站站酷网素材图库排版
  • 自己的简历怎么制作网站兰州网站排名公司
  • 有没有好的网站wordpress 国内 慢
  • 外贸网站seo推广方案公司企业网站制作
  • 网站建设情况报告如何自己制作自己的网站
  • 网站建设解决方案有哪些成都建设网站多少钱
  • 注册个人网站要钱吗杭州定制网站开发
  • 网站建设填空题茂名手机网站建设公司名录
  • 网站建设需求信息做外贸找工厂货源网站
  • 网站外链隐形框架是什么重庆建网站价格表
  • 使用wordpress搭建网站网站建设与推广推荐
  • 做外贸国外网站网站设计建设公司排行