当前位置:文档之家› 蔡觉平老师西电VerilogHDL上机大作业硬件描述语言_微电子学院

蔡觉平老师西电VerilogHDL上机大作业硬件描述语言_微电子学院

蔡觉平老师西电VerilogHDL上机大作业硬件描述语言_微电子学院
蔡觉平老师西电VerilogHDL上机大作业硬件描述语言_微电子学院

《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复习题与答案

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

Verilog HDL语言的描述语句

第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常用的行为仿真描述语句(一)

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)

veriloghdl的行为语句

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. 敏感信号表达式所谓敏感信号表达式又称事件表达式,即当该表达式中变量的值改变时,就会引发块内语句的执行,因此敏感信号表达式中应列出影响块内取值的所有信号。若有两个或两个以上信

VerilogHDL及其Testbench编写方法

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) 并行语句块和顺序语句块。并行语句块中的各语句并行执行。当并行语句 块中的最后动作执行完成是,顺序语句块的语句继续执行。也就是说,并行语句块中的所有语句必须在控制转出语句块之前完成执行。并行语句块

相关主题
文本预览
相关文档 最新文档