• 构建NIOS II 定时器 + 基于 verilog HDL 的数码管显示 的时钟


      在学习之前,首先要了解定时器,看过定时器的几个定时器。

      在CPU中,

      选择

      

      在SOPC中,选择Simple periodic interrupt

      

      

      加了三个PIO

      

      

      基于 verilog HDL 的数码管显示 代码,在这里没用到状态机,代码比较简单。

      

     1 module seg(clk,reset,sec,min,hou,seg_data,seg_en);
    2
    3
    4 input wire clk;
    5 input wire reset;
    6 input [5:0] sec;
    7 input [5:0] min;
    8 input [4:0] hou;
    9 output [7:0] seg_data;
    10 output [7:0] seg_en;
    11
    12 wire clk_seg;
    13
    14
    15 clk_div c1(.clk(clk),.reset(reset),.clk_div(clk_seg));
    16
    17 seg_time s1(.clk(clk_seg),.reset(reset),.sec(sec),
    18 .min(min),.hou(hou),.seg_data(seg_data),.seg_en(seg_en));
    19
    20
    21 endmodule

      显示部分

      1 module seg_time(clk,reset,sec,min,hou,seg_data,seg_en);
    2
    3
    4 input clk;
    5 input reset;
    6 input [5:0] sec;
    7 input [5:0] min;
    8 input [4:0] hou;
    9 output reg [7:0] seg_data;
    10 output reg [7:0] seg_en;
    11
    12 reg [5:0] sec_1;
    13 reg [5:0] min_1;
    14 reg [4:0] hou_1;
    15
    16
    17 reg [2:0] sel; //计数
    18
    19 wire [7:0] seg_tab[7:0];
    20
    21 reg [7:0] seg_dis[9:0];
    22
    23 initial
    24 begin
    25 seg_dis[0]<=8'hc0;
    26 seg_dis[1]<=8'hf9;
    27 seg_dis[2]<=8'ha4;
    28 seg_dis[3]<=8'hb0;
    29 seg_dis[4]<=8'h99;
    30 seg_dis[5]<=8'h92;
    31 seg_dis[6]<=8'h82;
    32 seg_dis[7]<=8'hf8;
    33 seg_dis[8]<=8'h80;
    34 seg_dis[9]<=8'h98;
    35 end
    36
    37 always@(posedge clk or negedge reset)
    38 begin
    39 if(!reset)
    40 begin
    41 sec_1 <=6'd0;
    42 min_1 <=6'd0;
    43 hou_1 <=6'd0;
    44 end
    45 else
    46 begin
    47 sec_1 <= sec;
    48 min_1 <= min;
    49 hou_1 <= hou;
    50 end
    51
    52 end
    53
    54 always@(posedge clk or negedge reset)
    55 begin
    56 if(!reset)
    57 seg_en <= 8'b1111_1111;
    58 else if(sel<8)
    59 sel <= sel + 1'b1;
    60 else
    61 sel <= 3'b000;
    62
    63 case(sel)
    64 3'b000 :
    65 seg_data <= seg_tab[0];
    66 3'b001 :
    67 seg_data <= seg_tab[1];
    68 3'b010 :
    69 seg_data <= seg_tab[2];
    70 3'b011 :
    71 seg_data <= seg_tab[3];
    72 3'b100 :
    73 seg_data <= seg_tab[4];
    74 3'b101 :
    75 seg_data <= seg_tab[5];
    76 3'b110 :
    77 seg_data <= seg_tab[6];
    78 3'b111 :
    79 seg_data <= seg_tab[7];
    80 default : seg_data <= 8'b0000_0000;
    81 endcase
    82
    83
    84 case(sel)
    85 3'b000 :
    86 seg_en <= 8'b1111_1110;
    87 3'b001 :
    88 seg_en <= 8'b1111_1101;
    89 3'b010 :
    90 seg_en <= 8'b1111_1011;
    91 3'b011 :
    92 seg_en <= 8'b1111_0111;
    93 3'b100 :
    94 seg_en <= 8'b1110_1111;
    95 3'b101 :
    96 seg_en <= 8'b1101_1111;
    97 3'b110 :
    98 seg_en <= 8'b1011_1111;
    99 3'b111 :
    100 seg_en <= 8'b0111_1111;
    101 default : seg_en <= 8'b1111_1111;
    102 endcase
    103 end
    104
    105
    106 assign seg_tab[0] = seg_dis[hou_1/10];
    107 assign seg_tab[1] = seg_dis[hou_1%10];
    108 assign seg_tab[2] = ~(8'h40);
    109 assign seg_tab[3] = seg_dis[min_1/10];
    110 assign seg_tab[4] = seg_dis[min_1%10];
    111 assign seg_tab[5] = ~(8'h40);
    112 assign seg_tab[6] = seg_dis[sec_1/10];
    113 assign seg_tab[7] = seg_dis[sec_1%10];
    114
    115
    116
    117 endmodule

      时钟分频

     1 module clk_div(clk,reset,clk_div);
    2
    3 input wire clk;
    4 input wire reset;
    5 output wire clk_div;
    6
    7 reg [24:0] count;
    8
    9 always@(posedge clk or negedge reset)
    10 begin
    11 if(!reset)
    12 count<=0;
    13 else
    14 count<=count+1;
    15 end
    16
    17 assign clk_div = count[15];
    18
    19 endmodule


      模块例化,quartus ii ----file--------create-------create sytmble files

      然后在原理图中选用。

      

      NIOS II中 C代码

     1 #include "system.h"
    2 #include "sys/alt_irq.h"
    3 #include "altera_avalon_timer_regs.h"
    4 //#include "altera_avalon_pio_regs.h"
    5 //#include "alt_types.h"
    6 #include "inc/sopc.h"
    7 #include "unistd.h"
    8 #include <stdio.h>
    9
    10 void timer_init();
    11
    12
    13 static void ISR_timer(void *context, alt_u32 id)
    14 {
    15
    16 IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE, 0x00);
    17
    18 if(SEC->DATA<60)
    19 {
    20 SEC->DATA++;
    21
    22 }
    23 else
    24 {
    25 SEC->DATA=0;
    26 if(MIN->DATA<60)
    27 {
    28 MIN->DATA++;
    29 }
    30 else
    31 {
    32 MIN->DATA=0;
    33 if(HOU->DATA<24)
    34 {
    35 HOU->DATA++;
    36 }
    37 else
    38 {
    39 HOU->DATA=0;
    40 }
    41 }
    42 }
    43
    44
    45 //改变定时器1的周期
    46 IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_BASE, 50000000&0xffff );
    47 IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_BASE, 50000000 >> 16);
    48 //重新启动定时器
    49 IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_BASE, 0x07);
    50
    51 }
    52
    53 void timer_init()
    54 {
    55
    56 IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE, 0x00); //清除Timer1中断标志寄存器
    57 IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_BASE,50000000&0xffff); //设置Timer周期,这里输入的是时钟周期数
    58 IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_BASE,50000000 >> 16);
    59
    60 IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_BASE, 0x07); //允许Timer1中断
    61
    62 alt_irq_register(TIMER_IRQ, (void *)TIMER_BASE, ISR_timer); //注册Timer中断
    63
    64 }
    65
    66
    67 int main(void)
    68 {
    69
    70 timer_init();
    71
    72 while(1)
    73 {
    74 usleep(500000);
    75 usleep(500000);
    76 }
    77
    78
    79 return 0;
    80
    81 }

      初学NIOS II,其中有很多不足,互相交流学习。。。。。。。

  • 相关阅读:
    DAY 206 Python验证常见的50个正则表达式
    DAY 205 python使用ftplib模块实现FTP文件的上传下载
    Jmeter组件介绍
    Jmeter安装
    Jmeter学习笔记
    Jmeter:相应断言介绍
    python time模块
    python+selenium+Eclipse安装
    Python os.path模板函数
    ping 计算机全名,返回的不是IP地址
  • 原文地址:https://www.cnblogs.com/xuanxiaochen/p/2284089.html
Copyright © 2020-2023  润新知