《Verilog HDL数字集成电路设计原理与应用》上机作业******* 班级:******* 学号:*******
姓名:
verilog HDL描述与仿真。题目1:数字集成电路的设计和仿真软件;(1)学习使用Modelsim要求:中的例子;2)练习教材7.2.1 ((3)掌握设计代码和测试代码的编写;
(4)掌握测试仿真流程;
Modelsim软件的波形验证方式。(5)掌握
解答:
语句块的区别,并写出下面信号语句块和begin-endfork-join:题目2 简述对应的程序代码AB500ns40201030
解答:
(1)begin-end语句块和fork-join语句块的区别:
1、执行顺序:begin-end语句块按照语句顺序执行,fork-join语句块所有语句均在同一时刻执行;
2、语句前面延迟时间的意义:begin-end语句块为相对于前一条语句执行结束的时间,fork-join语句块为相对于并行语句块启动的时间;
3、起始时间:begin-end语句块为首句开始执行的时间,fork-join语句块为转入并行语句块的时间;
4、结束时间:begin-end语句块为最后一条语句执行结束的时间,fork-join 语句块为执行时间最长的那条语句执行结束的时间;
5、行为描述的意义:begin-end语句块为电路中的数据在时钟及控制信号的作
用下,沿数据通道中各级寄存器之间的传送过程。fork-join语句块为电路上电后,各电路模块同时开始工作的过程。
(2)程序代码:
Begin-end语句:
module initial_tb1;
reg A,B;
initial
begin
A=0;B=1;
#10 A=1;B=0;
#10 B=1;
#10 A=0;
#10 B=0;
#10 A=1;B=1;
end
endmodule
Frk-join语句:
module wave_tb2;
reg A,B;
parameter T=10;
initial
fork
A=0;B=1;
#T A=1;B=0;
#(2*T) B=1;
#(3*T) A=0;
#(4*T) B=0;
#(5*T) A=1;B=1;
join
endmodule
3. 分别用阻塞和非阻塞赋值语句描述如下图所示移位寄存器的电路图。题目out2out1out0
dinout3QQDDQQD clk
解答:)阻塞赋值语句(1module block2(din,clk,out0,out1,out2,out3);input din,clk; output out0,out1,out2,out3;reg out0,out1,out2,out3;always@(posedge clk)begin
out0=din; out1=out0;
out2=out1; out3=out2;
end endmodule
)非阻塞赋值语句(2module non_block1 (din,clk,out0,out1,out2,out3);input din,clk; output out0,out1,out2,out3;reg out0,out1,out2,out3;always@(posedge clk) begin out0<=din;
out1<=out0;
out2<=out1;out3<=out2;
end
endmodule
位同步计数器:设计题目416位同步计数器结构和电路特点;1)分析16要求:()用硬件描述语言进行设计;(2)编写测试仿真并进行仿真。(3
解答:)电路特点:同步计数器的时间信号是同步的;每当到达最高计数后就会重新计数。(1)程序代码:(2module comp_16 (count, clk, rst );output [15:0] count;input clk,rst; reg [15:0] count;always @ (posedge clk) if (rst) count<=16'b0000000000000000; else if (count==16'b1111111111111111) count<=16'b0000000000000000;
else count<=count+1;endmodule
)仿真代码:(3module comp_16_tb;wire [15:0] count;reg clk,rst;
comp_16 U1 (count, clk, rst );always #1 clk=~clk;initial begin clk=0;rst=0;#1 rst=1; #10 rst=0;#10 rst=1;#10 rst=0;#99999 $finish;end endmodule
题目5. 试用Verilog HDL门级描述方式描述如下图所示的电路。
D3T3
D2T2ZD T D TSS1
解答:
module zy(D0,D1,D2,D3,S1,S2,T0,T1,T2,T3,Z);
output Z;
input D0,D1,D2,D3,S1,S2;
wire T0,T1,T2,T3,wire1,wire2;
not U1(wire1,S1),
U2(wire2,S2);
and U3(T0,D0,wire2,wire1),
U4(T1,D1,S1,wire1),
U5(T2,D2,S1,wire2),
U6(T3,D3,S1,S2);
or U7(Z,T0,T1,T2,T3,);
endmodule
题目6. 试用查找真值表的方式实现真值表中的加法器,写出Verilog HDL代码:
Cin ain bin sum Cout
00000
00011
00101
11010
010100011
1
解答:module homework6(SUM,COUT,A,B,CIN);output SUM,COUT;input A,B,CIN;reg SUM,COUT;always@(A or B or CIN)case({A,B,CIN}) 3'b000:SUM<=0; 3'b000:COUT<=0; 3'b001:SUM<=1; 3'b001:COUT<=0; 3'b010:SUM<=1; 3'b010:COUT<=0;
3'b011:SUM<=0; 3'b011:COUT<=1; 3'b100:SUM<=1; 3'b100:COUT<=0;
3'b101:SUM<=0; 3'b101:COUT<=1; 3'b110:SUM<=0; 3'b110:COUT<=1;
3'b111:SUM<=1; 3'b111: COUT<=1; endcase endmodule
位同步加法器和乘法器7题目:设计1616位同步加法器和乘法器结构和电路特点;)分析要求:(1)用硬件描述语言进行设计;(2)编写测试仿真并进行仿真。( 3
解答:
(1)16位同步加法器和乘法器结构和电路特点:加法器的进位只用考虑一位,但是乘法器的进位要考虑到32位才行。
(2)程序代码:
16位同步加法器:
module adder(a,b,c,sum,cout);
output [15:0]sum;
output cout;
input [15:0]a,b;
input c;
assign {cout,sum}=a+b+c;
endmodule
16位同步乘法器:
module multiplier(a,b,mul);
input [15:0]a,b;
output [31:0]mul;
assign mul=a*b;
endmodule
(3)仿真代码:
16位同步加法器:
module adder_tb;
reg [15:0]a,b;
reg c;
wire [15:0]sum;
wire cout;
initial
begin
a=8;b=8;c=1;
end
initial
begin
#10 a=16'b1111111111111111;#10 b=1;
end
adder U2(.a (a),.b (b),.c(c),.cout(cout),.sum(sum));
endmodule
16位同步乘法器:
module multiplier_tb;
reg [15:0]a,b;
wire [31:0]mul;
initial
begin
a=3;b=8;
end initial
begin
#10 a=100; #15 b=100;
end multiplier U1(.a(a),.b(b),.mul(mul));endmodule
仿真截图:加法器:
乘法器:
描述。在图中,状态机的输入只与状态的跳转HDL8. 题目将下面的状态转移图用Verilog 有关,与状态机的输出无关,因此该状态机为摩尔型状态机。下面为三段式描述方式。start=0clr=1State0out=001step3=1start=1step3=0State3State1step2=0out=111out=010step2=1State2out=100
解答:
程序代码:
module homework8(clk,out,step,clr);
output [2:0]out;
input step,clk,clr;
reg [2:0]out;
reg [1:0]state,next_state;
always @(posedge clk)
state<=next_state;
always @(state or clr)
if(clr)
next_state<=0;
else
case(state)
2'b00:
case(step)
1'b0:begin next_state<=2'b00;out<=3'b001;end
1'b1:begin next_state<=2'b01;out<=3'b001;end
endcase
2'b01:
begin
out<=3'b010;
next_state<=2'b10;
end
2'b10:
case(step)
1'b0:begin next_state<=2'b00;out<=3'b100;end
1'b1:begin next_state<=2'b11;out<=3'b100;end
endcase
2'b11:
case(step)
1'b0:begin next_state<=2'b11;out<=3'b111;end
1'b1:begin next_state<=2'b00;out<=3'b111;end
endcase
endcase
endmodule
仿真代码:
module homework8_tb;
reg clk,step,clr;
wire [3:0]out;
always
#5 clk=~clk; initial begin clk=0; clr=1;step=1;end initial begin
#5clr=0; #10 step=0; #10step=1;end homework8 U1(clk,out,step,clr);endmodule 仿真截图:
Verilog HDL程序设计该电路。9. 题目如下图所示电路,若其延迟时间设定如表所示,试写asass0ysbb
max)type)min)最大值(典型值(最小值(路径
101214a_sa_y1517s_s0_sa_y19
151311s_sb_y
101412b_sb_y
解答:程序代码:module a(a,s,b,y,s0); input a,b,s,s0; output y; assign y=(s&&b)||(s0&&a); specify (a=>y)=(10,12,14);
(b=>y)=(10,12,14); (s=>y)=(11,13,15); (s0=>y)=(11,13,15); endspecify endmodule
module b(a,s,b,y); input s,a,s,b; output y; wire s0; not
#(4)U1(s0,s); delay_door U2(a,s,b,y,s0);endmodule
位数字显示的简易频率计。要求:设计一个8题目10. 方波信号;①能够测试10Hz~10MHz 8421BCD码形式输出;②电路输入的基准时钟为1Hz,要求测量值以③系统有复位键;进行设计。④采用分层次分模块的方法,用Verilog HDL
解答:程序代码:module x; reg standard_clk; reg test_clk; wire [7:0]out; reg reset; initial begin reset=0; test_clk=0;
standard_clk=0; end
initial #15 reset=1;
always #1 test_clk=~test_clk;
always #10 standard_clk=~standard_clk;
a
U1(.reset(reset),.test_clk(test_clk),.standard_clk(standard_clk),.rat io_final(out));
endmodule
module a(reset,test_clk,standard_clk,ratio_final);
input reset,test_clk,standard_clk;
output [7:0]ratio_final;
wire mul_clk;
wire reset_comp;
wire [7:0]ratio_start;
and U0(reset_comp,reset,standard_clk);
t U1(.ain(test_clk),.din(standard_clk),.mul(mul_clk));
w U2(.clk(mul_clk),.count(ratio_start),.reset(reset_comp));
c U3(.ratio_start(ratio_start),.ratio_final(ratio_final)); endmodule
module w(clk,count,reset);
input clk,reset;
output count;
parameter bit=8;
reg [bit-1:0]count;
always @(posedge clk or negedge reset)
if(!reset)
count<=8'b00000000;
else
count<=count+1;
endmodule
module t(ain,din,mul);
parameter width=1;
input [width-1:0]ain,din;
output [width*2-1:0]mul;
assign mul=ain*din;
endmodule
module c(ratio_start,ratio_final);
input [7:0]ratio_start;
output [7:0]ratio_final;
assign ratio_final=2*ratio_start;
endmodule
题目11. 用Verilog HDL设计一个4位LED显示器的动态扫描译码电路。要求:
①4个七段显示器共用一个译码驱动电路;
②显示的数码管清晰明亮,无闪烁现象发生。
解答:
module a(out,in);
output out;
input in;
reg[6:0]out;
wire[3:0]in;
always@(in)
begin
case(in)
4'd0:out=7'b1111110;
4'd1:out=7'b0110000;
4'd2:out=7'b1101101;
4'd3:out=7'b1111001;
4'd4:out=7'b0110011;
4'd5:out=7'b1011011;
4'd6:out=7'b1011111;
4'd7:out=7'b1110000;
4'd8:out=7'b1111111;
4'd9:out=7'b1111011;
endcase
end
endmodule
module w(in1,in2,in3,in4,out1,out2,out3,out4); output out1,out2,out3,out4;
input in1,in2,in3,in4;
wire [3:0]in1,in2,in3,in4;
wire[6:0]out1,out2,out3,out4;
a U1(.in(in1),.out(out1));
a U2(.in(in2),.out(out2));
a U3(.in(in3),.out(out3));
a U4(.in(in4),.out(out4));
endmodule
module c;
reg [3:0]in1,in2,in3,in4;
wire[6:0]out1,out2,out3,out4;
initial
begin
in1=4'b0010;
in2=4'b0100;
in3=4'b1000;
in4=4'b0000;
end
initial
begin
#5 in4=4'b0111;
in3=4'b0110;
in2=4'b0100;
in1=4'b0000;
end
w U1(in1,in2,in3,in4,out1,out2,out3,out4); endmodule
VerilogHDL硬件描述语言复习 一、 1.VerilogHDL是在哪一年首次被IEEE标准化的? 答:VerilogHDL是在1995年首次被IEEE标准化的。 2.VerilogHDL支持哪三种基本描述方式? 答:VerilogHDL可采用三种不同方式或混合方式对设计建模。这些方式包括:行为描述方式—使用过程 化结 构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述 建模 3.VerilogHDL是由哪个公司最先开发的? 答:VerilogHDL是由GatewayDesignAutomation公司最先开发的 4.VerilogHDL中的两类主要数据类型什么? 答:线网数据类型和寄存器数据类型。线网类型表示构件间的物理连线,而寄存器类型表示 抽象的数据存储元件。 5.UDP代表什么? 答:UDP代表用户定义原语 6.写出两个开关级基本门的名称。答: pmosnmos 7.写出两个基本逻辑门的名称。答: andor 8.在数据流描述方式中使用什么语句描述一个设计? 答:设计的数据流行为使用连续赋值语句进行描述 9.采用结构描述方式描述1位全加器。 答: modulefull_add(a,b,cin,s,co); inputa,b,cin; outputs,co; wireS1,T1,T2,T3; xor X1(S1,a,b), X2(s,S1,cin); and A1(T3,a,b), A2(T2,b,cin), A3(T1,a,cin); or O1(co,T1,T2,T3); endmodule 10.initial语句与always语句的关键区别是什么? 答:1)initial语句:此语句只执行一次。 2)always语句:此语句总是循环执行,或者说此语句重复执行。 11.采用数据流方式描述2-4译码器。 答: 'timescale1ns/ns moduleDecoder2×4(A,B,EN,Z); inputA,B,EN; output[0:3]Z; 1
第4节Verilog HDL语言的描述语句Verilog HDL 描述语句 2.4.1 结构描述形式 通过实例进行描述的方法,将Verilog HDL预先定义的基本单元实例嵌入到代码中,监控实例的输入。Verilog HDL中定义了26个有关门级的关键字,比较常用的有8个。 在实际工程中,简单的逻辑电路由逻辑门和开关组成,通过门元语可以直观地描述其结构。 基本的门类型关键字如下所述: ?and ?nand ?nor ?or ?xor ?xnor ?buf ?not Verilog HDL支持的基本逻辑部件是由该基本逻辑器件的原语提供的。其调用格式为: 门类型<实例名> (输出,输入1,输入2,……,输入N) 例如,nand na01(na_out, a, b, c ); 表示一个名字为na01的与非门,输出为na_out,输入为a, b, c。 例2-5 一个简单的全加器例子: module ADD(A, B, Cin, Sum, Cout); input A, B, Cin; output Sum, Cout; // 声明变量 wire S1, T1, T2, T3; xor X1 (S1, A, B), X2 (Sum, S1, Cin); and A1 (T3, A, B), A2 (T2, B, Cin), A3 (T1, A, Cin); or O1 (Cout, T1, T2, T3);
endmodule 在这一实例中,模块包含门的实例语句,也就是包含内置门xor、and和or的实例语句。门实例由线网型变量S1、T1、T2和T3互连。由于未指定顺序,门实例语句可以以任何顺序出现。 门级描述本质上也是一种结构网表。在实际中的使用方式为:先使用门逻辑构成常用的触发器、选择器、加法器等模块,再利用已经设计的模块构成更高一层的模块,依次重复几次,便可以构成一些结构复杂的电路。其缺点是:不易管理,难度较大且需要一定的资源积累。 2.4.2 数据流描述形式 数据流型描述一般都采用assign连续赋值语句来实现,主要用于实现组合功能。连续赋值语句右边所有的变量受持续监控,只要这些变量有一个发生变化,整个表达式被重新赋值给左端。这种方法只能用于实现组合逻辑电路。其格式如下: assign L_s = R_s; 例2-6 一个利用数据流描述的移位器 module mlshift2(a, b); input a; output b; assign b = a<<2; endmodule 在上述模块中,只要a的值发生变化,b就会被重新赋值,所赋值为a左移两位后的值。 2.4.3 行为描述形式 行为型描述主要包括过程结构、语句块、时序控制、流控制等4个方面,主要用于时序逻辑功能的实现。 1.过程结构 过程结构采用下面4种过程模块来实现,具有强的通用型和有效性。 ?initial模块 ?always模块 ?任务(task)模块 ?函数(function)模块
Verilog HDL常用的行为仿真描述语句(一) 一、循环语句 1、forever语句 forever语句必须写在initial模块中,主要用于产生周期性波形。 2、利用for、while循环语句完成遍历 for、while语句常用于完成遍历测试。当设计代码包含了多个工作模式,那么就需要对各个模式都进行遍历测试。其典型的应用模板如下:[c-sharp:nogutter] view plaincopy? parameter mode_num = 5; initial begin // 各种不同模式的参数配置部分 for(i=0; i<mode_num-1; i=i+1) begin case (i) 0: begin . . end
1: begin . . end . . endcase end // 各种模式共同的测试参数 . . end 3、利用repeat语句来实现有次数控制的事件,其典型示例如下: [c-sharp] view plaincopy? initial begin
// 初始化 in_data = 0; wr = 0; // 利用repeat语句将下面的代码执行10次 repeat(10) begin wr = 1; in_data = in_data + 1; #10; wr = 0; #200; end end 4、用disable实现循环语句的异常处理,其典型示例如下:[c-sharp] view plaincopy? begin : one_branch for(i=0; i<n; i=i+1) begin : two_branch if (a==0) disable one_branch; if (a==b)
Verilog HDL的行为语句 Verilog HDL有许多的行为语句,使其成为结构化和行为性的语言。Verilog HDL语句包括:赋值语句、过程语句、块语句、条件语句、循环语句、编译预处理等,如表5-14 所示。符号“√”表示该语句能够为综合工具所支持,是可综合的。 5.3.1 赋值语句 赋值语句包括持续赋值语句与过程赋值语句。 1. 持续赋值语句assign为持续赋值语句,主要用于对wire 型(连线型)变量赋值。例如:assign c=~(a&b); 在上面的赋值中,a、b、c三个变量皆为wire型变量,a和b 信号的任何变化,都将随时反映到c上来。 2. 过程赋值语句过程赋值语句多用于对reg型变量进行赋值。过程赋值有阻塞赋值和非阻塞赋值两种方式。 a. 非阻塞赋值方式非阻塞赋值符号为“<=”,如:b<=a; 非阻塞赋值在整个过程块结束时才完成赋值操作,即b的值并不是立刻就改变的。 b. 阻塞赋值方式阻塞赋值符号为“=”,如:b=a; 阻塞赋值在该语句结束时就立即完成赋值操作,即b的值在该语句结束时立刻改变。如果在一个块语句中(例如always块语句),有多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不能被执行,仿佛被阻塞了一样,因此称为阻塞赋值方式。
5.3.2 过程语句VerilogHDL中的多数过程模块都从属于以下2种过程语句:initial及always。在一个模块(module)中,使用initial和always语句的次数是不受限制的。initial语句常用于仿真中的初始化,initial过程块中的语句仅执行一次;always块内的语句则是不断重复执行的。1. initial过程语句initial过程语句使用格式如下:initial begin 语句1; 语句2; | 语句n; end intial语句不带触发条件,initial过程中的块语句沿时间轴只执行一次。initial语句通常用于仿真模块中对激励向量的描述,或用于给寄存器变量赋初值,它是面向模拟仿真的过程语句,通常不能被逻辑综合工具所接受。 2. aIways过程语句always 过程语句使用格式如下:always @ (<敏感信号表达式>) begin //过程赋值//if-else,case,casex,casez选择语句//while,repeat,for循环 //task,function调用end always过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中。只有当触发条件满足敏感信号表达式时,其后的“begin-end”块语句才能被执行。 3. 敏感信号表达式所谓敏感信号表达式又称事件表达式,即当该表达式中变量的值改变时,就会引发块内语句的执行,因此敏感信号表达式中应列出影响块内取值的所有信号。若有两个或两个以上信
Verilog HDL及其Testbench总结 (欢迎批评指正:jackhuan@https://www.doczj.com/doc/434320780.html,) 1 Verilog HDL的基本观点 1) 观点1:module内每个基本模块之间是并行运行的。 2) 观点2:每个模块相当于一个连续赋值的过程。 3) 观点3:方程和任务是共享代码的最基本方式。 4) 观点4:同语言可用于生成模拟激励和指定测试的验证约束条件。 5) 观点5:库的概念相当于Visual C++中的DLL概念。 6) 观点6:文件与文件之间的关系可以使用C++中的*.h和*.cpp之关系理解。 2 设计建模的三种方式 1) 行为描述方式。过程化结构,每个结构之间是并行的。 2) 数据流方式。连续赋值语句方式,每个赋值语句之间是并行的,且赋值语 句和结构之间是并行的。 3) 结构化方式。门和模块实例化语句。 3 两者数据类型 1) 线网数据类型wire:表示构件间的物理连线; 2) 寄存器数据类型reg:表示抽象的数据存储元件。 4 几个概念 1) 模块(module)。模块是Verilog HDL的基本描述耽误,用于描述某个设计 的功能或结构及其与其它模块通信的外部端口。一个设计的结构可以使用开关级原语、门级原语和用户定义的原语方式描述;数据流行为使用使用连续赋值语句进行描述;时序行为使用过程结构描述。模块的声明部分和语句可以散布在模块中的任何地方,但变量、寄存器、线网和参数说明必须在使用前出现。 2) 只有寄存器类型数据(reg/integer)能够在initial和always语句中被赋值。 3) 阻塞性和非阻塞性赋值。理解这两个概念在学习verilog HDL中非常重要。 决定了时序的正确与否。阻塞性赋值的概念是在该条赋值语句执行完成后再执行后面的语句,也就是说在执行该语句时,后面的语句是挂起的。而非阻塞性赋值的结果在何时执行是不知道的,但是可以预见在某个时间步内该语句一定能够执行完成,从这个意义上来看,非阻塞性赋值的语句类似于并行语句,稍有处理不当,会引发多驱动源问题。关于多驱动源问题,在我的VHDL总结中有所表述,此处不在费墨。 4) 用户定义原语(UDP)。UDP的定义不依赖于模块定义,因此出现在模块定 义之外,也可以在单独的文本文件中定义UDP。UDP只能有一个输出或一个/多个输入端口。UDP的行为以真值表的形式描述。 5) 并行语句块和顺序语句块。并行语句块中的各语句并行执行。当并行语句 块中的最后动作执行完成是,顺序语句块的语句继续执行。也就是说,并行语句块中的所有语句必须在控制转出语句块之前完成执行。并行语句块