这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » mmqm的进程贴

共17条 2/2 1 2 跳转至
菜鸟
2012-10-20 00:10:22     打赏
11楼

10.20

继续学习Nios II。需要设计自己的IP,研究了些资料,先制作数码管的IP核。


修改之前seg.v的代码。思路是通过avalon总线发送32bits数据,每4bits代表一个数码管,可以显示0~F。8个数码管动态刷新。



代码:

// SEG数码管模块
module seg_ip(
    input clk,              // 系统时钟输入,50MHz
    input reset_n,          // 系统复位输入
    input write,
    input [31:0]writedata,

    output[7:0] seg,        // seg输出
    output[7:0] dig         // dig输出
);
 
reg[6:0] seg_r;
reg[7:0] dig_r;

assign seg = { 1'b1, seg_r };
assign dig = dig_r;
 
reg[15:0] scan; //扫描
reg[31:0] seg_data;

//扫描时钟
always @(posedge clk or negedge reset_n)
begin
    if(!reset_n)
        scan = 16'd0;
    else
        scan = scan + 1'b1;
end

always @(posedge clk or negedge reset_n)
begin
    if(!reset_n)
        seg_data[31:0] <= 31'd0;
    else if(write)
        seg_data[31:0] <= writedata[31:0];
end

//片选
always @(scan[15:13])
begin
    case(scan[15:13])   
        3'd0: begin dig_r <= ~8'h01; seg_r <= trans(seg_data[3:0]); end
        3'd1: begin dig_r <= ~8'h02; seg_r <= trans(seg_data[7:4]); end
        3'd2: begin dig_r <= ~8'h04; seg_r <= trans(seg_data[11:8]); end
        3'd3: begin dig_r <= ~8'h08; seg_r <= trans(seg_data[15:12]); end
        3'd4: begin dig_r <= ~8'h10; seg_r <= trans(seg_data[19:16]); end
        3'd5: begin dig_r <= ~8'h20; seg_r <= trans(seg_data[23:20]); end
        3'd6: begin dig_r <= ~8'h40; seg_r <= trans(seg_data[27:24]); end
        3'd7: begin dig_r <= ~8'h80; seg_r <= trans(seg_data[31:28]); end
    endcase
end

//译码任务
function [6:0] trans;
input [3:0] in_data;
begin
    case(in_data[3:0])
        0: trans = 7'b100_0000; // 0
        1: trans = 7'b111_1001; // 1
        2: trans = 7'b010_0100; // 2
        3: trans = 7'b011_0000; // 3
        4: trans = 7'b001_1001; // 4
        5: trans = 7'b001_0010; // 5
        6: trans = 7'b000_0010; // 6
        7: trans = 7'b101_1000; // 7
        8: trans = 7'b000_0000; // 8
        9: trans = 7'b001_1000; // 9
        10: trans = 7'b000_1000; // A
        11: trans = 7'b000_0011; // b
        12: trans = 7'b100_0110; // c
        13: trans = 7'b010_0001; // d
        14: trans = 7'b000_0110; // E
        15: trans = 7'b000_1110; // F
        default: trans = 7'b111_1111;
    endcase
end
endfunction

endmodule



在IDE端,测试程序修改为:

#define seg *(volatile unsigned int *) NIXIETUBE_BASE

seg = data++;

按键一次,数据+1



视频:
http://v.qq.com/boke/page/p/d/h/p0106ogi4dh.html


菜鸟
2012-10-24 15:34:37     打赏
12楼
10.24

继续学习NIOS II。
在调试uart出现一连串问题。把自带RS232的IP添加进去后,发现串口通信收发数据异常,参考网上实验教程,发现是打开了NIOS CPU的cache。重新完成后,发现uart果然正常收发数据了,但是led和key却没有反应了?!奇怪。显然,是打开cache引起的。上网查询,果然如此。打开cache,就不能直接对地址操作了,类似led=0xaa;就不行了。

LED=0x0; // 使PIO LED输出为0,此种方法在有数据CACHE时会失效
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0x0); // 使PIO LED输出为0
或者IOWR(LED_BASE,0,0); // 使PIO LED输出为0

这样修改完成后,一切恢复正常。

今天继续调试,又出现了新问题。在执行NIOS程序代码时,不能下载了:
Pausing target processornot responding
Resetting and trying again: FAILED
downloading ELF process failed

从网上查询知道,是sdram时钟与cpu时钟之间的问题,不过建议的方法一一试验过,均不起作用。最后,感觉是电路上可能出现问题。重新把引脚焊接一遍后,故障解除。

菜鸟
2012-10-27 20:29:38     打赏
13楼

10.27

继续学习NIOS II。

参考网上资料,设计VGA的控制器IP。代码和之前的VGA实验代码差不多,增加了与SDRAM的读取方式。在SDRAM开辟一段显示缓存区域。VGA的分辨率为800x600,在50MHz时钟下,刷新频率为72Hz。

// VESA Signal 800x600 @ 72Hz timing
// Screen refresh rate: 72Hz
// Vertical refresh: 48.076923076923kHz
// Pixel freq.: 50.0MHz

// Horizontal timing (line)
parameter   H_SYNC_PULSE    =   120;    // 行同步
parameter   H_BACK_PORCH    =   64;     // 行同步后
parameter   H_VISIBLE_AREA  =   800;    // 行图像显示
parameter   H_FRONT_PORCH   =   56;     // 行同步前
parameter   H_WHOLE_LINE    =   1040;   // 行总和

// Vertical timing (frame)
parameter   V_SYNC_PULSE    =   6;      // 场同步
parameter   V_BACK_PORCH    =   23;     // 场同步后
parameter   V_VISIBLE_AREA  =   600;    // 场图像显示
parameter   V_FRONT_PORCH   =   37;     // 场同步前
parameter   V_TOTAL_FRAME   =   666;    // 场总和





在NIOS的测试程序,将屏幕分成32x8的小块,分别显示256色(1个字节)

#define VGA_WIDTH 800
#define VGA_HEIGHT 600
#define VGA_BUFFER_SIZE VGA_WIDTH*VGA_HEIGHT
#define VGA_SET_PIXEL(x,y,color) IOWR_8DIRECT((unsigned long)vga_buffer,(y*VGA_WIDTH)+x,color)
unsigned char vga_buffer[VGA_BUFFER_SIZE];

 for(y = 0; y < VGA_HEIGHT; y++)
 {
  yy = y / 75;
  for(x = 0; x < VGA_WIDTH; x++)
  {
   xx = x / 25;
   color = yy * 32 + xx;
   VGA_SET_PIXEL(x, y, color);
  }
 }



效果:


菜鸟
2012-10-28 15:58:02     打赏
14楼

DS18B20封装,PCB上引脚错误

菜鸟
2012-10-28 16:12:27     打赏
15楼
10.28

继续下一步实验,焊接电路部分为红绿黄3个led,蜂鸣器,8段开关。这些都比较简单。唯一出现的问题是蜂鸣器不响,起先以为是5V的,在3.3V下不能工作,拆下后用5V电源测试还是不响,估计是坏了

菜鸟
2012-11-02 22:05:09     打赏
16楼
11.2 

最近几天没有继续实验,原因是重装电脑系统为win8,所有软件都要重来一遍。借此机会,也就把从开始到现在的实验过程整理一下,为自己今后回顾提供资料。也可以为一些初学者提供些参考。 

由于本人n年前用过一次FPGA,而最近可能需要用其开发产品,所以重新学习。基于此原因,我在初步调试实验板后直接学习Nios II。当然,对于第一次学习FPGA的朋友,还是先搞定Quartus II的基础实验为好。 

Nios实验文档还没写完,根据实验进程继续添加。目前写到第一个实验:LED 

目录:


文档:

——回复可见内容——

菜鸟
2012-12-25 13:22:14     打赏
17楼
12.25

今天是圣诞节。很久没有更新FPGA实验进程了,需要先回忆下先前的工作。另外,之前在版主提示下知道,实验板的蜂鸣器没有内置震荡电路,所以接直流电不响。

NIOS的入门实验目前完成led、key、uart,下一步需要整合数码管、VGA。

共17条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]