内嵌BRAM设计LIFO.docx

上传人:b****8 文档编号:9966137 上传时间:2023-05-22 格式:DOCX 页数:17 大小:226.04KB
下载 相关 举报
内嵌BRAM设计LIFO.docx_第1页
第1页 / 共17页
内嵌BRAM设计LIFO.docx_第2页
第2页 / 共17页
内嵌BRAM设计LIFO.docx_第3页
第3页 / 共17页
内嵌BRAM设计LIFO.docx_第4页
第4页 / 共17页
内嵌BRAM设计LIFO.docx_第5页
第5页 / 共17页
内嵌BRAM设计LIFO.docx_第6页
第6页 / 共17页
内嵌BRAM设计LIFO.docx_第7页
第7页 / 共17页
内嵌BRAM设计LIFO.docx_第8页
第8页 / 共17页
内嵌BRAM设计LIFO.docx_第9页
第9页 / 共17页
内嵌BRAM设计LIFO.docx_第10页
第10页 / 共17页
内嵌BRAM设计LIFO.docx_第11页
第11页 / 共17页
内嵌BRAM设计LIFO.docx_第12页
第12页 / 共17页
内嵌BRAM设计LIFO.docx_第13页
第13页 / 共17页
内嵌BRAM设计LIFO.docx_第14页
第14页 / 共17页
内嵌BRAM设计LIFO.docx_第15页
第15页 / 共17页
内嵌BRAM设计LIFO.docx_第16页
第16页 / 共17页
内嵌BRAM设计LIFO.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

内嵌BRAM设计LIFO.docx

《内嵌BRAM设计LIFO.docx》由会员分享,可在线阅读,更多相关《内嵌BRAM设计LIFO.docx(17页珍藏版)》请在冰点文库上搜索。

内嵌BRAM设计LIFO.docx

内嵌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日内。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2