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

 

  在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,其中有很多不足,互相交流学习。。。。。。。

 

 posted on 2011-12-11 18:39  _轩小宸  阅读(1104)  评论(0编辑  收藏  举报