Menu Close

Quartus II 下利用ROM 实现7段译码显示

Quartus II 下利用ROM 实现7段译码显示

在上节内容中我们讲解了mif文件的格式以及使用方法,可以利用文本编辑器进项mif文件的编写。本节内容主要利用已经生成的ROM(8 X 256),利用mif文件将ROM的内容设置成7段数码管的译码内容,对比数码管case语句的译码,可以非常容易地转换成mif文件。

  1. 编写7段数码管译码mif文件

case语句译码复制如下:

always@(*)
case(count_sel)
0: SEVEN_SEG = 7'b100_0000;
1: SEVEN_SEG = 7'b111_1001;
2: SEVEN_SEG = 7'b010_0100;
3: SEVEN_SEG = 7'b011_0000;
4: SEVEN_SEG = 7'b001_1001;
5: SEVEN_SEG = 7'b001_0010;
6: SEVEN_SEG = 7'b000_0010;
7: SEVEN_SEG = 7'b111_1000;
8: SEVEN_SEG = 7'b000_0000;
9: SEVEN_SEG = 7'b001_0000;
4'ha: SEVEN_SEG = 7'b000_1000;
4'hb: SEVEN_SEG = 7'b000_0011;
4'hC: SEVEN_SEG = 7'b100_0110;
4'hd: SEVEN_SEG = 7'b010_0001;
4'hE: SEVEN_SEG = 7'b000_0110;
4'hF: SEVEN_SEG = 7'b000_1110;
default: SEVEN_SEG = 7'b111_1111;
endcase

按照case语句的内容翻译成mif文件的地址与数据的对应关系。

mif文件内容如下:

% file name : p1_rom.mif%

DEPTH = 32;                   — The size of memory in words
WIDTH = 8;                    — The size of data in bits
ADDRESS_RADIX = HEX;          — The radix for address values
DATA_RADIX = HEX;             — The radix for data values
CONTENT                       — start of (address : data pairs)
BEGIN

00 : 40;                 — memory address : data
01 : 79;
02 : 24;
03 : 30;
04 : 19;
05 : 12;
06 : 02;
07 : 78;
08 : 00;
09 : 10;
0A : 08;
0B : 03;
0C : 46;

0D : 21;

0E : 06;

0F : 0e;

END;

2.设计利用ROM进行译码的程序

    • 新建工程,

工程名称–rom_7SEG, 顶层实体的名称–rom_7SEG, 顶层文件的名称–rom_7SEG,顶层文件的module name–rom_7SEG

    • 在新工程中利用向导生成单端口ROM,名称为p1_rom,并在工程中例化,例化名为p1_rom_inst, 参照Quartus II ROM 的生成与配置详解
    • 编写rom_7SEG.v文件,
      • 分频,将50Mhz的时钟分频成1HZ的单脉冲信号
      • 地址计数器

程序代码如下:


module rom_7SEG
(
    input        inclk,  //50Mhz
    input        rst,
    output       DP,
    output [5:0] SEAT,
    output [6:0] SEVEN_SEG
);

reg  [26:0] div;
reg         f_s;
reg  [3:0]  seg_addr;

assign        DP = 1'b1;
assign        SEAT = 6'b11_1110;

always@(posedge inclk or posedge rst)   //分频
if(rst)  
begin
    div = 0;
    f_s = 0;
end
else 
begin
    if(div == 49999999)
    begin
        div = 0;
        f_s = 1'b1;
    end
    else 
    begin
        div = div + 1;
        f_s = 0;
    end
end

always@(posedge inclk or posedge rst)  //地址计数
if(rst)  
begin
    seg_addr = 0;
end
else 
begin
    if(f_s)
        seg_addr = seg_addr + 1;
end

assign  DP = 1'b1;

p1_rom  p1_rom_inst
(
    .address (seg_addr),
    .clock   (inclk),
    .q       (SEVEN_SEG) //ROM.q是8位输出,这里只用了低7位
);

endmodule

  

3. 设置ROM的mif文件

将上面的mif文件存储到工程目录中(p1_rom.mif),并选取ROM的mif并编译。

    • 管脚锁定

根据FII-PRA006的硬件使用手册,进行管脚锁定,如表1

表1

程序信号名 网络标号 FPGA管脚 端口说明
clk C10_50MCLK 91 输入时钟
rst KEY3 10 复位按键
SEAT[5] SEG_3V3_D5 124 位选信号第5位
SEAT[4] SEG_3V3_D4 127 位选信号第4位
SEAT[3] SEG_3V3_D3 129 位选信号第3位
SEAT[2] SEG_3V3_D2 141 位选信号第2位
SEAT[1] SEG_3V3_D1 142 位选信号第1位
SEAT[0] SEG_3V3_D0 136 位选信号第0位
SEVEN_SEG[6] SEG_PG 135 段选信号第7位
SEVEN_SEG[5] SEG_PF 138 段选信号第6位
SEVEN_SEG[4] SEG_PE 126 段选信号第5位
SEVEN_SEG[3] SEG_PD 125 段选信号第4位
SEVEN_SEG[2] SEG_PC 133 段选信号第3位
SEVEN_SEG[1] SEG_PB 137 段选信号第2位
SEVEN_SEG[0] SEG_PA 132 段选信号第1位
DP SEG_DP 128 段选信号第0位
    • 重新编译,在FII-PRA 006上下载测试。

测试结果应该是在FII-PRA 006开发板上最右边的数码管显示从0到按照每秒进行跳动。

4. Quartus II mif文件编辑器的使用

除了使用通用的mif文件编辑器编辑mif文件外,Quartus II还提供了表格式mif文件编辑功能。

    • 在Quartus II工程中新建mif文件,菜单file–>New… –>,选取类型为Memory Initialization File , 如图1,

%title插图%num

图1

点击OK,跳出的界面如图2,填写对应的ROM(RAM)的深度和输出宽度。

%title插图%num

图2

点击OK,跳出图3界面,

%title插图%num

 图3

在图3中,鼠标右键点击ASCII的位置,设置地址和数据的表示格式(如16进制,8进制,2进制等)

    • 根据需要编辑表中的内容,完成后存储,并于ROM的mif文件相关联就可以使用了。

练习题:

  1. 利用ROM和 mif文件编写应用程序,利用4位数码管实现数字中的分,秒显示。要求:
    1.  利用1个深度256,位宽为8的ROM进行译码,将小数点显示在第3个数码管上,要求用两种方法实现:
      1. DP直接译码(Verilog)
      2. DP结合7段数码管的数字部分组成8段,在mif文件中设计成通用的译码电路,并用Verilog代码实现不同的数码管和小数点的调用。
  2. 编写4位2进制自然编码到48位格雷码的转换表,形成mif文件,使用4位开关作为输入,并用1位数码管译码显示。(硬件部分参照FII-PRA006/010)

 

Posted in FPGA, FPGA, FPGA硬件资源, Quartus II, Verilog, Verilog, 开发工具, 教材与教案, 文章

发表评论

相关链接