VerilogHDL硬件描述语言实验报告Word格式.docx
《VerilogHDL硬件描述语言实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《VerilogHDL硬件描述语言实验报告Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
![VerilogHDL硬件描述语言实验报告Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/28/65602ea7-3150-45bc-8620-7880f9fec674/65602ea7-3150-45bc-8620-7880f9fec6741.gif)
modulepart2(
input[17:
output[17:
0]LEDR,
output[7:
0]LEDG
);
assignLEDR=SW;
mux_8bit_2to1NQ(SW[17],SW[15:
8],SW[7:
0],LEDG);
modulemux_2to1(
inputs,
inputx,y,
outputm
);
assignm=(s&
y)|(~s&
x);
modulemux_8bit_2to1(
inputS,
input[7:
0]X,Y,
output[7:
0]M
);
mux_2to1m7(S,X[7],Y[7],M[7]);
mux_2to1m6(S,X[6],Y[6],M[6]);
mux_2to1m5(S,X[5],Y[5],M[5]);
mux_2to1m4(S,X[4],Y[4],M[4]);
mux_2to1m3(S,X[3],Y[3],M[3]);
mux_2to1m2(S,X[2],Y[2],M[2]);
mux_2to1m1(S,X[1],Y[1],M[1]);
mux_2to1m0(S,X[0],Y[0],M[0]);
测试台文件
`timescale1ns/100ps
modulemux2to1_test;
regx,y;
regs;
wirem;
mux2to1M(s,x,y,m);
initial
begin
x=1;
y=0;
s=0;
#10s=0;
#10s=1;
#10$stop;
end
波形
实验二组合逻辑电路设计
(2)数码和显示
(1)采用always块设计组合逻辑电路;
(2)熟悉二进制-十进制译码器和BCD码加法器等组合逻辑电路。
(1)组合逻辑7段显示译码器
(2)二进制-BCD转换电路
(3)组合逻辑4位全加器
(4)BCD码加法电路
第1部分组合逻辑7段显示译码器步骤
1、1、新建QuartusII工程,在DE2开发板实现该电路。
本试验的目的是用手动方式设计7段显示译码电路。
要求只能使用连续赋值语句,将输出定义为关于输入的逻辑表达式。
2、编写电路的VerilogHDL源文件,并将其包含到Quartus工程。
将FPGA引脚连接到相应的拨动开关和7段显示数码管。
(参考UserManualfortheDE2board)。
引脚分配过程也可以参考QuartusIIIntroductionusingVerilogDesign,该文件可以在Altera公司网站大学计划网站的DE2SystemCD上找到。
3、编译,并且将编译好的电路下载到FPGA中;
4、扳动拨动开关改变电路输入,观察数码管显示并分析电路功能是否正确;
input[17:
output[17:
output[6:
0]HEX0,HEX1,HEX2,HEX3
assignLEDR=SW;
decoder4_7decoder4_7_01(SW[0+:
4],HEX0);
decoder4_7decoder4_7_02(SW[4+:
4],HEX1);
decoder4_7decoder4_7_03(SW[8+:
4],HEX2);
decoder4_7decoder4_7_04(SW[12+:
4],HEX3);
moduledecoder4_7(
input[3:
0]a,
0]HEX
assignHEX[6]=~a[3]&
~a[2]&
~a[1]|a[2]&
a[1]&
a[0];
assignHEX[5]=~a[3]&
a[0]|~a[2]&
a[1]|a[1]&
assignHEX[4]=a[0]|a[2]&
~a[1];
assignHEX[3]=~a[3]&
~a[1]&
a[0]|
a[2]&
~a[0]|
assignHEX[2]=~a[2]&
~a[0];
assignHEX[1]=a[2]&
a[0]|a[2]&
assignHEX[0]=a[2]&
~a[0]|~a[3]&
endmodule
第2部分二进制-BCD转换电路
1、新建QuartusII工程;
2、编译,功能仿真;
验证比较器、数据选择器和电路A的功能是否正确;
3、编写电路B和7段显示译码电路的VerilogHDL代码。
使用DE2开发板上开关SW3-0代表输入V,使用HEX1和HEX0显示数字d1和d0。
确保引脚分配正确;
4、编译,下载编译好电路到FPGA芯片中;
5、拨动拨动开关SW3-0改变收入值V,观察输出显示以测试电路的正确性;
//niqi1307010213
//toplevelw
input[3:
output[3:
output[6:
0]HEX0,HEX1
wire[2:
0]a;
wirez;
wire[3:
0]m;
wire[6:
0]b,HEX;
compartorcompartor_1(SW,z);
circuit_AA(SW[2:
0],a);
mux_4bit_2to1M(z,SW,{1'
b0,a},m);
circuit_BB(z,HEX1);
decoder4_7dec(m,HEX0);
//7-segmentdecoder
a[2]&
//circuit_A
modulecircuit_A(
input[2:
0]v,
output[2:
0]a
assigna=v+3'
o6;
//circuit_B
modulecircuit_B(
inputb,
output[6:
assignHEX=b?
7'
b111_1001:
b111_1111;
//4-bit2-to-1multiplexer
modulemux_4bit_2to1(
inputs,
input[3:
0]x1,x2,
output[3:
0]f
assignf=s?
x2:
x1;
//Comparator
modulecompartor(
outputz
assignz=(v>
4'
h9)?
1'
B1:
B0;
endmodule
实验三锁存器、触发器和寄存器
(1)掌握锁存器、触发器和寄存器的门级描述以及行为级描述;
(2)掌握组合逻辑电路和基本存元件描述方式不同;
(3)学习QuartusII功能仿真和时序仿真方法;
(4)学习QuartusII的RTLViewer和TechnologyViewer工具的使用;
1.门控RS触发器的设计
2.D锁存器的设计
3.D触发器的设计
第1部分门控RS触发器
1.新建QuartusII工程,选择目标器件为CycloneIIEP2C35F672C6。
2.按照例3-1或者例3-2新建VerilogHDL文件,然后将该文件包含到工程中。
注意:
两个版本的VerilogHDL代码产生的电路结构是相同的。
3.编译。
使用QuartusII软件的RTLViewer工具观察两种描述方式产生的电路结构,使用TechnologyViewer工具验证QuartusII软件实现的电路结构是否与图3-3(b)一致。
提示:
点击Tools->
NetlistViewer->
RTLViewer可以打开RTLViewer工具;
4.新建VectorWaveformFile(.vwf)文件,在vwf文件包含电路的输入和输出,在QuarutsII软件中画出电路输入R和S的波形,使用QuartusII仿真器仿真该电路。
验证电路的功能和时序是否正确。
点击File->
New,在弹出的对话框中选择VectorWaveformFile新建波形文件。
仿真过程参考QuartusII简明教程。
//RSflipflop
modulepart1
(
inputclk,R,S,
outputQ
wirer_g,s_g,qa,qb/*synthesiskeep*/;
assignr_g=R&
clk;
assigns_g=S&
assignqa=~(r_g&
qb);
assignqb=~(s_g&
qa);
assignQ=qa;
综合结果(quartusII13.0)
第2部分D锁存器
1.新建QuartusII工程。
按照例3-2的代码风格设计图3-3所示的D锁存器的VerilogHDL代码。
使用/*synthesiskeep*/综合指令,以确保使用独立的逻辑单元实现信号R,S_g,R_g,Qa和Qb。
2.选择CycloneIIEP2C35F672C6作为目标芯片,编译该工程。
使用TechnologyVeiwer工具观察电路结构。
3.在QuarutusII中执行功能仿真,验证电路功能是否正确,执行时序仿真验证D锁存器的时序是否正确;
4.新建QuartusII工程,在DE2开发板上实现D锁存器电路。
在该工程的顶层文件中需要为D锁存器电路设计合适的输入和输出端口,在工程的顶层模块中实例D锁存器模块。
使用SW0代表D锁存器的数据输入D,SW1代表D锁存器的时钟输入Clk,D锁存器的输出Q到LEDR0。
5.重新编译,下载电路到DE2开发板;
6.改变拨动开关SW的状态,观察D锁存器的输出,测试电路功能是否正确;
moduletop_level(SW,LEDR0);
input[1:
0]SW;
//clk&
d
outputLEDR0;
//q
gated_d_latch(LEDR0,SW[0],SW[1]);
endmodule
//part2.vgatedd_latch
modulegated_d_latch(q,d,clk);
inputd,clk;
outputq;
wirer,s_g,r_g,qa,qb/*synthesiskeep*/;
nand(s_g,d,clk);
nand(r_g,r,clk);
not(r,d);
nand(qa,s_g,qb);
nand(qb,r_g,qa);
assignq=qa;
实验四计数器设计
(一)
(1)学习计数器的基本原理以及VerilogHDL实现方法;
(2)学习查看QuartusII编译报告(查看电路的最高工作频率);
(3)时序电路时序分析的基本方法
(4)掌握参数化模块库的使用;
(1)4位同步计数器设计
(2)行为级描述电路设计
(3)使用LPM设计计数器
第1部分4位同步计数器
1.使用VerilogHDL设计16位同步计数器。
要求:
首先设计1个T触发器,通过实例化16个T触发器实现该16位同步计数器。
编译,观察该实现需要多少个基本逻辑单元(LogicElements,LEs),电路的最高工作频率Fmax是多少?
2.功能仿真,验证电路功能是否正确。
3.使用KEY0作为clock输入,开关SW1和SW2分别作为enable和reset输入,7段显示数码管HEX3-HEX0用来显示十进制计数值。
按照DE2开发板上的电路做好正确的引脚分配,重新编译。
4.下载编译好的电路到FPGA器件,扳动拨动开关改变电路输入,测试电路功能。
使用QuartusII软件RTLViewer工具观察QuartusII软件是如何综合电路的?
并比较QuartusII软件综合的电路与图1的差别。
按照同样的方式设计1个4位同步计数器,
modulepart
0]KEY,
output[3:
output[1:
0]LEDG,
output[6:
0]HEX0
wire[3:
0]q;
assignLEDR=q;
assignLEDG=KEY;
counter_4u1(~KEY[0],~KEY[1],1'
b1,q);
decoder4_7H0(q[3:
0],HEX0);
modulecounter_4
inputclk,reset,en,
0]q
0]qq,tt;
assignq=qq;
assigntt[0]=en;
assigntt[1]=en&
qq[0];
assigntt[2]=tt[1]&
qq[1];
assigntt[3]=tt[2]&
qq[2];
T_FFu1(clk,reset,1'
b1,tt[0],qq[0]);
T_FFu2(clk,reset,1'
b1,tt[1],qq[1]);
T_FFu3(clk,reset,1'
b1,tt[2],qq[2]);
T_FFu4(clk,reset,1'
b1,tt[3],qq[3]);
moduledecoder4_7
(
outputreg[6:
0]f
always@*
case(a)
4'
h0:
f=7'
hC0;
h1:
hF9;
h2:
hA4;
h3:
hB0;
h4:
h99;
h5:
h92;
h6:
h82;
h7:
hF8;
h8:
h80;
h9:
h90;
hA:
h88;
hB:
h83;
hC:
hC6;
hD:
hA1;
hE:
h86;
hF:
h8E;
defaultf=7'
hff;
endcase
endmodule
moduleT_FF
inputclk,reset,en,t,
outputregq
always@(posedgeclk,posedgereset)
if(reset)
q<
=1'
b0;
elseif(en)
=t?
~q:
q;
实验7有限状态机
第8部分二进制BCD码转换电路
//2015/10/21
modulebin2bcd
(
inputclk,reset,
inputstart,
input[12:
0]bin,
outputready,done_tick,
output[3:
0]bcd3,bcd2,bcd1,bcd0
);
//finitestatedeclaration
localparam
IDLE=2'
b00,
OP=2'
b01,
DONE=2'
b10;
//signaldeclaration
reg[1:
0]state_reg,state_next;
reg[3:
0]n_reg,n_next;
//counter
0]bcd0_reg,bcd0_next;
0]bcd1_reg,bcd1_next;
0]bcd2_reg,bcd2_next;
0]bcd3_reg,bcd3_next;
wire[3:
0]bcd3_temp,bcd2_temp,bcd1_temp,bcd0_temp;
reg[12:
0]p2s_reg,p2s_next;
//statemachine
//stateregister
state_reg<
=IDLE;
else
=state_next;
//nextlogic
//always@(state_reg,start,n_next)
always@*
begin
state_next=state_reg;
//在此做过改动
case(state_reg)
IDLE:
if(start)
state_next=OP;
else
state_next=IDLE;
end
OP:
if(n_next==0)
state_next=DONE;
end
DONE:
state_next=IDLE;
default:
state_next=IDLE;
endcase
end
//mooreoutputlogic
assigndone_tick=(state_reg==DONE)?
b1:
assignready=(state_reg==IDLE)?
//datapass
//dataregister
begin
bcd0_reg<
=3'
bcd1_reg<
bcd2_reg<
bcd3_reg<
p2s_reg<
=0;
n_reg<
end
else
=bcd0_next;
=bcd1_next;
=bcd2_next;
=bcd3_next;
=p2s_next;
=n_next;
end
//datapassnext-statelogic
bcd0_next=bcd0_reg;
bcd1_n