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