- 预备
- 8位数据寄存器VHDL描述
- 采用LPM_RAM_IO定制一个256*8的RAM
- 生成mif文件
- 与八位寄存器配合实现对RAM中读取和写入操作
- 参考资料
一、预备:
LPM(Library Parameterized Modules):参数化的宏功能模板库
lpm_ram_io:输入输出复用的参数化RAM
RAM(Random Access Memory):随机存取存储器
ROM(Read Only Memory):只读存储器
mif:(memory initialzation file):存储器初始化文件
二、8位数据寄存器VHDL描述
1、代码
2、符号及功能
3、功能仿真
三、采用LPM_RAM_IO定制一个256*8的RAM
1、原理图。如图,下拉选择lpm_ram_io。
2、设置相关参数。双击右上角的方框,弹出“Symbol Properties”窗口。
选择Ports,设置outclock和memenab为Unused。
选择Parameters,如图。其中LPM_FILE的Setting填的是存储器初始化文件的路径,关于设置test.mif在后文中介绍。
3、符号及功能
四、生成mif文件
1、利用Quartus自带的mif编辑器
【file】->【new】->【Merory Initialzation file】
2、利用mif软件生成
略
3、使用高级语言(C++等)
CSDN博客:https://blog.csdn.net/qq_40889820
#include<iostream>
#include<sstream>
#include<fstream>
#include<algorithm>
#include<string>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<map>
#define mem(a,b) memset(a,b,sizeof(a))
#define e 2.71828182
#define Pi 3.141592654
using namespace std;
const int DEPTH=256;//数据深度,存储单元的个数
const int WIDTH=8;//存储单元的深度
int main()
{
ofstream outfile("test.mif",ios::out);
if(!outfile)
{
cerr<<"open error!\n";
exit(-1);
}
//生成文件头
cout<<"create sucessfully!\n";
outfile<<"DEPTH = "<<DEPTH<<";\n";
outfile<<"WIDTH = "<<WIDTH<<";\n";
outfile<<"ADDRESS_RADIX = HEX;\n";
outfile<<"DATA_RADIX = HEX;\n";
outfile<<"CONTENT\n";
outfile<<"BEGIN\n";
//以十六进制设置地址和数据
for(int i=0;i<DEPTH;i++)
{
//周期为128个点的正弦波
float s=sin(Pi*i/64);
//将-1到1之间的正弦波的值扩展到0~255之间
int temp=(int)((s+1)*255/2);
//以十六进制输出
outfile<<hex<<i<<"\t:";
outfile<<"\t"<<hex<<temp<<";\n";
}
outfile<<"END;\n";
outfile.close();
return 0;
}
生成后用记事本打开,如图。将其放置在RAM工程所在文件夹,用Quartus打开,如图。右键单击左侧地址值,可以修改地址和数据的显示格式,此处修改为二进制,如图。(将.mif文件拖入Quartus即可打开)
五、与八位寄存器配合实现对RAM中读取和写入操作
1、最终原理图
2、功能仿真
a.读取测试
b.写入测试
需要注意的是,这里的RAM的操作是上升沿触发而寄存器是下降沿触发。