FPGA课程设计基于RAM的十口8位计数器.docx
《FPGA课程设计基于RAM的十口8位计数器.docx》由会员分享,可在线阅读,更多相关《FPGA课程设计基于RAM的十口8位计数器.docx(22页珍藏版)》请在冰豆网上搜索。
![FPGA课程设计基于RAM的十口8位计数器.docx](https://file1.bdocx.com/fileroot1/2022-11/17/08078696-5f8e-4a5b-aad3-877fabb11440/08078696-5f8e-4a5b-aad3-877fabb114401.gif)
FPGA课程设计基于RAM的十口8位计数器
西安邮电学院
FPGA课程设计报告
题目:
基于RAM的十口8位计数器
院系:
通信与信息工程学院
专业班级:
电科0902班
学生姓名:
赵荷
导师姓名:
刘正涛
起止时间:
2012-9-10至2012-9-21
年月日
FPGA课程设计报告提纲
1.任务
用一个10×8的双口RAM完成10个8位计数器,计数器的初值分别为1~10,时钟频率为1MHz,计数器计数频率为1Hz。
用FPGA开发板上的按键作为计数器计数值的输出选择控制,数码管(或led)作为选择计数器的计数值输出。
2.目的
采用RAM实现计数器及FPGA功能验证
3.使用环境(软件/硬件环境,设备等)
前仿modelsim6.1f
后仿 QuartusII 10.1
4.FPGA课程设计详细内容
4.1技术规范
功能:
1.先由复位键从选定的RAM地址中读出预置的8位初值存入计数模块。
2.由开始键开始计数,暂停键暂停计数并同时存入RAM中以选定的存储单元。
3.双端口RAM为10×8RAM由一个地址切换键按顺序切换1~10个地址端口。
4.系统工作流程:
切换端口读出数据开始计数暂停计数存入数据
计数流程
5.切换端口读出数七段显示译码器译码输出到数码管显示
读取结果输出流程
6.分频:
1Hz的秒计时频率,用来进行秒计时;
4.2设计方案
信号定义:
Clk_50MHz
clk_1Hz
resetclk_1MHz
分频:
1Hz的秒计时频率,用来进行秒计时
分频:
时钟信号clk_50MHz;
分频信号clk_1Hz;
分频信号clk_1MHz;
clk
clk_1hz
dout[7:
0]din[7:
0]
start
startreset
切换端口读出数据开始计数暂停计数存入数据
计数:
开始计数start
计数器复位reset;
计数输出din[7:
0];
计数置数add;
dout
显示模块
RAM:
10×8的RAM存储阵列10个字每个子8位
输入端输入地址wr_address[3:
0];
输入数据din[7:
0];
上升沿有效写入信号wr;
输出端输出地址rd_address[3:
0];
输出数据dout[7:
0];
上升沿有效读信号rd;
端口
I/O
功能
rd
I
读使能,高电平有效;系统使能工作,将din数据写入ram的存储单元中
wr
O
写使能,高电平有效;将ram存储单元中的数据读出dout.
Wr_address[3:
0]
I
写地址
din[7:
0]
I
数据输入口,内部接口
dout[7:
0]
O
数据输出,内部数据传送
reset
I
复位端,时钟下降沿有效
add
I
计数器置数端
start
I
开始/暂停键,高电平开始,低电平暂停
Rd_address[3:
0]
I
读地址
rd_clk
I
读时钟,下降沿触发
wr_clk
I
写时钟,上升沿触发
地址划分:
ain[3:
0]
Ram存储单元
0001
0000_0001
0010
0000_0010
0011
0000_0011
0100
0000_0100
0101
0000_0101
0110
0000_0110
0111
0000_0111
1000
0000_1000
1001
0000_1001
1010
0000_1010
4.3功能验证方案
(1)验证对象及目的
本验证方案将描述对双端口RAM计数器的验证。
在本文中验证指使用软件工具对其功能进行验证。
双端口RAM计数器功能和指标的详细描述请参见《双端口RAM计数器技术规范.doc》
在本文所描述的验证过程中侧重对RAM数据的读取进行验证,指标主要在硬件验证和测试过程中完成。
在本验证过程中将验证以下内容:
(2)验证环境及工具
根据情况验证过程将使用以下的环境和工具进行:
a)windows环境下使用ModelSim仿真工具;
b)windows环境下使用QuartusII工具。
为进行验证还应当建立仿真激励模块
(3)预确认
a.系统主要技术参数;
经分析,系统的的主要参数包括:
引脚数目,引脚工作电压,电源电压,系统的工作频率。
b.系统的模块数目及各模块实现的功能及如何知道模块工作正常;
c.总模块验证,看总系统是否正常工作。
(4)仿真确认:
a.目的
初步确认系统是否完成预期设计的功能;
先分析芯片所有模块连接关系,如下图
b.逐个完成各个模块的验证
分频模块:
由于系统提供的频率为50MHz而计数时需要的是每秒那样计数,故需要将50MHz分频为1Hz.可为该程序编写激励,得到输出,用输出的频率与想要得到的1Hz的信号进行比较,即可验证。
计数模块:
编写完成后可通过查看仿真图形确认计数范围,位宽等功能的正确。
RAM存取模块:
需在仿真中编写测试激励对RAM进行存取验证,在仿真图形中确认RAM的存取功能的正确性。
显示模块:
把计数的结果通过七段显示译码器显示在数码管上,观察数码管上的数字变化规律即可验证显示模块是否正确。
c.验证空标志产生逻辑:
先将复位信号置0(有效),在一定时间内看系统是否产生空标志;
d.验证正常情况下的信号:
系统运行时,让复位信号为1(即复位无效),根据输入信号得出输出信号,与想要得到的信号进行比较。
4.4电路设计源代码,功能仿真激励源代码及功能仿真结果报告
分频器模块:
moduleFPQ(clk_50MHz,clk_1MHz,reset,clk_1Hz);
inputclk_50MHz,reset;
outputclk_1MHz,clk_1Hz;
regclk_1Hz=0;
regclk_1MH
z=0;
reg[31:
0]cnt1=32'd0;
reg[31:
0]cnt2=32'd0;
always@(posedgeclk_50MHzornegedgereset)
begin
if(!
reset)
clk_1Hz<=32'd0;
else
begin
if(cnt1==32'd100)
begin
cnt1<=32'd0;clk_1Hz<=~clk_1Hz;
end
else
cnt1<=cnt1+32'd1;
end
end
always@(posedgeclk_50MHzornegedgereset)
begin
if(!
reset)
clk_1MHz<=32'd0;
else
begin
if(cnt2==32'd255)
begin
cnt2<=32'd0;
clk_1MHz<=~clk_1MHz;
end
else
cnt2<=cnt2+32'd1;
end
end
endmodule
分频器模块激励:
moduleFPQ_test;
regclk_50MHz,reset;
wireclk_1MHz;wireclk_1Hz;
always#2clk_50MHz=~clk_50MHz;
FPQfpq(.reset(reset),.clk_50MHz(clk_50MHz),.clk_1MHz(clk_1MHz),.clk_1Hz(clk_1Hz));
initial
begin
reset<=0;
clk_50MHz<=0;
#100reset<=1;
end
endmodule
计数器模块:
moduleJSQ(start,data,clk_1Hz,add,c_out);
inputclk_1Hz,add;
inputstart;
input[7:
0]data;
outputc_out;
reg[7:
0]c_out;
always@(posedgeclk_1Hzornegedgeadd)
begin
if(!
add)
begin
c_out<=data;
end
else
begin
if(start)
begin
c_out<=c_out+8'd1;
if(c_out==8'd255)
begin
c_out<=0;
end
else
c_out<=c_out+8'd1;
end
else
c_out<=c_out;
end
end
endmodule
计数器激励:
moduleJSQ_test;
regstart,add;
regclk_1Hz;
reg[7:
0]data;
wire[7:
0]c_out;
always#1clk_1Hz=~clk_1Hz;
JSQjsq(.start(start),.add(add),.clk_1Hz(clk_1Hz),.data(data),.c_out(c_out));
initial
begin
clk_1Hz=0;
add=0;
start=0;
data=8'd1;
#15add=1;
#15start=1;
#600start=0;
end
endmodule
数码管显示模块:
moduleSMG(clk_1MHz,data,data_g,data_s,data_b);
input[7:
0]data;
inputclk_1MHz;
outputdata_b;
outputdata_s;
outputdata_g;
reg[6:
0]data_b;
reg[6:
0]data_s;
reg[6:
0]data_g;
reg[7:
0]mid_b;
reg[7:
0]mid_s;
reg[7:
0]mid_g;
always@(posedgeclk_1MHz)
begin
mid_b<=data/100;
mid_s<=data%100/10;
mid_g<=data%10;
end
always@(mid_b)
begin
case(mid_b)
7'd0:
data_b<=7'hC0;
7'd1:
data_b<=7'hF9;
7'd2:
data_b<=7'hA4;
7'd3:
data_b<=7'hB0;
7'd4:
data_b<=7'h99;
7'd5:
data_b<=7'h92;
7'd6:
data_b<=7'h82;
7'd7:
data_b<=7'hf8;
7'd8:
data_b<=7'h80;
7'd9:
data_b<=7'h90;
default:
data_b<=7'hC0;
endcase
end
always@(mid_s)
begin
case(mid_s)
7'd0:
data_s<=7'hC0;
7'd1:
data_s<=7'hF9;
7'd2:
dat