verilog实验报告程超Word文档格式.docx
《verilog实验报告程超Word文档格式.docx》由会员分享,可在线阅读,更多相关《verilog实验报告程超Word文档格式.docx(11页珍藏版)》请在冰点文库上搜索。
1、在modulesim软件中对设计模块和验证模块进行书写和编译;
2、对编译好的模块进行仿真。
四、源代码:
//脉动进位计数器顶层模块
moduleripple_carry_counter(q,clk,reset);
output[3:
0]q;
inputclk,reset;
//生成了4个T触发器(T_FF)的实例,每个都有自己的名字
T_FFtff0(q[0],clk,reset);
T_FFtff1(q[1],q[0],reset);
T_FFtff2(q[2],q[1],reset);
T_FFtff3(q[3],q[2],reset);
endmodule
//触发器T_FF
moduleT_FF(q,clk,reset);
outputq;
wired;
D_FFdff0(q,d,clk,reset);
notn1(d,q);
//非门(not)是Verilog语言的内置原语部件(primitive)
//D触发器(D_FF)
//带异步复位的D触发器(D_FF)
moduleD_FF(q,d,clk,reset);
inputd,clk,reset;
regq;
//可以有许多种新结构,不考虑这些结构的功能,只需要注意设计块是如何以自顶向下的方式编写的
always@(posedgeresetornegedgeclk)
if(reset)
q<
=1'
b0;
else
=d;
modulestimulus;
regclk;
regreset;
wire[3:
//引用已经设计好的模块实例
ripple_carry_counterr1(q,clk,reset);
//控制驱动设计块的时钟信号,时钟周期为10个时间单位
initial
clk=1'
//把clk设置为0
always
#5clk=~clk;
//每5个时间单位时钟翻转一次
//控制驱动设计块的reset信号
begin
reset=1'
b1;
#15reset=1'
#180reset=1'
#10reset=1'
#20$finish;
//终止仿真
end
//监视输出
$monitor($time,"
Outputq=%d"
q);
五、仿真结果及分析
仿真输出结果:
实验题目RS锁存器
带有延迟的RS锁存器,写出其带有延迟的Verilog门级描述。
编写其激励模块,根据下面的输入-输出关系表对其功能进行验证。
set
reset
Qn+1
Qn
1
?
在设计完成后,写出激励模块对其进行仿真。
reset,set;
q,qbar,out。
这是具有延迟的RS锁存器。
Reset为置位端,set为置零端。
RS锁存器
1.设计模块:
moduleSR_lach(q,qbar,reset,set);
outputq,qbar;
inputreset,set;
nand#1(q,reset,qbar);
nand#1(qbar,set,q);
2.验证模块:
moduleTop;
wireQ,Qbar;
regReset,Set;
SR_latch(.reset(Reset),.q(Q),.qbar(Qbar),.set(Set));
initial
begin
$monitor($time,"
Set=%b,Reset=%b,Q=%b\n"
Set,Reset,Q);
Set=0;
Reset=0;
#5Reset=1;
#5Reset=0;
#5Set=1;
#5$finish;
end
实验题目:
两个四位二进制的比较器
大小比较器的功能是比较两个数之间的关系:
大于、小于或等于。
一个四位大小比较器的输入是两个四位数A和B。
我们可以将它们写成下面的形式,最左边的位为最高有效位:
A=A(3)A
(2)A
(1)A(0)
B=B(3)B
(2)B
(1)B(0)
两个数的比较可以从最高有效位开始,逐位进行。
如果两个位不相等,则该位值为0的数为较小的数。
为了用逻辑等式实现这个功能,我们需要定义一个中间变量x。
注意下面实现的是同或(xnor)的功能。
x(i)=A(i)B(i)+A(i)’B(i)’
大小比较器的三个输出为:
A_gt_B,A_lt_B和A_eq_B。
其计算公式为:
A_gt_B=A(3)B(3)’+x(3)A
(2)B
(2)’+x(3)x
(2)A
(1)B
(1)’+x(3)x
(2)x
(1)A(0)B(0)’
A_lt_B=A(3)’B(3)+x(3)A
(2)’B
(2)+x(3)x
(2)A
(1)’B
(1)+x(3)x
(2)x
(1)A(0)’B(0)
A_eq_B=x(3)x
(2)x
(1)x(0)
写出模块magnitude_comparator的Verilog描述。
写出激励模块并在模块中实例引用magnitude_comparator模块。
选择A和B的几种组合,对模块的功能进行测试。
二、实验步骤
三、源代码:
reg[3:
0]A_out,B_out;
wireF1,F2,F3;
magnitude_comparatorsti(A_out,B_out,F1,F2,F3);
#0A_out=4'
d0;
B_out=4'
d1;
#10A_out=4'
d2;
d5;
d15;
d10;
d3;
d6;
d8;
d14;
d12;
#20$finish;
A=%b,B=%b,A_gt_B=%d,A_it_B=%d,A_eq_B=%d"
A_out,B_out,F1,F2,F3);
激励块:
modulemagnitude_comparator(A,B,A_gt_B,A_it_B,A_eq_B);
input[3:
0]A,B;
outputA_gt_B,A_it_B,A_eq_B;
0]X;
assign
X[0]=(A[0]&
B[0])|(~A[0]&
~B[0]),
X[1]=(A[1]&
B[1])|(~A[1]&
~B[1]),
X[2]=(A[2]&
B[2])|(~A[2]&
~B[2]),
X[3]=(A[3]&
B[3])|(~A[3]&
~B[3]);
A_gt_B=(A[3]&
~B[3])|(X[3]&
A[2]&
~B[2])|(X[3]&
X[2]&
A[1]&
~B[1])|(X[3]&
X[1]&
A[0]&
A_it_B=(~A[3]&
B[3])|(X[3]&
~A[2]&
B[2])|(X[3]&
~A[1]&
B[1])|(X[3]&
~A[0]&
B[0]),
A_eq_B=X[3]&
X[0];
四、仿真结果及分析
实验题目:
使用JK触发器设计一个计数器
一、实验内容:
一个同步计数器可以使用主从JK触发器来设计。
设计一个同步计数器,其逻辑图和JK触发器的逻辑图如书中图所示。
清零信号clear低电平有效,输入数据在时钟信号clock的上升沿被锁存,触发器在clock的下降沿输出;
当count_enable信号为低电平时停止计数。
写出同步计数器的Verilog描述和激励模块,在激励模块中使用clear和count_enable对计数器进行测试,并显示输出计数Q[3:
0]。
二、技术规范:
本次试验中共有三个模块,分别是JK主从触发器设计模块,计数器设计模块及激励模块。
对于JK触发器,共有四个输入端(j,k,clear,clock),两个输出端(q,qbar),根据其实际电路结构做出相应的设计;
对于计数器模块,有三个输入端(clear,clock,counter_clock),四个输出(Q[3:
0]),使用的是四个JK触发器和门电路组合,采用同步清零和同步脉冲构成四位同步计数器;
激励模块中根据技术模块输入端口进行相关赋值以便进行仿真观察;
三、实验步骤:
1.在modulesim软件中使用数据流建模进行四位计数器设计及输入;
2.进行编译及仿真。
四、源代码:
JK触发器模块:
modulem_c_jkff(q,qbar,J,K,clear,clock);
outputq,qbar;
inputJ,K,clear,clock;
wirea,b,c,d,y,ybar,cbar;
assigncbar=~clock;
assign#1a=~(J&
qbar&
clock&
clear),
b=~(K&
q&
clock),
y=~(a&
ybar),
ybar=~(y&
b&
c=~(y&
cbar),
d=~(ybar&
cbar);
assign#1q=~(c&
qbar);
assign#1qbar=~(d&
clear&
q);
计数器模块:
modulefour_count_ff(Q,clear,clock,count_enable);
0]Q;
inputclear,clock,count_enable;
wirea1,a2,a3;
assigna1=count_enable&
Q[0],
a2=a1&
Q[1],a3=a2&
Q[2];
m_c_jkffm1(Q[0],,count_enable,count_enable,clear,clock);
m_c_jkffm2(Q[1],,a1,a1,clear,clock);
m_c_jkffm3(Q[2],,a2,a2,clear,clock);
m_c_jkffm4(Q[3],,a3,a3,clear,clock);
激励模块:
regclock,clear,count_enable;
wire[3:
CountQ=%bClear=%b"
Q[3:
0],clear);
four_count_fff1(Q,clear,clock,count_enable);
clear=1'
count_enable=1'
#10clear=1'
//#1count_enable=1'
//#50clear=1'
//#100count_enable=1'
//#100clear=1'
//#50count_enable=1'
clock=1'
forever#20clock=~clock;
#1000$finish;
Endmodule