基于Nios-II实现流水灯

基于Nios-II实现流水灯

1.新建项目,选择芯片

在这里插入图片描述

2.osys设计

2.1 进入Tools -> Platform Designer

在这里插入图片描述

2.2 设置时钟主频在这里插入图片描述

2.3 添加Nios-II Processor并设置

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在”Advanced Features”标签栏中保持默认设置,
在”MMU and MPU Settings”标签栏中保持默认设置,
在”JTAG Debug Module”标签栏中保持默认设置(注意勾选 Include JTAG Debug),
点击 Finish 回到 PD 界面。
将 nios2_qsys_0 重命名为 cpu,点击”Rename”即可重新命名,操作完成后如下图所示。
在这里插入图片描述

将 cpu 的 clk 和 reset 分别与系统时钟 clk_0 的 clk 和 clk_reset 相连,如图所示。在这里插入图片描述

2.4 添加JTAG并配置

左边选择JTAG_UART_Intel_FPGA_IP,点击Add。在这里插入图片描述右键重命名为uart,并按图进行时钟线,复位线,数据线的连接:在这里插入图片描述同时还要连接中断
在这里插入图片描述

2.5 添加RAM

选择On-Chip Memory (RAM or ROM) Intel FPGA,点击Add加入。在这里插入图片描述
更改名字并连线在这里插入图片描述

2.6 添加PIO

在这里插入图片描述
连接clk,reset,s1并导出输出端口:在这里插入图片描述
这里将输出命名为out_led
在这里插入图片描述

2.7 添加System ID Peripheral

在这里插入图片描述进行连接
在这里插入图片描述

2.8 其他设置

基地址分配:点击 PD 主界面菜单栏中的”System”下的”Assign Base Addresses”。在这里插入图片描述
分配中断号:在”IRQ”标签栏下点选”Avalon_jtag_slave”和 IRQ 的连接点就会为”jtag_uart”核添加一个值为 0 的中断号。在这里插入图片描述
指定 NIos II 的复位和异常地址:从”System Contents”标签栏
双击建立好的 cpu 进入 Nios II Processor 的配置界面,配置 Reset Vector 和 Exception Vector 为””onchip_ram.s1”,点击 Finish。

点击 Qsys 主界面菜单栏中的”System”下的”Create Global Reset Network”。完成后会自动连接所有复位端口。

生成HDL

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

3.Quartus设计

3.1 添加原理图文件

返回到Quartus页面,新建原理图文件:在这里插入图片描述双击空白处,加入生成的bsf文件:在这里插入图片描述右键生成IO端口在这里插入图片描述

3.2芯片引脚设置

(1)菜单里选择 Assignments-device,然后如下图所示点击 Device pin options。
(2)进行 unused pin 设置,可能会收到外部信号的干扰,将未用引脚设置为 As input tri-stated。
在这里插入图片描述在这里插入图片描述

3.3编译

回到 Quartus II 主界面后编译项目。如下图所示,编译成功后,点击 OK 完成。在这里插入图片描述点击下图所指快捷键进入 Pin Planner 界面,按照开发板提供的管脚名称分配针脚,下图所示:在这里插入图片描述

4.软件部分设计

4.1.启动 Nios II SBT

tool->Nios II Software Build Tools for Eclipse在这里插入图片描述出现 Nios II SBT for Eclipse 主界面
在这里插入图片描述

4.2创建工程

建立新工程在这里插入图片描述在”SOPC Information File name”窗口中选择 kernel.sopcinfo 文件,以便将生成硬件配置信息和软件应用关联,CPU 栏会自动选择”CPU,点击finish在这里插入图片描述出现问题在这里插入图片描述

回到Platform Designer,将on-chip ram的指令线也连上在这里插入图片描述

4.3修改程序

在 hell_word.c 里修改流水灯控制程序。

#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
const alt_u8
led_data[8]={0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};
int main (void)
{
 int count=0;
 alt_u8 led;
 volatile int i;
 while (1)
 { if (count==7)
 {count=0;}
 else
 {count++;}
 led=led_data[count];
 IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);
 i = 0;
 while (i<500000)
 i++;
 }
 return 0;
}

编译工程
右键单击项目名称,在弹出的菜单中选择 Build Project在这里插入图片描述

5.运行项目

启动 Quartus Prime Programmer并将sof文件烧录到板子
运行/调式程序在这里插入图片描述
配置 Run Configurations,转到”Target Connection”标签栏,点击右侧的 Refresh Connections 将 USB-Blaster 加入在这里插入图片描述Apply 后,Run。下载完成后,可以看见 Console 里打印信息“hello from Nios
II!”(第一段代码实现)在这里插入图片描述流水灯实现:

IMG_4385

基于Verilog实现流水灯

1.Verilog代码撰写

module led #(parameter TIME_1_5s=75_000_000)(
    input             clk,
    input             rst_n,
    output  reg [3:0] led
);
    //parameter TIME_1_5s=75_000_000;
    reg [2:0] cnt;
    reg [26:0] cnt_1;
    wire add_cnt1;  
    wire end_cnt1;  
    wire add_cnt;
    wire end_cnt;
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_1<=27'b0;
        end
        else if(add_cnt1)begin                   
            if(end_cnt1)begin                    
                cnt_1<=1'b0;                        
            end
            else begin
                cnt_1<=cnt_1+1'b1;                  
            end
        end
        else begin
            cnt_1<=cnt_1;                        
        end
    end
    assign add_cnt1=1'b1;
    assign end_cnt1=add_cnt1&&cnt_1 ==TIME_1_5s-1;
 //   always @(posedge clk or negedge rst_n)begin
 //       if(!rst_n)begin
 //           led<=4'b0001;
 //       end
 //       else if(end_cnt1)begin
 //           led<={led[2:0],led[3]};
 //       end
 //       else begin
 //           led<=led;
 //       end
 //   end
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt<=1'b0;
        end
        else if(add_cnt)begin
            if(end_cnt)begin
                cnt<=1'b0;
            end
            else begin
                cnt<=cnt+1'b1;
            end
        end
        else begin
            cnt<=cnt;
        end
    end
    assign add_cnt=end_cnt1;
    assign end_cnt=add_cnt&&cnt==7;
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            led<=4'b1111;
        end
        else begin
            if(cnt==3'b000)begin
                led<=4'b0001;
            end
            else if(cnt==3'b001)begin
                led<=4'b0011;
            end
            else if(cnt==3'b010)begin
                led<=4'b0111;
            end
            else if(cnt==3'b011)begin
                led<=4'b1111;
            end
            else if(cnt==3'b100)begin
                led<=4'b1110;
            end
            else if(cnt==3'b101)begin
                led<=4'b1100;
            end
            else if(cnt==3'b110)begin
                led<=4'b1000;
            end
            else if(cnt==3'b111)begin
                led<=4'b0000;
            end
            else begin
                led<=4'b1111;
            end
        end
    end
endmodule

2.引脚绑定

在这里插入图片描述

3.烧录,运行

IMG_4386

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值