Menu Close

Quartus 下利用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 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 到 f  每秒的速度进行跳动。

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

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

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

 

图1

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

 

图2

点击OK,跳出图3界面,

 

 图3

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

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

练习题:

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

 

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

发表回复

相关链接