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

 

转载于:https://www.cnblogs.com/xuanxiaochen/archive/2011/12/11/2284089.html

相关资源:计数器的SOPC实现
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
“第2章示例”目录: 例2-1.v————————书中例2-1的Verilog源代码; 例2-2.v————————书中例2-2的Verilog源代码; 例2-3.v————————书中例2-3的Verilog源代码; 例2-4.v————————书中例2-4的Verilog源代码; 例2-5.v————————书中例2-5的Verilog源代码; “function”示例.v——书中关键字“function”示例的Verilog源代码; “task”示例.v————书中关键字“task”示例的Verilog源代码; ================================================================================= “第4章示例”目录: 8位乘法器.v——————书中8位乘法器的Verilog源代码; 74LS138.v——————书中74LS138的Verilog源代码; D触发器.v——————书中D触发器的Verilog源代码; 除法器.v——————书中除法器的Verilog源代码; 基本RS触发器.v————书中基本RS触发器的Verilog源代码; 同步RS触发器.v————书中同步RS触发器的Verilog源代码; 数码管.v——————书中按键和数码管组成的输入输出电路的Verilog源代码; ================================================================================= “第7章示例”目录: avalon_pwm_source.zip: Nios II系统中PWM外设源代码,其中:pwm_hw目录为Verilog源代码,pwm_sw目录为底层驱动程序 pwm_hw目录中包含文件:pwm_avalon_interface.v;pwm_register_file.v;pwm_task_logic.v为PWM外设的Verilog源代码,顶层文件是pwm_avalon_interface.v pwm_sw目录中包含Nios II软件中需要应用的HAL目录和inc目录,test_software目录中含测试pwm外设用的程序 NiosII片外SRAM的Avalon-MM从设备接口.v: 为一个512K X 16bit的SRAM芯片接到Avalon总线从设备接口的Verilog源代码; SRAM_16Bits_512K.rar: Nios II系统中512K X 16bit的SRAM芯片外设源代码,其中SRAM_16Bit_512K.v为Verilog源代码;class.ptf为Avalon总线描述文件,mk_user_logic_SRAM_16Bits_512K.pl为该外设的描述文件; 第7章示例.rar: 为第7章Hello_LED的示例,使用Quartus II打开该工程。在software子目录下有相应的示例程序:Hello_LED;key;timer;UART ================================================================================== “第10章示例”目录: SOPC_PCI.rar: 为基于Nios II系统的数据采集卡设计实例,使用Quartus II打开该工程。 ================================================================================== “第11章示例”目录: USB_Emulator.rar: 为基于Nios II系统的硬件在回路仿真器设计实例,使用Quartus II打开该工程。 ================================================================================== “SPI”目录: SPI.v: 书中SPI接口外设的Verilog源代码; spi_vhdl.zip: SPI接口外设的VHDL源代码,详细说明请参考压缩文件中的readme.txt ================================================================================== “UART”目录: uart_verilog.rar: UART接口外设的Verilog源代码,其中uart.v是顶层设计文件,txmit.v是数据发送模块Verilog源代码,rcvr.v是数据接收模块Verilog源代码;rcvr_tf.v是测试数据接收的Verilog源代码,txm
内容简介《基于FPGA的SOPC嵌入式系统设计与典型实例》全书通过核心技术与典型实例的形式,全面系统、深入浅出地介绍了基于FPGA的嵌入式SOPC系统设计技术与应用实例。全书共分14章,第1~3章简要介绍了FPGA硬件结构知识、VerilogHDL编程基础、FPGA常用开发工具,引导读者入门;第4~7章重点对嵌入式SOPC系统设计技术进行了细致阐述,内容包括:SOPC硬件系统开发、SOPC软件系统开发、Avalon总线规范、NiosII外围设备及其编程;第8~14章通过7个典型实例,对基于FPGA的嵌入式SOPC系统设计过程进行实际演练,具体包括:七段数码管时钟显示实例、串口通信DMA传输实例、LED灯控PWMIP核的设计实例、通用TFT-LCD控制器及PS2鼠标设计实例、对对碰游戏设计实例、GPS信息接收系统设计实例以及基于NiosII的I2C总线传输应用设计。经过这些例子的学习,读者设计的能力将迅速提升,产生质的飞跃。   编辑推荐《基于FPGA的SOPC嵌入式系统设计与典型实例》语言通俗,结构清晰,基础知识和大量工程实例结合,实践性强。不但详细介绍了基于FPGA的嵌入式SOPC系统设计的构架与软硬件编程,同时提供了应用设计思路与方案,对实例的所有程序代码做了详细注释,利于读者理解和巩固知识点。   《基于FPGA的SOPC嵌入式系统设计与典型实例》配有光盘一张,包含了全书所有实例的硬件原理图和程序源代码,方便读者学习和使用。《基于FPGA的SOPC嵌入式系统设计与典型实例》适合计算机、自动化、电子及硬件等相关专业的大学生,以及从事FPGA开发的科研人员使用。
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页