内嵌BRAM设计LIFO.docx
《内嵌BRAM设计LIFO.docx》由会员分享,可在线阅读,更多相关《内嵌BRAM设计LIFO.docx(17页珍藏版)》请在冰点文库上搜索。
内嵌BRAM设计LIFO
大学实验报告
课程名称:
数字系统现场集成技术
实验项目名称:
实验三(内嵌BRAM设计LIFO堆栈)
学院:
专业:
集成电路设计与集成系统
指导教师:
报告人学号
实验时
实验报告提交时间:
教务部制
实验目的与要求:
基本要求:
该实验为团队协作,2人一个小组。
具有先进后出的堆栈功能。
此LIFO堆栈具有两个按键(write,read),按下write键后,开始输入数据data0-data3;按下read键后,7段数码管开始倒序显示data3-data0(十进制)。
实验最终达到效果:
本实验效果:
设计一个16位位深,8位位宽的bram,数码管分别显示要往bram里写的数值,当前读写bram的地址,以及从bram读取出来的数值。
数值的输入采用八位拨码开关进行输入,通过数码管可以看出当前拨码开关对应的数值,只要按下lifo的写按钮,就可以往bram里写入当前的值,写了若干个数值后,每按下一次lifo的写按钮,就可以从bram里读取一位数据,显示在数码管上(由于VGA的显示,需要大量编写每个数字对应的像素,较为繁琐,所以本实验采用数码管显示)
实验主要代码(由于代码较多,贴出主要代码):
数码管驱动代码:
moduleseg_drv(
inputclk,
inputrst,
input[7:
0]first_seg,
input[7:
0]second_seg,
input[7:
0]third_seg,
//input[7:
0]forth_seg,
outputreg[3:
0]an,
outputreg[7:
0]seg
);
localparam[1:
0]s0=2'b00,
s1=2'b01,
s2=2'b10,
s3=2'b11;
reg[1:
0]state;
always@(posedgeclk,posedgerst)
begin
if(rst)
begin
an<=4'b1111;
seg<=8'b1111_1111;
state<=s0;
end
else
begin
case(state)
s0:
begin
an<=4'b1110;
seg<=first_seg;
if(ms_up)
state<=s1;
else
state<=state;
end
s1:
begin
an<=4'b1101;
seg<=second_seg;
if(ms_up)
state<=s2;
else
state<=state;
end
s2:
begin
an<=4'b1011;
seg<=third_seg;
if(ms_up)
state<=s3;
else
state<=state;
end
s3:
begin
an<=4'b1111;
seg<=1111_1111;
if(ms_up)
state<=s0;
else
state<=state;
end
endcase
end
end
reg[17:
0]ms_cnt;
regms_up;
always@(posedgeclk,posedgerst)
begin
if(rst)
begin
ms_cnt<=0;
ms_up<=0;
end
else
begin
if(ms_cnt==200000)
begin
ms_cnt<=0;
ms_up<=1;
end
else
begin
ms_cnt<=ms_cnt+1'b1;
ms_up<=0;
end
end
end
endmodule
Lifo读按键代码:
modulebtn_scan_read(
inputclk,
inputrst,
inputbtn,
outputregbtn_down
);
localparam[1:
0]s0=2'b00,
s1=2'b01,
s2=2'b10;
reg[1:
0]state;
always@(posedgeclk,posedgerst)
begin
if(rst)
begin
btn_down<=1'b0;
state<=s0;
end
else
begin
case(state)
s0:
begin
btn_down<=1'b0;
if(btn)
state<=s1;
else
state<=s0;
end
s1:
begin
if(cnt_done)
begin
if(btn)
state<=s2;
else
state<=s0;
end
else
state<=s1;
end
s2:
begin
if(btn==1'b0)
begin
btn_down<=1'b1;
state<=s0;
end
else
begin
btn_down<=btn_down;
state<=s2;
end
end
endcase
end
end
reg[20:
0]cnt;
regcnt_done;
always@(posedgeclk,posedgerst)
begin
if(rst)
begin
cnt<=21'b0;
cnt_done<=1'b0;
end
elseif(state==s1)
begin
cnt<=cnt+1'b1;
if(cnt==21'd2000000)
begin
cnt<=21'b0;
cnt_done<=1'b1;
end
end
else
begin
cnt<=21'b0;
cnt_done<=1'b0;
end
end
Endmodule
Lifo写按键代码:
modulebtn_scan_write(
inputclk,
inputrst,
inputbtn,
outputregbtn_down
);
localparam[1:
0]s0=2'b00,
s1=2'b01,
s2=2'b10;
reg[1:
0]state;
always@(posedgeclk,posedgerst)
begin
if(rst)
begin
btn_down<=1'b0;
state<=s0;
end
else
begin
case(state)
s0:
begin
btn_down<=1'b0;
if(btn)
state<=s1;
else
state<=s0;
end
s1:
begin
if(cnt_done)
begin
if(btn)
state<=s2;
else
state<=s0;
end
else
state<=s1;
end
s2:
begin
if(btn==1'b0)
begin
btn_down<=1'b1;
state<=s0;
end
else
begin
btn_down<=btn_down;
state<=s2;
end
end
endcase
end
end
reg[20:
0]cnt;
regcnt_done;
always@(posedgeclk,posedgerst)
begin
if(rst)
begin
cnt<=21'b0;
cnt_done<=1'b0;
end
elseif(state==s1)
begin
cnt<=cnt+1'b1;
if(cnt==21'd2000000)
begin
cnt<=21'b0;
cnt_done<=1'b1;
end
end
else
begin
cnt<=21'b0;
cnt_done<=1'b0;
end
end
endmodule
Lifo读写代码:
modulelifo_process(
inputclk,
inputrst,
inputbtn_write,
inputbtn_read,
input[7:
0]sw,
outputreg[7:
0]data_out,
output[7:
0]sw_state,
outputreg[7:
0]addra_num
);
///////////
localparam[1:
0]s0=2'b00,
s1=2'b01,
s2=2'b10;
reg[1:
0]state;
reg[7:
0]dina;
regwea;
reg[3:
0]addra;
wire[7:
0]douta;
///////////
LIFOLIFO_core(
.clka(clk),//inputclka
.wea(wea),//input[0:
0]wea
.addra(addra),//input[3:
0]addra
.dina(dina),//input[7:
0]dina
.douta(douta)//output[7:
0]douta
);
always@(posedgeclk,posedgerst)
begin
if(rst)
begin
wea<=1'b0;
dina<=8'b0000_0011;
data_out<=8'b0000_0011;
addra<=4'b0000;
state<=s0;
end
else
begin
case(state)
s0:
begin
wea<=0;
addra<=addra;
if((btn_write)&&(addra<4'b1111))
state<=s1;//jumptowritestate
elseif((btn_read)&&(addra>=4'b0000))
state<=s2;//jumptireadstate
end
s1:
begin//writestate
wea<=1'b1;
dina<=sw;
addra<=addra+1'b1;
state<=s0;
end
s2:
begin//readstate
wea<=1'b0;
data_out<=douta;
addra<=addra-1'b1;
state<=s0;
end
endcase
end
end
//assigndina=wea?
sw:
8'd0;
//always@(posedgeclk,posedgerst)
//begin
//if(rst)
//begin
//dina<=8'd0;
//data_out<=8'd0000_0011;
//end
//elseif(wea==1)
//dina<=sw;
//elseif(wea==0)
//data_out<=douta;
//end
always@(posedgeclk,posedgerst)
begin
if(rst)
addra_num<=8'b0000_0000;
else
case(addra)
4'b0000:
addra_num<=8'b0000_0011;
4'b0001:
addra_num<=8'b1001_1111;
4'b0010:
addra_num<=8'b0010_0101;
4'b0011:
addra_num<=8'b0000_1101;
4'b0100:
addra_num<=8'b1001_1001;
4'b0101:
addra_num<=8'b0100_1001;
4'b0110:
addra_num<=8'b0100_0001;
4'b0111:
addra_num<=8'b0001_1111;
4'b1000:
addra_num<=8'b0000_0001;
4'b1001:
addra_num<=8'b0000_1001;
4'b1010:
addra_num<=8'b0001_0001;
4'b1011:
addra_num<=8'b1100_0001;
4'b1100:
addra_num<=8'b0110_0011;
4'b1101:
addra_num<=8'b1000_0101;
4'b1110:
addra_num<=8'b0110_0001;
4'b1111:
addra_num<=8'b0111_0001;
default:
addra_num<=8'b0000_0000;
endcase
end
assignsw_state=sw;
//assignaddra_num=addra;
endmodule
实验模块图:
实验实际效果图:
(第一个是读取出来的值,第二个是拨码开关显示的值,即要输入的值,最后一位是bram中的地址值)
深圳大学学生实验报告用纸
实验结论:
1.通过该实验,加深了对verilog的理解和学习
2.可以掌握FPGA中内嵌的各种ROM或者RAM的使用,以及相应IP核的使用技巧和方法
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。