工作笔记.docx
《工作笔记.docx》由会员分享,可在线阅读,更多相关《工作笔记.docx(11页珍藏版)》请在冰豆网上搜索。
![工作笔记.docx](https://file1.bdocx.com/fileroot1/2022-12/12/41515743-44e8-4e44-830e-0e8f7aefcacf/41515743-44e8-4e44-830e-0e8f7aefcacf1.gif)
工作笔记
Virtex-4系列的FPGA
Virtex-4系列的FPGA采用了高级硅模组(AdvancedSiliconModularBlock,ASMBL)架构。
ASMBL架构从两个级别对设计进行了提升,一是解决基于应用领域的设计问题;二是解决在传统ASIC和FPGA设计中都存在的一些技术约束问题。
Virtex-4系列具有3个平台:
用于高性能和高密度综合应用的LX平台(面向逻辑优化的平台);用于高性能信号处理的SX平台(面向信号处理优化的平台);用于全功能处理和SoC嵌入式设计连接应用的FX平台(全功能平台)。
可配置的逻辑块(ConfigurableLogicBlocks,CLB)是实现时序和组合电路的最主要的逻辑资源。
每个CLB单元包含4个互连的Slice。
Virtex-4的每个BRAM可存储18Kb的数据,数据读出的时钟频率为500MHz。
Virtex-4系列最小规模的FPGA器件包含48个BRAM;Virtex-4系列最大规模的FPGA器件具有552个BRAM。
器件中Slice和CLB之间的数量关系:
1个CLB逻辑模块具有4个Slice,1CLB=4Slice;
1个Slice包括2个LUT、2个触发器以及算术逻辑,1Slice=2×16位LUT+2触发器+算术逻辑/MUX;每个Slice具有=2×16位LUT,总的分布式RAM的容量为16×6144=98304=96×1024=96Kb(只有SLICEM的LUT可被用做分布式RAM)。
DSP48Slice是Virtex-4器件上的XtremeDSP部件。
每个XtremeDSP单元都包括两个DSP48Slice,构成了一种通用的DSP计算元件。
DSP48Slice可执行一个18×18位的乘法以产生一个36位的乘积,该乘积在一个48位累加器中实现了累加(这就是用“48”命名DSP单元的原因)。
Virtex-5系列的FPGA
Virtex-5FPGA基于65nm的三栅极氧化层技术,使用先进的硅组合模块(ASMBL)架构并且实现了更高级别的系统集成。
Modelsim仿真流程
modelsim仿真流程:
modelsim基本的仿真流程包括建立库、建立工程并编译、仿真、调试、但在libero环境中运行modelsim时,软件自动映射库和生成工程文件。
其中功能仿真、综合仿真以及后仿真分别映射presynth、postsynth和postlayout库。
基本流程是:
建立工作库→编译源代码→启动仿真→分析、调试。
♥快捷操作:
※使用“拖-放”操作,直接从信号、结构等窗口向wave窗口中拖放;
※波形放大缩小等操作,放大-键盘“+”,缩小-键盘“-”;
※区域放大,选中的区域全屏显示;
※使添加光标,可以利用光标时间差计算周期等参数;
※显示/隐藏信号路径,方便阅读;
♥设置断点:
※右击变量,选择‘InsertBreakpoint’;当选中的变量波形值发生变化时,仿真自动暂停。
♥保存/打开列表:
※波形列表为.do可执行脚本文件;打开列表可以使用do.do命令执行;※waveformformats选项保存变量、显示方式及变量相对位置等属性;
♥保存/打开波形:
※波形文件为.wlf格式文件,使用File>datasets>saveas来保存波形;※波形文件可用于波形对比的对象,使用File>datasets>open来打开;
♥波形对比:
※在AE版本中,只能实现简单的手动对比波形;
※用File>datasets方式打开波形文件,向wave窗口中添加需要对比的信号;
♥分析数据――list:
表格化显示数据,方便通过搜索特殊值或者特定条件的数据,简化分析数据的过程。
List窗口可通过菜单View>list,或者命令viewlist打开。
♥分析数据――source:
source窗口具有完全的编辑能力,同时提供分析数据的一些操作。
Source窗口可通过双击workspace的总的文件或信号打开。
※查看变量值:
鼠标停留在变量上面,可显示当前值;※设置断点:
source源代码窗口设置条件断点;
♥分析数据――Memories:
memory窗口列出工程中存储单元的数据,方便调试存储器的操作。
※step1:
展开调用RAM单元的模块,并展开至RAM_ROC>STATCONFIG;※step2:
objects窗口选择MEM_512_9选择ViewMemoryContonts;
♥分析数据――watch:
watch窗口中可实现监测变量的变化情况,watch窗口可通过菜单view>watch,或者命令viewwatch打开。
Watch窗口中的对象可以以拖拉的方式从object窗口、wave窗口、source窗口中拖拉进来;
♥分析数据――signals:
signals窗口显示被选中进程模块的变量、变量值。
Signals窗口可通过菜单view>signals,或者命令viewsignals打开。
※排序:
支持按字母的升序或降序排列。
※拖放操作:
可以将信号拖动到wave、list、watch窗口;※过滤器:
选择要察看的信号(输入、输出部信号等等)。
※对信号右键操作,可查看源代码;
WaveformCompare波形对比能快速定位设计在修改前后的区别,在进行波形对比之前要保存原设计的波形文件,此文件为作为对比文件。
※step1:
打开波形对比向导设置;tools->waveformcompare->comparisonwizard;※step2:
导入波形文件,作为对比对象;※step3:
选择对比信号的范围;※step4:
根据信号范围选择需要对比的信号;※step5:
分析数据;
追踪数据流:
数据流窗口能够对VHDL信号或者Verilog的线网型变量进行图示化跟踪,在界面中驱动信号或驱动线网变量的进程显示在左边,反之被驱动信号显示在右边。
可通过双击wave窗口中需要追踪的信号打开dataflow窗口。
※观察设计的连接性:
可以检查设计的物理连接性,可以逐个单元的观察所关注的信号、互联网络或寄存器的输入/输出情况。
※跟踪事件:
跟踪一个非预期的输出事件,使用嵌入波形观察器,可以由一个信号的跳变回溯追踪,查到事件的源头。
※追踪未知态:
未知态在设计中是传递的,用dataflow中Trace>chaseX功能很容易追踪不定态的来源。
※显示层次结构:
可以使用层次化实例显示设计的连通性。
数据流窗口追踪不定态的功能是工程师比较青睐的,在dataflow窗口中使用Trace>ChaseX功能,不断往驱动级追踪不定态传递的源头。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
view*观察包括signals、wave、dataflow等窗口文件。
例:
viewsignals观察信号变量。
quit-f/-force/-sim 该命令分别是退出ModelSim(-f/-force)和退出仿真(-sim)。
run–all命令用来一直仿真下去。
在ModelSimSE中使用批处理方式来简仿化真步骤,具体做法为,将你所要执行的命令编辑成file.do文件,文件内容如下:
vlibwork //建库
vmapworkwork //映射
vlog*.v*_tb.v //编译
vsim ***_tb //仿真(模块名称)
addwave/***_tb/* //将***_tb下的所有信号变量加入到wave窗口中,注意”*”
例:
a.没有调用IPCore时
quit-sim
cdE:
/mycounter/modelsim
vlibwork
vlog+acc"E:
/mycounter/modelsim/*.v"
vsim-tps-novoptwork.mycounter_tb
viewwave
addwave-dec/mycounter_tb/*#没有调用IPCore时的仿真命令,注意后面的参数必须为Testbench中的模块名。
addwave-dec/mycounter_tb/uut/*
run10us
例:
b.调用IPCore时
quit-sim
cdE:
/signal_gen/testbench
vlibwork
vlog+acc"E:
/signal_gen/testbench/signal_gen_top_tb.v"
vlog+acc"E:
/signal_gen/source/*/*.v"
vlog+acc"E:
/signal_gen/source/*/*/*.v"
vlog+acc"C:
/Xilinx/12.4/ISE_DS/ISE/verilog/src/glbl.v"
vsim-LD:
/modeltech_6.6a/Xilinx_Lib/simprims_ver-LD:
/modeltech_6.6a/Xilinx_Lib/unisims_ver-LD:
/modeltech_6.6a/Xilinx_Lib/XilinxCoreLib_ver-LD:
/modeltech_6.6a/Xilinx_Lib/unimacro_ver-tps-novoptwork.signal_gen_top_tbwork.glbl
viewwave
deletewave*
addwave-dec/*
addwave-dec/u_signal_gen_top/*
addwave-dec/u_signal_gen_top/u_nco/*
run10ms
Modelsim中的读写文本操作
.Modelsim读文本操作
reg[11:
0]data[0:
2000];
initialbegin
$readmemb("data.txt",data,0,1000);
end
2.Modelsim写文本操作
integerfid;
wiresigned[15:
0]dout;
initial
begin
//打开文件“e:
\signal_gen\testbench\dac_data.txt”
fid=$fopen("e:
/signal_gen/testbench/dac_data.txt");
#(CPU_START_CYCLE);
repeat(DATA_NUM)begin
@(posedgedac_clk)//在时钟的上升沿读接口模块的数据,并将其存入文件
$fdisplay(dds_dout_fid,"%d",dout);
end
$fclose(dds_dout_fid);
end
MATLAB中的重要应用
恢复matlab原始界面desktop->desktoplayout->default
区分大小写,Inf是无穷大,NaN是不定值
eye()单位矩阵,zeros()全零矩阵,ones()全一矩阵
gridon加网格gridoff不加网格
legend(),figure,holdon保持,holdoff
loglog(x,y),semilogx(x,y),semilogy(x,y)
mean(x)求数组x中所有元素的平均值
axis([02*pi-11]);
1.画图函数
Ø%绘制单位脉冲响应
subplot(221);stem(b_lpf);xlabel('n');ylabel('h(n)');
title('低通滤波器的单位脉冲响应','fontsize',8);%设置字体大小
Ø%求滤波器的幅频响应
m_lpf=20*log(abs(fft(b_lpf)))/log(10);%时域到频域转换
%设置幅频响应的横从标单位为Hz
x_f=[0:
(fs/length(m_lpf)):
fs/2];
subplot(222);plot(x_f,m_lpf(1:
length(x_f)));
xlabel('频率(Hz)','fontsize',8);ylabel('幅度(dB)','fontsize',8);
title('低通滤波器的幅频响应','fontsize',8);
Ø%绘制幅频响应曲线
plot(x_f,m1,'-',x_f,m2,'*',x_f,m3,'+',x_f,m4,'--',x_f,m5,'-.');
xlabel('频率(Hz)');ylabel('幅度(dB)');
legend('矩形窗','汉宁窗','海明窗','布拉克曼窗','凯塞窗');
2.频谱分析函数fvtool
h=fvtool(data(1:
data_len));%%选择前面的8192点分析其频谱,没有图形时可以去掉长度限制
set(h,'Fs',fs,'NormalizeMagnitudeto1','on','FrequencyRange','[0,Fs/2)','NumberofPoints',data_len/2);
3.滤波器函数FDAtool
参考《数字滤波器的MATLAB与FPGA实现》P130
4.数据量化
N=12;%量化位数
%noi=rand(1,length(t));%产生均匀分布的随机序列
noise=randn(1,length(t));%产生高斯白噪声序列
%归一化处理
noise=noise/max(abs(noise));
%12比特量化
Q_noise=round(noise*(2^(N-1)-1));
MATLAB的读写文本操作
可以使用Excel进行数值转换:
十六进制转十进制HEX2DEC(),十进制转十六进制DEC2HEX(),二进制转十进制BIN2DEC(),十进制转二进制DEC2BIN()。
eg:
指定转换位数,通过操作与对比,建议使用转换成二进制用于Modelsim进行数据分析,十六进制的转换Excel转换不稳定。
.MATLAB读文本操作
fid=fopen('data.txt','r');
[data,N]=fscanf(fid,'%lg',inf);%读入二进制文件,N是用于计数的
fclose(fid);
fid=fopen('e:
\signal_gen\testbench\dac_data.txt','r');
[dac_data,N]=fscanf(fid,'%d');%读入十进制文件
fcloseall;
2.MATLAB写文本操作
%将生成的数据以十进制数据格式写入txt文件中
fid=fopen('data.txt','w');
fprintf(fid,'%8d\r\n',DATA);
fprintf(fid,';');
fclose(fid);
时序约束
约束实例:
##########################################################################
##assignpackagepins##
##########################################################################
#-------------------------------clock----------------------------------#
NET"sys_clk_153p6_p"LOC=B14|IOSTANDARD=LVDS_33;
NET"sys_clk_153p6_n"LOC=A14|IOSTANDARD=LVDS_33;
NET"dac_clk_153p6"LOC=K14|IOSTANDARD=LVCMOS33;
#------------------------------FPGAreset------------------------------#
NET"rst_n"LOC=AA13|IOSTANDARD=LVCMOS33|IOB=TRUE;
#---------------------------hardwareversion---------------------------#
NET"hw_version[0]"LOC=W15|IOSTANDARD=LVCMOS33;
NET"hw_version[1]"LOC=V16|IOSTANDARD=LVCMOS33;
NET"hw_version[2]"LOC=U16|IOSTANDARD=LVCMOS33;
NET"hw_version[3]"LOC=Y17|IOSTANDARD=LVCMOS33;
#-----------------------------CPUinterface----------------------------#
NET"cpu_wr_n"LOC=K7|IOSTANDARD=LVCMOS33|IOB=TRUE;
NET"cpu_rd_n"LOC=J6|IOSTANDARD=LVCMOS33|IOB=TRUE;
NET"cpu_cs_n"LOC=G3|IOSTANDARD=LVCMOS33|IOB=TRUE;
NET"cpu_addr[0]"LOC=F3|IOSTANDARD=LVCMOS33;
NET"cpu_addr[1]"LOC=L10|IOSTANDARD=LVCMOS33;
#-----------------------------DACinterface----------------------------#
NET"dac_data_p[0]"LOC=A12|IOSTANDARD=LVDS_33|IOB=TRUE;
NET"dac_data_n[0]"LOC=B12|IOSTANDARD=LVDS_33|IOB=TRUE;
#-----------------------------LEDinterface----------------------------#
NET"led_ind"LOC=T3|IOSTANDARD=LVCMOS33|IOB=TRUE;
##########################################################################
##timingconstraint##
##########################################################################
#------------------------------clock---------------------------------#
NET"sys_clk_153p6"TNM_NET="sys_clk_153p6";
TIMESPECTS_clk_153p6=PERIOD"sys_clk_153p6"162MHzHIGH50%;
NET"dac_clk_153p6"TNM_NET="dac_clk_153p6";
TIMESPECTS_dac_clk=PERIOD"dac_clk_153p6"162MHzHIGH50%;
#--------------------------From-Toroute-----------------------------#
#cpu_interface
INST"u_cpu_interface/u_cpu_wr_reg/cpu_data_flg"TNM="CPU_WR_FFs";
INST"u_cpu_interface/u_cpu_wr_reg/cpu_wr_data_reg_?
"TNM="CPU_WR_FFs";
INST"u_cpu_interface/u_cpu_wr_reg/cpu_wr_data_reg_?
?
"TNM="CPU_WR_FFs";
INST"u_cpu_interface/u_cpu_rd_reg/cpu_rd_data_?
"TNM="CPU_RD_FFs";
INST"u_cpu_interface/u_cpu_rd_reg/cpu_rd_data_?
?
"TNM="CPU_RD_FFs";
TIMESPECTS_CPU_WR_FFs=FROM"CPU_WR_FFs"TOFFS20ns;
TIMESPECTS_CPU_RD_FFs=FROMFFSTO"CPU_RD_FFs"20ns;
#--------------------------------end---------------------------------#
XilinxFIFOIPcore使用注意事项
1、almostfull和almostemptyflags用来指示只剩一个字了。
2、Programmablefullandemptystatusflags可以由用户自定义内容设定或者用专用的输入口进行设定。
3、对于V5的blockRAM和built-inFIFO可以使用内嵌的寄存器。
使用这个寄存器可以提高FIFO的性能,但是增加延迟。
4、FIFO常用于:
跨时钟域操作和数据位宽转换。
例如:
两个独立的时钟域,独立的数据位宽,可以利用一个FIFO进行连接,如下图所示:
FIFO可以自动完成数据位宽的转换。
5、当需要用到大块的FIFO时,可以使用V5built-inFIFO
6、First-WordFall-Through(FWFT)特性是指,可以在没有进行读操作的时候,就可以提前知道下一个数据是什么,并且自动将这个数据放到输出数据线(DOUT)上。
FWFT在要求低访问延迟时,很有用。
这几种FIFO支持FWFT特性:
blockRAM,distributedRAM,V5built-inFIFO
7、FIFO接口信号
在写操作时,注意一下几个信号:
(1)、FULL:
当FULL有效时,所有的写操作都将被忽略,并且这时对FIFO的写操作不会对FIFO造成损坏。
(2)、ALMOST_FULL:
当这个信号有效时,说明还可以再进行一次写操作
(3)、FROG_FULL:
当FIFO得数据大于或者等于设定的门限时,这个信号有效;当FIFO得数据小于这个设定的门限时,这个信号无效。
(4)、OVERFLOW:
这个信号用来指示在前一个时钟周期的写请求(WR_EN)被拒绝,因为FIFO已经满了。
(5)