自定义seg_decoder组件并创建Nios系统(一)

news2024/9/22 9:47:20

前面进行了数码管的显示
对Avalon总线协议进行了大概的学习


那么就可以

将数码管译码器模块封装成符合Avalon-MM接口的组件
创建一个基于Nios Ⅱ处理器的系统

将数码管译码器组件添加至该系统中

通过用户应用程序控制数码管显示字符0~F

本文同数码管显示一样并不是完整项目,仅此作为参考

1. 自定义seg_decoder组件

seg7_decoder_top.v


/*******************************************************************************
功能:
    带有Avalon-MM接口的七段数码管译码器IP
接口:
    avs_address:    七段数码管索引,如0指示第一个七段数码管,1指示第二个七段数码管
    avs_write:      指示主机向该IP进行写传输
    avs_writedata:  写入数据,并显示在七段数码管(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f)
    avs_read:       指示主机向该IP进行读传输
    avs_readdata:   读取七段数码管上显示的数据(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f)
参数:
    SEG7_NUM: 
        七段数码管的个数,默认值为8
    ADDR_WIDTH: 
        log2(SEG7_NUM),默认值为3
    DEFAULT_VALUE:
        复位后所有的七段数码管显示状态
        1: 默认值,将所有七段数码管点亮,即显示8
        0: 将所有七段数码管显示0
    LOW_ACTIVE: 
        1: 共阳数码管,即低电平点亮数码管 
        0: 共阴数码管,即高电平点亮数码管
******************************************************************************/

module seg7_decoder_top #(
    parameter   SEG7_NUM        =   8,
    parameter   ADDR_WIDTH      =   3,
    parameter   DEFAULT_VALUE   =   1,
    parameter   LOW_ACTIVE      =   1
) ( 
    //===== Avalon MM slave (read/write)接口
    input                           clk,                  //时钟信号
    input                           reset_n, 				 //复位信号
    input       [(ADDR_WIDTH-1):0]  avs_address,			 //Avalon Slave地址信号
    input                           avs_write,				 //Avalon Slave写请求信号
    input       [7:0]               avs_writedata,			 //Avalon Slave写数据
    input                           avs_read,				 //Avalon Slave读请求信号
    output  reg [7:0]               avs_readdata,			 //Avalon Slave读数据
    
    //===== Avalon MM to export (conduit接口)
    output      [(SEG7_NUM*8-1):0]  seg7                  //驱动七段数码管显示的数据
);
            
// wires/regs变量声明
reg     [7:0]               reg_file     [(SEG7_NUM-1):0];//定义了SEG7_NUM个八位寄存器,每个寄存器存储一个数码管上显示的字符
wire    [(SEG7_NUM*8-1):0]  dis_hex0to7;


// Avalon-MM slave 读写操作
always@(posedge clk) begin                                //复位,依次判断每个数码管的状态
    if(~reset_n) begin
        integer i;
        for(i = 0; i < SEG7_NUM; i = i + 1) begin         //将所有数码管都点亮,即所有数码管都显示“8”
            reg_file[i] <= (DEFAULT_VALUE) ? 8'h8 : 8'h0;
        end
    end
    else if(avs_write)                                    //当写请求信号有效
        reg_file[avs_address] <= avs_writedata;           //进行写操作,Avalon MM Slave接口的写数据avs_writedata将回存储到地址为avs_address的寄存器中
    else if(avs_read)                                     //当读请求信号有效
        avs_readdata <= reg_file[avs_address];            //进行读操作,会将地址为avs_address的寄存器中的数据读取值avs_readdata
end

// 七段数码管译码电路,写入数据avs_writedata为十六进制数字,需要进行译码才能驱动七段数码管电路
generate                                                  //使用generate-endgenerate减少代码重复
    genvar m;                                             //SEG7_NUM个七段数码管的译码电路
    for(m = 0; m < SEG7_NUM; m = m + 1) begin: hex_decoder_x8
        decod7seg hexm(
            .hex     (reg_file[m]),                       //译码器电路的输入为写入到寄存器reg_file中的数据
            .display (dis_hex0to7[8*m+7:8*m])             //经过译码后输出驱动七段数码管电路
        );
    end
endgenerate

assign seg7 = (LOW_ACTIVE) ? dis_hex0to7 : ~dis_hex0to7;  //判断是共阳数码管还是共阴数码管,然后驱动数码管


endmodule

decod7seg.v

module decod7seg (
    input       [3:0]   hex,
    output  reg [6:0]   display
);

/*
 *       0  
 *      ---  
 *     |   |
 *    5|   |1
 *     | 6 |
 *      ---  
 *     |   |
 *    4|   |2
 *     |   |
 *      ---  
 *       3  
 */
always @ (hex)
    case (hex)
        4'h0: display = 7'b1000000;
        4'h1: display = 7'b1111001;
        4'h2: display = 7'b0100100;
        4'h3: display = 7'b0110000;
        4'h4: display = 7'b0011001;
        4'h5: display = 7'b0010010;
        4'h6: display = 7'b0000010;
        4'h7: display = 7'b1111000;
        4'h8: display = 7'b0000000;
        4'h9: display = 7'b0011000;
        4'hA: display = 7'b0001000;
        4'hB: display = 7'b0000011;
        4'hC: display = 7'b1000110;
        4'hD: display = 7'b0100001;
        4'hE: display = 7'b0000110;
        4'hF: display = 7'b0001110;
    endcase

endmodule

 2.Platform Designer创建组件

Platform Designer是Nios Ⅱ软核处理器的开发工具,用于实现Nios Ⅱ系统配置、生成以及Nios Ⅱ系统相关的监控和软件调试平台的生成

(1)首先打开Quartus工具栏Tool->Platform Designer,选择左上角New Component,打开Component工具填写组件信息

(2)组件信息填写完后,点Files->Add File,选中seg7_decoder_top.v和decod7seg.v,将其添加到Synthesis Files中

点击 seg7_decoder_top.v文件的no attributes,选中弹出窗口中的Top-level File,将其设为顶层文件,然后点击Analyze Synthesis Files分析综合

 可以看到在跳出的提示框中显示成功(如果有错说明添加的Verilog文件有错误,如语法错误)

但完成分析综合后的Messages窗口会报错,这是因为有一些参数没有设置

 首先在Parameters中确保定能Verilog模块中声明的四个参数都Editable都是勾选的

在Signals & Interfaces中,左侧的Name栏显示的是分析综合时,根据信号名自动对信号进行了分组,但这样的分组不一定正确,因此要逐一设置

首先设置clk和reset_n

 点击avalon_slave_0,将Associated Clock设置为clock, Associated Reset设置为reset 

 然后依次设置ava_adderess、ava_read、ava_write、ava_writedata

 然后右键点击seg7[64],选择remove,报错全部解决

然后点击add interface,选择conduit

 

 最后点击下面的finish并保存,seg7_decoder组件创建完毕,可以在Platform Designer中看到创建的组件

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

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

相关文章

JavaWeb_瑞吉外卖_项目优化Day12-前后端分离

JavaWeb_瑞吉外卖_项目优化Day12-前后端分离 前后端分离开发介绍开发流程前端技术栈 YapiSwagger介绍使用方式常用注解 项目部署部署架构部署环境说明部署前端项目部署后端项目 来源 前后端分离开发 介绍 开发流程 前端技术栈 开发工具 Visual Studio Codehbuilder 技术框架 …

【全栈开发指南】VUE前端路由设计及配置

我们在使用Vue.js时&#xff0c;创建单页面应用一定会用到路由&#xff0c;Vue Router 是 Vue.js 官方的路由管理器&#xff0c;我们在开发框架中过程中&#xff0c;需要结合Vue Router路由管理器提供的功能&#xff0c;设计和实现系统中菜单的配置。 一、实现原理 一级菜单r…

idea创建webapp文件夹

结果的图片&#xff1a; 第一步&#xff1a; file-》project structure 第二步&#xff1a; 修改路径&#xff0c;点击右侧“Deloyment descriptors”下面的笔进行修改。 // 增加了src\main // web修改为了webapp C:\Users\www12\Desktop\huwantiku2\src\main\webapp\WEB-IN…

计算机图形学 3D 渲染 笔记(二)

一、阴影 判断一个点是否被遮住&#xff0c;可以从该点像光源方向发射射线&#xff08;P tL&#xff09;&#xff0c;若射线被与物体发生相交&#xff0c;则说明它在阴影中。而这个物体由于要在 P 和 光源之间&#xff0c;在方向光场景下&#xff0c; t 的取值范围是 0 < …

vue3+vite+Ts 基于Antv/x6 绘制流程图

需求效果&#xff1a; 需求&#xff1a; 实现一个流程图&#xff0c;双击可对相应的组件进行一些功能操作&#xff1b; 工具栈&#xff1a; 这里使用antv/x6&#xff0c; 基于vue3vitets进行开发 官网地址&#xff1a; https://x6.antv.antgroup.com/examples/showcase/pra…

港联证券|dmi指标的用法和实战技巧?

DMI指标是一种技术分析工具&#xff0c;可用于评估股票、期货和外汇市场的趋势强度。DMI指标由三条线组成&#xff0c;分别是DI&#xff08;上升方向指标&#xff09;、-DI&#xff08;下降方向指标&#xff09;和ADX&#xff08;平均趋向指数&#xff09;。在使用DMI指标之前&…

Unity DOTS纯ECS实现虚拟摇杆Joystick控制角色移动

上篇已经实现了ECS框架下的IBeginDragHandler、IDragHandler、IEndDragHandler这几个拖动事件&#xff0c;使得可以任意给ECS框架下的UI(2D entity)响应拖动事件。本篇分享下在前篇实现的功能的基础上再实现一个常用的摇杆控制角色移动的功能。 需要注意的一点&#xff0c;目前…

[数据分析与可视化] 基于matplotlib和plottable库绘制精美表格

plottable是一个Python库&#xff0c;用于在matplotlib中绘制精美定制的图形表格。plottable的官方仓库地址为&#xff1a;plottable。本文主要参考其官方文档&#xff0c;plottable的官方文档地址为&#xff1a;plottable-doc。plottable安装命令如下&#xff1a; pip install…

猿人web学刷题18

1.第十八题 jsvmp - 猿人学 问题: 1.第一页请求正常能返回数据 2.第二页开始之后出现{"error": "Unexpected token/Validation failed"} 分析&#xff1a; 1.第二页开始&#xff0c;有带加密参数&#xff0c;直接重发请求无果&#xff0c;应该带了时间戳…

尚硅谷Docker实战教程-笔记11【高级篇,Docker网络】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷Docker实战教程&#xff08;docker教程天花板&#xff09;_哔哩哔哩_bilibili 尚硅谷Docker实战教程-笔记01【基础篇&#xff0c;Docker理念简介、官网介绍、平台入门图解、平台架构图解】…

盛格塾暑期公益课程《学活LINUX》

学习LINUX有很多种方法&#xff0c;本系列课程以动手试验为主&#xff0c;取一个活的LINUX系统&#xff08;GDK8&#xff09;作为目标&#xff0c;使用内核调试器&#xff08;挥码枪&#xff09;将其中断到调试器&#xff0c;在调试器的帮助下&#xff0c;观察调用过程、执行现…

【1++的Linux】之基础开发工具

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;Linux软件包管理管理器二&#xff0c;Linux编辑器--vim2.1 什么是vim2.2 vim的基本操作 三&#xff0c;gcc的使用四&#xff0c;gdb的使用五&#xff0c;项目…

课时7:Trustzone基础知识

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:Secureboot从入门到精通-[目录] 👈👈👈目录 Trustzone安全扩展双系统架构Trustone架构多方位支持的安全

探索Gradio库中的Textbox模块及其强大功能

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

作用域、垃圾回收机制、闭包、构造函数

作用域 作用域规定了变量能够被访问的 ‘范围’&#xff0c;离开了这个范围变量便不能被访问 分为&#xff1a; 局部作用域 函数作用域块级作用域 let/const 全局作用域 作用域链 嵌套关系的作用域串联起来形成了作用域链 作用:作用域链本质上是底层的变量的查找机制 函…

简写MKL库windows安装以及python如何调用dll库

MKL安装: 最新MKL库下载地址 Donwload: Accelerate Fast Math with Intel oneAPI Math Kernel Library 64位以及32位我直接都安装了 之后配置各种包含目录以及环境变量&#xff1a;网上有很多配置vs的配置教程&#xff0c;这里就不贴了。 &#xff08;ps: 2023 在vs2019上&a…

nodejs高级编程-核心模块

一、path 1 获取路径中的基础名称 const path require(path)// console.log(__filename) // /Users/liuchongyang/Desktop/分享/网页读取本地文件/node.js// 1 获取路径中的基础名称 /*** 01 返回的就是接收路径当中的最后一部分 * 02 第二个参数表示扩展名&#xff0c;如果…

手把手教-单片机stm32基于w25q128使用文件系统

一、开发测试环境 ①野火stm32f407开发板 ②rtthread操作系统 W25Q128的电路原理图&#xff1a; 二、开发步骤 ①使能spi驱动。 ②使能spi bus/device 驱动&#xff0c;选择sfud驱动。 ③开启dfs功能&#xff0c;选择elm文件系统。 ④保存&#xff0c;重新生成工程。 ⑤下载到…

VueCli 脚手架使用

VueCli 脚手架 到目前为止&#xff0c;已经会了Vue基本使用&#xff08;去创建vue实例&#xff0c;创建之后再去挂载&#xff0c;挂载之后就去使用各种功能&#xff0c;挂载之后就可以使用其各种功能&#xff0c;data methods compute 以及各个生命周期&#xff0c;常用的属性以…

779. 最长公共字符串后缀

题面&#xff1a; 给出若干个字符串&#xff0c;输出这些字符串的最长公共后缀。 输入格式 由若干组输入组成。 每组输入的第一行是一个整数 NN。 NN 为 00 时表示输入结束&#xff0c;否则后面会继续有 NN 行输入&#xff0c;每行是一个字符串&#xff08;字符串内不含空白符&…