zoukankan      html  css  js  c++  java
  • 自定义IP原来如此简单

    首先用Verilog语言或者VHDL编写、或者用原理图来画硬件驱动,以数码管驱动为例子,编写Verilog如下:

    1 module sg7IP(
    2
    3  input reset,
    4  input clk,
    5  input avs_s1_write,
    6  input [31:0]avs_s1_writedata,
    7  input avs_s1_address,
    8  output wire [7:0] oSEG7
    9 );
    10
    11  reg [7:0] sg7_r;
    12  always @(posedge clk or posedge reset)
    13 begin
    14 if(reset)
    15 sg7_r<=8'hf;
    16 else if(avs_s1_write&&avs_s1_address==0)
    17 sg7_r[7:0]<=avs_s1_writedata[7:0];
    18
    19 end
    20 assign oSEG7=~sg7_r;
    21 endmodule
    22

    然后编写一个顶层文件来调用sg7IP.v来测试验证上面的驱动是正常的。我这里编写了sg7top.v来作为顶层文件。

    1 module seg7top(
    2 input iCLK_50,
    3 input [0:0]iKEY,
    4 output wire [6:0] oHEX0_D,
    5 output wire oHEX0_DP
    6 );
    7
    8
    9 sg7IP sg7ipu0(
    10 .reset(!iKEY[0]),
    11 .clk(iCLK_50),
    12 .avs_s1_write(1'b1),
    13 .avs_s1_writedata(32'd113),
    14 .avs_s1_address(1'b0),
    15 .oSEG7({oHEX0_DP,oHEX0_D[6:0]})
    16

    17 endmodule
    18

    分配管教,编译后下载到DE2-70的开发板中,数码管HEX0显示为F则表示硬件驱动正常。

    然后打开SOPCBuilder,新建一个component。过程如下图。

    添加sg7IP、onchipmemory、cpu、jtag uart组件,点击“生成”

    完了后在QUARTUS II中修改sg7top.v

    1 module seg7top(
    2 input iCLK_50,
    3 input [0:0]iKEY,
    4 output wire [6:0] oHEX0_D,
    5 output wire oHEX0_DP
    6 );
    7
    8
    9 nios_cpu nios_cpu_inst
    10 (
    11 .clk_0 (iCLK_50),
    12 .oSEG7_from_the_sg7IP_0 ({oHEX0_DP,oHEX0_D[6:0]}),
    13 .reset_n (iKEY[0])
    14 );
    15
    16 endmodule
    17

    重新编译,下载。

    打开NISO IDE。

    新建空工程。

    建立sg7.h

    1 #ifndef SEG7_H_
    2 #define SEG7_H_
    3
    4 void SEG7_NUM(alt_u8 num);
    5
    6
    7 #endif /*SEG7_H_*/
    8

    建立sg7.c

    1 #include "io.h"
    2 #include "alt_types.h"
    3
    4 #include "system.h"
    5
    6 #include "SEG7.h"
    7
    8 #define SEG7_SET(seg_mask) IOWR(SG7IP_0_BASE,0,seg_mask)
    9
    10 static unsigned char szMap[] = {
    11 63, 6, 91, 79, 102, 109, 125, 7,
    12 127, 111, 119, 124, 57, 94, 121, 113
    13 }; // 0,1,2,....9, a, b, c, d, e, f
    14
    15
    16 void SEG7_NUM(alt_u8 num)
    17 {
    18 SEG7_SET(szMap[num]);
    19 }
    20

    建立main.c

    1 #include <stdio.h>
    2 #include "system.h"
    3 #include "unistd.h"
    4 #include "alt_types.h"
    5 #include "SEG7.h"
    6
    7 int main(void) {
    8 alt_u8 i=0;
    9 printf("My first IP");
    10 while(1){
    11 for(i = 0; i <10; i++) {
    12 SEG7_NUM(i);
    13 printf("Now print:%d\n",i);
    14 usleep(1 * 1000 * 1000);
    15 }
    16 }
    17 return 0;
    18 }
    19

    CTRL+B编译。

    run as  NIOS II  hardware。

    开发板中的数码管从0到9不断变化。IP编写测试完毕。

  • 相关阅读:
    Java编程思想读书笔记 第十章 内部类
    利用lambda和条件表达式构造匿名递归函数
    概率论与数理统计-课程小报告
    leetcode226 翻转二叉树
    leetcode199 二叉树的右视图
    leetcode114- 二叉树展开为链表
    leetcode145 二叉树的后序遍历 特别注意迭代
    leet144 二叉树的前序遍历
    leetcode113 路径总和2 特别关注
    leetcode 112 路径总和 特别关注
  • 原文地址:https://www.cnblogs.com/nios_ii/p/1844432.html
Copyright © 2011-2022 走看看