DE2上使用OC8051运行点灯程序一Word文件下载.docx
- 文档编号:16999060
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:15
- 大小:494.48KB
DE2上使用OC8051运行点灯程序一Word文件下载.docx
《DE2上使用OC8051运行点灯程序一Word文件下载.docx》由会员分享,可在线阅读,更多相关《DE2上使用OC8051运行点灯程序一Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
q'
outputport复选框中取消选中,也就是输出没有锁存。
选择初始化文件是上面创建的mif文件,同时设置一个InstanceID,这样就可以在代码运行时从QuartusII中查看修改ROM内容。
这样Rom就创建好了。
四、创建RAM
参考上述步骤3创建RAM,但是数据宽度变为8,并且不需要使用MIF文件初始化RAM,给出截图如下:
五、修改源代码
(1)修改oc8051_rom.v,将其内容替换为如下:
`include"
oc8051_timescale.v"
oc8051_defines.v"
moduleoc8051_rom(rst,clk,addr,ea_int,data_o);
//parameterINT_ROM_WID=15;
inputrst,clk;
input[15:
0]addr;
//input[22:
outputea_int;
output[31:
0]data_o;
regea_int;
parameterINT_ROM_WID=12;
assignea=|addr[15:
INT_ROM_WID];
always@(posedgeclkorposedgerst)
if(rst)
ea_int<
=#11'
b1;
elseea_int<
=#1!
ea;
oc8051_altera_romoc8051_altera_rom1(.address(addr[11:
0]),.clock(clk),.q(data_o));
endmodule
上面代码的主要作用就是使用刚刚创建的ROM做为CPU内部ROM。
(2)修改defines在72行添加`defineOC8051_RAM_Altera,取消掉第64行`defineOC8051_ROM前面的注释,将第75行`defineOC8051_RAM_GENERIC注释掉。
(3)修改oc8051_ram_256x8_two_bist,将126-146行使用下列代码替换:
`ifdefOC8051_Altera_RAM
oc8051_altera_ramoc8051_altera_ram1(
.rdclock(clk),
.rd_aclr(rst),
.rden(rd_en),
.rdaddress(rd_addr),
.q(rd_data),
.wrclock(clk),
.wren(wr),
.wraddress(wr_addr),
.data(wr_data)
);
然后注释掉169行的'
endif。
六、添加TestBench文件
(1)新建一个VerilogHDL文件,文件名为oc8051_tb.v,这是一个测试文件,内容如下:
//synopsystranslate_off
//synopsystranslate_on
moduleoc8051_tb;
//parameterFREQ=20000;
//frequencyinkHz
parameterFREQ=12000;
parameterDELAY=500000/FREQ;
regrst,clk,int0,int1,rxd;
reg[7:
0]p0_in,p1_in,p2_in;
wire[31:
0]idat_i;
wire[15:
0]ext_addr,iadr_o;
wirewrite,write_xram,write_uart,int_uart,txd,t0,t1,bit_out,stb_o;
wireack_xram,ack_uart,cyc_o,istb_o,icyc_o,t2,t2ex;
wire[7:
0]data_in,data_out,p0_out,p1_out,p2_out,p3_out,data_out_uart,data_out_xram;
0]p3_in;
regwbi_err_i,wbd_err_i;
regiack_i,ack_i;
regea;
oc8051_topoc8051_top_1(.wb_rst_i(rst),.wb_clk_i(clk),
.int0_i(int0),.int1_i(int1),
.wbd_err_i(wbd_err_i),.wbd_ack_i(dack_i),
.wbd_cyc_o(cyc_o),
.wbi_adr_o(iadr_o),.wbi_stb_o(istb_o),.wbi_ack_i(iack_i),
.wbi_cyc_o(icyc_o),.wbi_dat_i(idat_i),.wbi_err_i(wbi_err_i),
`ifdefOC8051_PORTS
`ifdefOC8051_PORT0
.p0_i(p0_in),
.p0_o(p0_out),
`endif
`ifdefOC8051_PORT1
.p1_i(p1_in),
.p1_o(p1_out),
`ifdefOC8051_PORT2
.p2_i(p2_in),
.p2_o(p2_out),
`ifdefOC8051_PORT3
.p3_i(p3_in),
.p3_o(p3_out),
`ifdefOC8051_UART
.rxd_i(rxd),.txd_o(txd),
`ifdefOC8051_TC01
.t0_i(t0),.t1_i(t1),
`ifdefOC8051_TC2
.t2_i(t2),.t2ex_i(t2ex),
.ea_in(ea));
initialbegin
clk=1'
b0;
rst=1'
ea=1'
wbd_err_i=1'
ack_i=1'
iack_i=1'
wbi_err_i=8'
h00;
#100
rst=1'
#1200
$finish;
end
alwaysclk=#10~clk;
上面的测试代码定义了时钟周期是20ns,注意的是要给ack_i、iack_i、wbd_err_i、wbi_err_i赋初值,否则会导致时序仿真出现异常。
(2)点击Assignments->
Setting,选择EDAToolsSetting->
Simulation,如下设置:
主要是设置testbench的文件。
七、功能仿真
(1)编译
(2)选择功能仿真,如下:
安装的是ModelSimAse6.6d版,这里的Ase指的是AlteraStarterEdition。
ModelSim打开后会自动运行测试文件,前面已经设置过测试文件,仿真结果如下:
Rst为1表示CPU复位,此时p1_out输出为0xff,rst为0表示开始运行,之后经过几个时钟周期,p1_out输出为0x55,满足预期设计。
关闭ModelSim。
八、时序仿真
(1)选择时序仿真,如下:
在弹出对话框中点击RUN。
ModelSim打开后会自动运行测试文件,但在时序仿真中添加有芯片的时延信息,仿真结果与最后实际更接近,仿真结果如下:
可见时序仿真并没有出来希望的结果,P1的值始终是复位时的0xff。
查看QuartusII在编译时的告警,有下面一种告警:
Warning(10208):
VerilogHDLCaseStatementwarningatoc8051_alu_src_sel.v(97):
honoredfull_casesynthesisattribute-differencesbetweendesignsynthesisandsimulationmayoccur
(2)再次修改源文件
在oc8051的原文件中使用了很多case分支语句,但是有时可能并没有考虑到所有的case,例如:
modulefull_case(a,sel,y);
input[3:
0]a;
input[1:
0]sel;
outputy;
regy;
always@(aorsel)
case(sel)
2'
b00:
y=a[0];
b01:
y=a[1];
b10:
y=a[2];
endcase
上述代码中sel有四种情况,但是这里只列出了三种情况,在oc8051中采用如下方法告诉分析合成工具不要理会那些未指出的情况,
/*synopsysfull_caseparallel_case*/
通过在case后面添加注释实现上述目的,这种方式在Quartus中需要改为“//synthesisfull_case”,所以需要将所有的这种不完全case语句后面的“/*synopsys......*/”改为“//synthesis……”。
但是后来发现还是不起作用,最后决定将所有的case都加上“default:
;
”具体有如下一些地方:
oc8051_decoder.v的2677行、oc8051_alu_src_sel.v的105行、oc8051_memory_interface.v的536、957行、oc8051_indi_addr.v的109行、oc8051_sfr.v的646、704行、oc8051_psw.v的141行、oc8051_ports.v的192、213行、oc8051_uarts.v的195行、oc8051_int.v的197行、oc8051_tc.v的225行。
修改之后在进行时序仿真,结果正常。
九、下载到DE2
在QuartusII中指定pin,这里使用的是DE2开发板,将P1接口连接都LED灯,需要注意的是一定要将wbd_ack_i、wbi_err_i、wbd_err_i、wbi_ack_i指定管脚,并且该管脚要输入低电平,一开始没有这么做,直接设置高阻输入,怎么都不出现结果,虽然功能仿真正确,但是综合后的时序仿真就失败。
后来发现在memoryinterface代码中有下面的条件判断语句:
always@(dack_irorddat_irorop1_ooriram_outorcdoneorcdata)
if(dack_ir)
op1_out=ddat_ir;
elseif(cdone)
op1_out=cdata;
else
op1_out=op1_o;
这里的dack_ir就是输入dack_i的值,而从oc8051_top中可知dack_i就是整个CPU的输入wbd_ack_i,时序仿真中wbd_ack_i设置为高阻态,这里可能就无法判断,从而无法赋值,op1_out的值就确定不了,在功能仿真中可能就直接忽略了,默认为0,所以功能仿真中能通过,时序仿真通过不了。
可能还有很多这种判断,所以在最后将wbd_ack_i、wbi_err_i、wbd_err_i、wbi_ack_i都指定相应的管脚连接,并且管脚处于低电平,其余未用的输入管脚置于高阻态,未用的输出管脚接地。
还有一点就是ea输入要是高电平,这样8051才会从内部ROM中读取指令,否则会试图读取外部ROM,而在这里只有内部ROM,所以输入ea要接高电平。
这样就可以了下载执行了。
虽然下载DE2上已经下载并运行了OC8051,但是此处的OC8051还是有问题的,具体参考“DE2上使用OC8051运行点灯程序
(二)”
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DE2 使用 OC8051 运行 点灯 程序