当前位置:文档之家› verilog源代码第8.9章例题

verilog源代码第8.9章例题

verilog源代码第8.9章例题
verilog源代码第8.9章例题

第八章语法概念总复习练习

1)以下给出了一个填空练习,请将所给各个选项根据电路图,填入程序中的适当位置。

a s s i g n m o d u l e;~| &i n p u t o u t p u t

i n p u t s o u t p u t s e n d m o d u l e

A ,

B ,

C , D

AOI ( A, B, C, D, F )

input A,B,C,D;

output F;

assign F = ((A&B)&(C&D));

endmodule

2〕 在这一题中,我们将作有关层次电路的练习,通过这个练习,你将加深对模块间调

用时,管脚间连接的理解。假设已有全加器模块FullAdder,若有一个顶层模块调用此全加器,连接线分别为W4,W5,W3,W1和W2。请在调用时正确地填入I/O 的对应信号。

module FullAdder(A,B,Cin,Sum,Cout); input A, B, Cin;

output Sum, Cout;

endmodule

3)

initial begin end

initial

SEL=0; A=0; B=0;

#10 A=1;

#10 SEL=1; #10 B=1;

$monitor (SEL , A ,B , ,F) ; reg A, B , SEL;

wire F;

A Sum W1 W2 W3 W4 W5

B Cin Count

endmodule

标准答案:

module TestFixture

reg A,B,SEL;

wire F;

MUX2M(SEL,A,B,F);

initial

begin

SEL=0; A=0; B=0;

#10 A=1;

#10 SEL=1; #10 B=1;

end

initial

$monitor(SEL,A,B,,F);

endmodule

4)指出下面几个信号的最高位和最低位。

reg [1:0] SEL; input [0:2] IP; wire [16:23] A;

标准答案:

MSB:SEL[1] MSB:IP[0] MSB:A[16]

LSB:SEL[0] LSB:IP[2] LSB:A[23]

5)P,Q,R都是4bit的输入矢量,下面哪一种表达形式是正确的。

1)input P[3:0],Q,R;

2)input P,Q,R[3:0];

3)input P[3:0],Q[3:0],R[3:0];

4)input [3:0] P,[3:0]Q,[0:3]R;

5)input [3:0] P,Q,R;

标准答案:5)

6)请将下面选项中的正确答案填人空的方括号中。

1. (0:2)

2. (P:0)

3. (Op1:Op2)

4.(7:7)

5. (2:0)

6. (7:0)

reg [7:0] A;

reg [2:0] Sum, Op1, Op2;

reg P, OneBit;

initial

begin

Sum=Op1+Op2;

P=1;

A[ ]=Sum;

.....

end

标准答案:5

7)请根据以下两条语句,从选项中找出正确答案。

7.1) reg [7:0] A;

A=2'hFF;

1) 8'b0000_0011 2) 8'h03 3) 8'b1111_1111 4) 8'b11111111

标准答案:1)、2)

7.2) reg [7:0] B;

B=8 'bZ0;

1) 8'0000_00Z0 2) 8'bZZZZ_0000

3) 8'b0000_ZZZ0 4) 8'bZZZZ_ZZZ0

标准答案:4)

8)请指出下面几条语句中变量的类型。

8.1) assign A=B;

8.2) always #1

Count=C+1;

标准答案:

A(wire) B(wire/reg) Count(reg) C(wire/reg)

9)指出下面模块中Cin,Cout,C3,C5,的类型。

module FADD(A,B,Cin,Sum,Cout);

input A, B, Cin;

output Sum, Cout;

....

endmodule

module Test;

...

FADDM(C1,C2,C3,C4,C5);

...

endmodule

标准答案:

Cin(wire) Cout(wire/reg) C3(wire/reg) C5(wire)

10〕在下一个程序段中,当ADDRESS的值等于5'b0X000时,问casex执行完后A和B 的值是多少。

A=0;

B=0;

casex(ADDRESS)

5'b00???: A=1;

5'b01???: B=1;

5'b10?00,5'b11?00:

begin

A=1;

B=1;

end

endcase

标准答案: A=1 and B=0;

11)在下题中,事件A分别在10,20,30发生,而B一直保持X状态,问在50时Count

的值是多少。

reg [7:0] Count;

initial

Count=0;

always

begin

@(A) Count=Count+1;

@(B) Count=Count+1;

end

标准答案:Count=1;

(这是因为当A第一次发生时,Count的值由0变为1,然后事件控制 @(B) 阻挡了进程。)

12)在下题中initial块执行完后I,J,A,B的值会是多少。

reg [2:0] A;

reg [3:0] B;

integer I, J;

initial

begin

I=0;

A=0;

I=I-1;

J=I;

A=A-1;

B=A;

J=J+1;

B=B+1;

end

标准答案:

I=-1 (整数可为负数)

J=0

A=7 (A为reg型为非负数,又因为A为3位即为111)

B=8 (在B=A时,B=0111,然后B=B+1,所以B=4’b1000)

13)在下题中,当V的值发生变化且为-1时,执行完always块后

Count的值应是多少?

reg[7:0]V;

reg[2:0]Count;

always @(V)

begin

Count=0;

while(~V[Count])

Count=Count+1;

end

标准答案:Count=0;

14)在下题中循环执行完后,V的值是多少?

reg [3:0] A;

reg V ,W;

integer K;

....

A=4'b1010;

for(K=2;K>=0;K=K-1)

begin

V=V^A[k];

W=A[K]^A[K+1];

end

标准答案:V的值是它进人循环体前值的取反。

(因为V的值与0,1,0 进行了异或,与1的异或改变了V的值。)

15)在下题中,给出了几种硬件实现,问以下的模块被综合后可能是哪一种?

always @(posedge Clock)

if(A)

C=B;

1.不能综合。

2.一个上升沿触发器和一个多路器。

3.一个输入是A,B,Clock的三输入与门。

4.一个透明锁存器。

5.一个带clock有始能引脚的上升沿触发器。

标准答案:2,5

16)在下题中,always状态将描述一个带异步Nreset和Nset输入端的上升沿触发器,

则空括号内应填入什么,可从以下五种答案中选择。

always @( )

if(!Nreset)

Q<=0;

else if(!Nset)

Q<=1;

else

Q<=D;

1.negedge Nset or posedge Clock

2.posedge Clock

3.negedge Nreset or posedge Clock

4.negedge Nreset or negedge Nset or posedge Clock

5.negedge Nreset or negedge Nset

标准答案:4

17)在下题中,给出了几种硬件实现,问以下的模块被综合后可能是哪一种?

1.带异步复位端的触发器。

2.不能综合或与预先设想的不一致。

3.组合逻辑。

4.带逻辑的透明锁存器。

5.带同步复位端的触发器。

1.always @(posedge Clock)

begin

A<=B;

if(C)

A<=1'b0;

end

标准答案:5

2.always @( A or B)

case(A)

1'b0: F=B;

1'b1: G=B;

endcase

标准答案:2

3.always @( posedge A or posedge B )

if(A)

C<=1'b0;

else

C<=D;

标准答案:1

4.always @(posedge Clk or negedge Rst)

if(Rst)

A<=1'b0;

else

A<=B;

标准答案:2 (产生了异步逻辑)

18)在下题中,模块被综合后将产生几个触发器?

always @(posedge Clk)

begin: Blk

reg B, C;

C = B;

D <= C;

B = A;

end

1. 2个寄存器 B 和 D

2. 2个寄存器 B和 C

3. 3个寄存器 B, C 和 D

4. 1个寄存器 D

5. 2个寄存器 C 和D

标准答案:2

19)在下题中,各条语句的顺序是错误的。请根据电路图调整好它们的次序。

标准答案:1) 2)

20)根据左表中SEL与OP的对应关系,在右边模块的空括号中填入相应的值。

SEL:OP

000:1

001:3 casex(SEL)

010:1 3'b( ): OP=3;

011:3 3'b( ): OP=1;

100:0 3'b( ): OP=0;

101:3 endcase

110:0

111:3

标准答案:

casex(SEL)

3'bXX1: OP=3;

3'b0X0: OP=1;

3'b1X0: OP=0;

endcase

21)在以下表达式中选出正确的.

1) 4'b1010 & 4'b1101 = 1'b1

2) ~4'b1100 = 1'b1

3) !4'b1011 || !4'b0000 = 1'b1

4) & 4'b1101 = 1'b1

5) 1b'0 || 1b'1 = 1'b1

6) 4'b1011 && 4'b0100 = 4'b1111

7) 4'b0101<<1 =5'b01011

8) !4'b0010 is 1'b0

9) 4'b0001 || 4'b0000 = 1'b1

标准答案:3), 5), 8), 9)

22)在下一个模块旁的括号中填入display的正确值。

integerI;

reg[3:0]A;

reg[7:0]B;

initial

begin

I=-1;A=I;B=A;

$display("%b",B);( )

A=A/2;

$display("%b",A);( )

B=A+14

$diaplay("%d",B);( ) A=A+14;

$display("%d",A);( ) A=-2;I=A/2;

$display("%d",I);( ) end

标准答案:

I=-1;A=I;B=A;

$display("%b",B);(00001111) A=A/2;

$display("%b",A);(0111) B=A+14

$diaplay("%d",B);(21) A=A+14;

$display("%d",A);(5)(A 为4位,所以21被截为5)

23)]。)

24)

1 标准答案:1

module M ; ……

if (OP==< >)

Bus = 0 ; (file M.v) endmodule

(模块间调用时,若引用其他模块定义的参数,要加上其他模块名,做为这个参数的前缀。)

module M

'include "defs.v"

....

if(OP==)

Bus=0;

endmodule

2. 标准答案:4

parameter Reset=8'b10100101; (File defs.v)

module M

'include "defs.v"

....

if(OP==)

Bus=0;

endmodule

25)如果调用Pipe时,想把Depth的值变为8,问程序中的空括号内应填入何值?

Module Pipe(IP,OP)

parameter Option=1;

parameter Depth=1;

...

endmodule

Pipe( ) P1(IP1,OP1);

标准答案:#(1,8)

(其中1对应参数Option,8对应参数Depth.)

26)若想使P1中的Depth的值变为16,则应向空括号中填入哪个选项。

module Pipe (IP ,OP);

parameter Option =1;

parameter Depth = 1;

…………

endmodule

module

Pipe P1(IP1 ,OP1);

( );

endmodule

1.defparam P1.Depth=16;

2.parameter P1.Depth=16;

3.parameter Pipe.Depth=16;

4.defparam Pipe.Depth=16;

标准答案:1

(用后缀改变引用模块的参数要用defparam及用本模块名作为引用参数的前缀,如p1.Depth。)

27)如果我们想在Test的monitor语句中观察Count的值,则在空括号中应填入什么?

Module Test

Top T();

initial

$monitor( )

endmodule

module Top;

Block B1();

Block B2();

endmodule

module Block;

Counter C();

endmodule

module Counter;

reg [3:0] Count;

....

endmodule

标准答案:T.B1.C.Countor Test.T.B1.C.Count

28)下题中用initial块给reg[7:0]V符值,请指明每种情况下V的8位都是什值。

这道题说明在数的表示时,已标明字宽的数若用XZ表示某些位,只有在最左边的X或Z具有扩展性。

Reg [ 7 :0 ] V

initial

begin

V = 8’b0;

V = 8’b1;

V = 8’bX;

V = 8’BZX; V = 8’BXXZZ; V = 8’b1X; end 标准答案:

8’b00000000 8’b00000001 8’bXXXXXXXX 8’bZZZZZZZX 8’BXXXXXXZZ 8’b0000001X

第九章设计和验证例题

[例1]用基本逻辑单元组成触发器。(文件名为:flop.v)

module flop(data,clock,clear,q,qb);

input data,clock,clear;

output q,qb;

nand #10 nd1(a,data,clock,clear), // 注意结束时用逗号,最后才用分号

nd2(b,ndata,clock), // 表示nd1 到nd8 都是nand(与非门)

nd4(d,c,b,clear),

nd5(e,c,nclock),

nd6(f,d,nclock),

nd8(qb,q,f,clear);

nand #9 nd3(c,a,d),

图9.1.2.D型主从触发器的电路结构图

1)flop f1op_d( d1, clk, clrb, q, qn);

2)flop flop_d (.clock(clk),.q(q),.clear(clrb),.qb(qn),.data(d1));

[例2]用触发器组成带清零端的四位寄存器。(文件名为:hardreg.v)

` include " flop.v"

module hardreg(d,clk,clrb,q);

input clk,clrb;

input[3:0] d;

output[3:0] q;

flop f1(d[0],clk,clrb,q[0],), // 注意结束时用逗号,最后才用分号

f2(d[1],clk,clrb,q[1],), // 表示f1 到f4 都是flop

f3(d[2],clk,clrb,q[2],),

f4(d[3],clk,clrb,q[3],);

endmodule

[例3]用行为描述的方法来描述带请零端的四位寄存器。(文件名为:hardreg.v)module hardreg(d,clk,clrb,q);

input clk,clrb;

input[3:0] d;

output[3:0] q;

reg [3:0] q;

always @ (posedge clk or posedge clrb)

begin

if (clrb)

q <= 0;

else

q <= d;

end

endmodule

[例4]对四位带清零端的寄存器进行全面的测试。(文件名为:hardreg_top.v)

`include "flop.v"

`include " hardreg.v" //仿真时需要包含文件"hardreg.v" 和"flop.v"

/***如果仿真环境可以把有关的文件安排在一个项目中,只要底层模块经过编译,并记录在编译的库中,可以不用包含文件。**/

module hardreg_top; //顶层模块,没有输入和输出的端口

reg clock, clearb; //为产生测试用的时钟和清零信号需要寄存器

reg [3:0] data;//为产生测试用数据需要用寄存器

wire [3:0] qout; //为观察输出信号需要从模块实例端口中引出线

`define stim #100 data=4'b //宏定义stim,可使源程序简洁

event end_first_pass; //定义事件end_first_pass

hardreg reg_4bit (.d(data), .clk(clock), .clrb(clearb), .q(qout));

/************************************************************************

把本模块中产生的测试信号data、clock、clearb输入实例reg_4bit以观察输出信号qout。实例reg_4bit实际上是已经设计好的模块hardreg。实例引用的hardreg模块,根据包含文件的不同,可以是表示行为的模块也可以是表示结构的模块。

***********************************************************************/ initial

begin

clock = 0;

clearb = 1;

end

always #50 clock = ~clock;

always @(end_first_pass)

clearb = ~clearb;

always @(posedge clock)

$display("at time %0d clearb= %b data= %d qout= %d",

$time, clearb, data, qout);

/*****************************************************

类似于C语言的printf 语句,可打印不同时刻的信号值

******************************************************/

initial

begin

repeat(4) //重复四次产生下面的data变化

begin

data=4'b0000;

`stim 0001;

/***************************************************************

宏定义stim引用,等同于#100 data=4'b0001;。注意引用时要用`符号。

****************************************************************/

`stim 0010;

`stim 0011;

`stim 0100;

`stim 0101;

.

.

.

`stim 1110;

`stim 1111;

#200 -> end_first_pass;

end

/*********************************************** 延迟200个单位时间,触发事件end_first_pass

************************************************/ $finish; //结束仿真

end

endmodule

VerilogHDL经典程序非常适合新手

一、2线-4线译码器 module counter4(q1,q0,ncr,cp); input cp,ncr; output q1,q0; reg q1,q0; always@(posedge cp or negedge ncr) begin if(~ncr){q1,q0}<=2'b00; else{q1,q0}<={q1,q0}+1'b1; end endmodule 二、4选1数据选择器 module selector4_1(i0,i1,i2,i3,a1,a0,y); input i0,i1,i2,i3,a1,a0; output y; reg y; always@(a1or a0) begin case({a1,a0}) 2'b00:y=i0; 2'b01:y=i1; 2'b10:y=i2; 2'b11:y=i3; default:y=0; 一、2线-4线译码器 module counter4(q1,q0,ncr,cp); input cp,ncr; output q1,q0; reg q1,q0; always@(posedge cp or negedge ncr) begin if(~ncr){q1,q0}<=2'b00; else{q1,q0}<={q1,q0}+1'b1; end endmodule 二、4选1数据选择器 module selector4_1(i0,i1,i2,i3,a1,a0,y); input i0,i1,i2,i3,a1,a0; output y; reg y; always@(a1or a0) begin case({a1,a0}) 2'b00:y=i0;

第8章 微机原理习题库

一.填空题 1.类型码为()的中断所对应的中断向量存放在0000H:0058H开始的4个连续单元中,若这4个单元的内容分别为(),则相应的中断服务程序入口地址为5060H:7080H。 2.CPU在指令的最后一个时钟周期检测INTR引脚,若测得INTR为()且IF为(),则CPU在结束当前指令后响应中断请求。 3.从CPU的NMI引脚产生的中断叫做(),它的响应不受()的影响。 4.中断类型码为15H的中断,其服务程序的入口地址一定存放在()四个连续的单元中,若这四个单元的的内容为:66H、50H、88H、30H,则其服务程序的入口地址为()。5.中断控制器8259A中的中断屏蔽寄存器IMR的作用是()。 6.CPU响应可屏蔽中断的条件是()、()和()。 7.在8086/8088微机系统中,INT20H指令中断向量存放在()中。 8.CPU在响应中断时,首先是保护(),然后将中断服务程序入口地址送入()。9.在8086/8088微机中,实现CPU关中断的指令是(),实现开中断的指令是()。10.如果CPU同时接收到中断请求和总线请求,则CPU应先响应()。 11.当用8259A管理INTR中断时,要发出EOI命令结束中断是操作()命令字。12.执行INTn指令时,其中断类型号由()提供,响应INTR时,中断类型号由()提供,响应NMI时,中断类型号由()提供,执行BOUND指令时,中断类型号由( )提供。 13.INTR、NMI均属于外中断,其中INTR被称为()中断,NMI被称为()中断。 14.80486在实模式下,当某中断源的中断类型码为70H时,中断服务程序的偏移地址和段基址将分别填入()单元和()单元。 15.CUP复位时,由于()被清零,使从INTR输入的可屏蔽中断不被响应。 16.2片8259A级联可管理()个可屏蔽中断。 17.INTR输入是()有效。 18.级连系统中,从8259A中的INT引脚应与主8259A的()连接。 19.()时,使用8259A的CS2~CS0引脚。 20.用二片8259A级连后,CPU的可屏蔽方式硬中断可扩充到()级。

Verilog编码风格

Verilog编码风格 嵌入式开发2010-05-03 15:28:13 阅读14 评论0 字号:大中小订阅 这是以前公司的对fpga代码编写的要求 良好代码编写风格的通则概括如下: (1)对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写; (2)使用有意义的信号名、端口名、函数名和参数名; (3)信号名长度不要太长; (4)对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀; (5)对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字; (6)对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。注意在同一个设计中要使用同一个小写字母表示低电平有效; (7)对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n; (8)当描述多比特总线时,使用一致的定义顺序,对于verilog 建议采用bus_signal[x:0]的表示; (9)尽量遵循业界已经习惯的一些约定。如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等; (10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等; (11)使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂; (12)每一行语句独立成行。尽管VHDL 和Verilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性; (13)建议采用缩进提高续行和嵌套语句得可读性。缩进一般采用两个空格,如西安交通大学SOC 设计中心 2 如果空格太多则在深层嵌套时限制行长。同时缩进避免使用TAB 键,这样可以避免不同机器TAB 键得设置不同限制代码得可移植能力; (14)在RTL 源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog 和VHDL 语言的关键字; (15)在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序:

74LS138Verilog源码

`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2020/02/28 13:40:03 // Design Name: // Module Name: _74ls138 // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module _74ls138(nE1,nE2,E3,B,nY); input nE1,nE2,E3; input [2:0]B; output[7:0]nY; reg[7:0]nY; always@(nE1,nE2,E3,B) if(!nE1 && !nE2 && E3) begin case(B) 3'b000: nY = 8'b1111_1110; 3'b001: nY = 8'b1111_1101; 3'b010: nY = 8'b1111_1011; 3'b011: nY = 8'b1111_0111; 3'b100: nY = 8'b1110_1111; 3'b101: nY = 8'b1101_1111; 3'b110: nY = 8'b1011_1111; 3'b111: nY = 8'b0111_1111; default:nY = 8'b1111_1111; endcase end

c语言程序设计-向艳-书上例题源代码教学提纲

第五章函数 1.定义一个求两个整数和的函数 int sum(x,y) int x,y; { int z; z=x+y; return(z); } 2.编写函数求两个数的最大值 #include float max(float x,float y) { float z; if(x>y) z=x; else z=y; return (z); } void main() { float a,b,c; scanf("%f%f",&a,&b); c=max(a,b); printf("max=&f\n",c); } 3.计算并输出一个圆台两底面积之和 #include float area(float x,float y) { float s; s=3.1415*(x*x+y*y); return s; } void printstar() { int i; for(i=0;i<30;i++) printf("*"); printf("\n"); } void main() {

float r1,r2,s; printstar(); scanf("%f,%f",&r1,&r2); s=area(r1,r2); printf("s=%.2f\n",s); printstar(); } 4.实参求值顺序的例子 #include int fun(int a,int b) { if (a>b) return 1; else if (a==b) return 0; else return -1; } void main() { int k=3,s; s=fun(k,++k); printf("s=%d\n",s); } 5.计算Σn i=1 i #include void main() { void s(int); int n; printf("input number\n"); scanf("%d",&n); s(n); printf("n=%d\n",n); } void s(int n) { int i; for(i=n-1;i>=1;i--) n=n+i; printf("n=%d\n",n); } 6.全局变量被“屏蔽” #include

全数字锁相环的verilog源代码讲解

支持论坛发展帖出全数字锁相环的verilog源代码,仿真已通过 module dpll(reset,clk,signal_in,signal_out,syn; parameter para_K=4; parameter para_N=16; input reset; input clk; input signal_in; output signal_out; output syn; reg signal_out; reg dpout; reg delclk; reg addclk; reg add_del_clkout; reg [7:0]up_down_cnt; reg [2:0]cnt8; reg [8:0]cnt_N; reg syn; reg dpout_delay; reg [8:0]cnt_dpout_high; reg [8:0]cnt_dpout_low; /******phase detector*****/ always@(signal_in or signal_out begin dpout<=signal_in^signal_out; end /******synchronization establish detector*****/ always@(posedge clk or negedge reset begin if(!reset dpout_delay<='b0; else dpout_delay<=dpout; end always@(posedge clk or negedge reset begin if(!reset begin cnt_dpout_high<='b0; cnt_dpout_low<='b0; end else if(dpout if(dpout_delay==0 cnt_dpout_high<='b0; else if(cnt_dpout_high==8'b11111111 cnt_dpout_high<='b0; else cnt_dpout_high<=cnt_dpout_high+1; else if(!dpout if(dpout_delay==1 cnt_dpout_low<='b0; else if(cnt_dpout_low==8'b11111111 cnt_dpout_low<='b0; else cnt_dpout_low<=cnt_dpout_low+1; end always@(posedge clk or negedge reset begin if(!reset syn<='b0; else if((dpout&&!dpout_delay||(!dpout&&dpout_delay if(cnt_dpout_high[8:0]-cnt_dpout_low[8:0]<=4||cnt_dpout_low[8:0]- cnt_dpout_high[8:0]<=4 syn<='b1; else syn<='b0; end /****up down couter with mod=K****/ always@(posedge clk or negedge reset begin if(!reset begin delclk<='b0; addclk<='b0; up_down_cnt<='b00000000; end else begin if(!dpout begin delclk<='b0; if(up_down_cnt==para_K-1 begin up_down_cnt<='b00000000; addclk<='b0; end else begin up_down_cnt<=up_down_cnt+1; addclk<='b0; end end else begin addclk<='b0; if(up_down_cnt=='b0 begin up_down_cnt<=para_K-1; delclk<='b0; end else if(up_down_cnt==1 begin delclk<='b1; up_down_cnt<=up_down_cnt-1; end else up_down_cnt<=up_down_cnt-1; end end end /******add and delete clk*****/ always@(posedge clk or negedge reset begin if(!reset begin cnt8<='b000; end else begin if(cnt8=='b111 begin cnt8<='b000; end else if(addclk&&!syn begin cnt8<=cnt8+2; end else if(delclk&&!syn

第06章_MATLAB数值计算_例题源程序汇总

第6章 MATLAB 数值计算 例6.1 求矩阵A 的每行及每列的最大和最小元素,并求整个矩阵的最大和最小元素。 1356 78256323578255631 01-???? -? ?=???? -??A A=[13,-56,78;25,63,-235;78,25,563;1,0,-1]; max(A,[],2) %求每行最大元素 min(A,[],2) %求每行最小元素 max(A) %求每列最大元素 min(A) %求每列最小元素 max(max(A)) %求整个矩阵的最大元素。也可使用命令:max(A(:)) min(min(A)) %求整个矩阵的最小元素。也可使用命令:min(A(:)) 例6.2 求矩阵A 的每行元素的乘积和全部元素的乘积。 A=[1,2,3,4;5,6,7,8;9,10,11,12]; S=prod(A,2) prod(S) %求A 的全部元素的乘积。也可以使用命令prod(A(:)) 例6.3 求向量X =(1!,2!,3!,…,10!)。 X=cumprod(1:10) 例6.4 对二维矩阵x ,从不同维方向求出其标准方差。 x=[4,5,6;1,4,8] %产生一个二维矩阵x y1=std(x,0,1) y2=std(x,1,1) y3=std(x,0,2) y4=std(x,1,2) 例6.5 生成满足正态分布的10000×5随机矩阵,然后求各列元素的均值和标准方差,再求这5列随机数据的相关系数矩阵。 X=randn(10000,5); M=mean(X) D=std(X) R=corrcoef(X)

例6.6 对下列矩阵做各种排序。 185412613713-?? ??=?? ??-?? A A=[1,-8,5;4,12,6;13,7,-13]; sort(A) %对A 的每列按升序排序 -sort(-A,2) %对A 的每行按降序排序 [X,I]=sort(A) %对A 按列排序,并将每个元素所在行号送矩阵I 例6.7 给出概率积分 2 (d x x f x x -? e 的数据表如表6.1所示,用不同的插值方法计算f (0.472)。 x=0.46:0.01:0.49; %给出x ,f(x) f=[0.4846555,0.4937542,0.5027498,0.5116683]; format long interp1(x,f,0.472) %用默认方法,即线性插值方法计算f(x) interp1(x,f,0.472,'nearest') %用最近点插值方法计算f(x) interp1(x,f,0.472,'spline') %用3次样条插值方法计算f(x) interp1(x,f,0.472,'cubic') %用3次多项式插值方法计算f(x) format short 例6.8 某检测参数f 随时间t 的采样结果如表6.2,用数据插值法计算t =2,7,12,17,22,17,32,37,42,47,52,57时的f 值。 T=0:5:65; X=2:5:57;

verilog有限状态机实验报告(附源代码)

有限状态机实验报告 一、实验目的 ●进一步学习时序逻辑电路 ●了解有限状态机的工作原理 ●学会使用“三段式”有限状态机设计电路 ●掌握按键去抖动、信号取边沿等处理技巧 二、实验内容 用三段式有限状态机实现序列检测功能电路 a)按从高位到低位逐位串行输入一个序列,输入用拨动开关实现。 b)每当检测到序列“1101”(不重叠)时,LED指示灯亮,否则灭,例如 i.输入:1 1 0 1 1 0 1 1 0 1 ii.输出:0 0 0 1 0 0 0 0 0 1 c)用八段数码管显示最后输入的四个数,每输入一个数,数码管变化一次 d)按键按下的瞬间将拨动开关状态锁存 i.注意防抖动(按键按下瞬间可能会有多次的电平跳变) 三、实验结果 1.Rst_n为0时数码管显示0000,led灯不亮,rst_n拨为1,可以开始输入,将输 入的开关拨到1,按下按钮,数码管示数变为0001,之后一次类推分别输入1, 0,1,按下按钮后,数码管为1101,LED灯亮,再输入1,LED灯灭,之后再输 入0,1(即共输入1101101使1101重叠,第二次LED灯不亮),之后单独输入

1101,LED灯亮 2.仿真图像 刚启动时使用rst_n 一段时间后 其中Y代表输出,即控制led灯的信号,sel表示数码管的选择信号,seg表示数码管信号 四、实验分析 1、实验基本结构

其中状态机部分使用三段式结构: 2、整体结构为:

建立一下模块: Anti_dither.v 输入按键信号和时钟信号,输出去除抖动的按键信号生成的脉冲信号op 这一模块实现思路是利用按钮按下时会持续10ms以上而上下抖动时接触时间不超过10ms来给向下接触的时间计时,达到上限时间才产生输出。 Num.v 输入op和序列输入信号A,时钟信号clk和复位信号,复位信号将num置零,否则若收到脉冲信号则将num左移一位并将输入存进最后一位。输出的num即为即将在数码管上显示的值 Scan.v 输入时钟信号,对其降频以产生1ms一次的扫描信号。 Trigger.v 这一模块即为状态机模块,按三段式书写。 整个模块的输入为时钟信号,脉冲信号,序列输入变量,复位信号,输出LED灯控制信号Y。 第一段是状态转换模块,为时序逻辑电路,功能是描述次态寄存器迁移到现态寄存器。即如果收到复位信号将现态置零,否则将上次得到的next_state赋给current_state。

Verilog状态机的写法

Verilog状态机的写法-转 1 引言 Verilog HDL作为当今国际主流的HDL语言,在芯片的前端设计中有着广泛的应用。它的语法丰富,成功地应用于设计的各个阶段:建模、仿真、验证和综合等。可综合是指综合工具能将Verilog HDL代码转换成标准的门级结构网表,因此代码的描述必须符合一定的规则。大部分数字系统都可以分为控制单元和数据单元两个部分,控制单元的主体是一个状态机,它接收外部信号以及数据单元产生的状态信息,产生控制信号,因而状态机性能的好坏对系统性能有很大的影响。 有许多可综合状态机的Verilog代码描述风格,不同代码描述风格经综合后得到电路的物理实现在速度和面积上有很大差别。优秀的代码描述应当易于修改、易于编写和理解,有助于仿真和调试,并能生成高效的综合结果。 2 有限状态机 有限状态机(Finite State Machine,FSM)在数字系统设计中应用十分广泛。根据状态机的输出是否与输入有关,可将状态机分为两大类:摩尔(Moore)型状态机和米莉 (Mealy)型状态机。Moore型状态机的输出仅与现态有关;Mealy型状态机的输出不仅与现态有关,而且和输入也有关。图1是有限状态机的一般结构图,它主要包括三个部分,其中组合逻辑部分包括状态译码器和输出译码器,状态译码器确定状态机的下一个状态,输出译码器确定状态机的输出,状态寄存器属于时序逻辑部分,用来存储状态机的内部状态。 图1 状态机的结构框图 2.1 好的状态机标准 好的状态机的标准很多,最重要的几个方面如下: 第一,状态机要安全,是指FSM不会进入死循环,特别是不会进入非预知的状态,而且由于某些扰动进入非设计状态,也能很快的恢复到正常的状态循环中来。这里面有两层含义。其一要求该FSM的综合实现结果无毛刺等异常扰动,其

第2章例题源程序

例2.1 计算表达式 i 27147cos 5-++? 的值,并将结果赋给变量x ,然 后显示出结果。 x=(5+cos(47*pi/180))/(1+sqrt(7)-2*i) %计算表达式的值 例2.2 利用M 文件建立MYMAT 矩阵。 (1)启动有关编辑程序或MATLAB 文本编辑器(见第4章),并输 入待建矩阵: MYMAT=[101,102,103,104,105,106,107,108,109 ; 201,202,203,204,205,206,207,208,209; 301,302,303,304,305,306,307,308,309]; (2)把输入的内容存盘(设文件名为mymatrix.m)。 (3)在MATLAB 命令窗口中输入mymatrix ,即运行该M 文件,就会自动建立一个名为MYMAT 的矩阵,可供以后使用。 例2.3 建立5阶方阵A ,判断A 的元素是否能被3整除。 A =[24,35,13,22,63;23,39,47,80,80; ... 90,41,80,29,10;45,57,85,62,21;37,19,3 1,88,76] P=rem(A,3)==0 %判断A 的元素是否可以被3整 除 例2.4 在[0,3π]区间,求y=sin(x)的值。要求: (1)消去负半波,即(π,2π)区间内的函数值置0。

2 (2) (3π,32π)和(37π,38π)区间内取值均为sin 3 π。 方法1: x=0:pi/100:3*pi; y=sin(x); y1=(x2*pi).*y; %消去负半波 q=(x>pi/3&x<2*pi/3)|(x>7*pi/3&x<8*pi/3); qn=~q; y2=q*sin(pi/3)+qn.*y1; %按要求处理第 (2)步 方法2: x=0:pi/100:3*pi; y=sin(x); y1=(y>=0).*y; %消去负半波 p=sin(pi/3); y2=(y>=p)*p+(y=10 & A<=20) ans = 3 6 7 例2.6 建立一个字符串向量,然后对该向量做如下处理:

Verilog的135个经典设计实例

【例3.1】4位全加器 module adder4(cout,sum,ina,inb,cin); output[3:0] sum; output cout; input[3:0] ina,inb; input cin; assign {cout,sum}=ina+inb+cin; endmodule 【例3.2】4位计数器 module count4(out,reset,clk); output[3:0] out; input reset,clk; reg[3:0] out; always @(posedge clk) begin if (reset) out<=0; //同步复位 else out<=out+1; //计数 end endmodule 【例3.3】4位全加器的仿真程序 `timescale 1ns/1ns `include "adder4.v" module adder_tp; //测试模块的名字 reg[3:0] a,b; //测试输入信号定义为reg型 reg cin; wire[3:0] sum; //测试输出信号定义为wire型 wire cout; integer i,j; adder4 adder(sum,cout,a,b,cin); //调用测试对象 always #5 cin=~cin; //设定cin的取值 initial begin a=0;b=0;cin=0; for(i=1;i<16;i=i+1) #10 a=i; //设定a的取值 end - 1 -

initial begin for(j=1;j<16;j=j+1) #10 b=j; //设定b的取值 end initial//定义结果显示格式 begin $monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum); #160 $finish; end endmodule 【例3.4】4位计数器的仿真程序 `timescale 1ns/1ns `include "count4.v" module coun4_tp; reg clk,reset; //测试输入信号定义为reg型 wire[3:0] out; //测试输出信号定义为wire型 parameter DELY=100; count4 mycount(out,reset,clk); //调用测试对象 always #(DELY/2) clk = ~clk; //产生时钟波形 initial begin//激励信号定义 clk =0; reset=0; #DELY reset=1; #DELY reset=0; #(DELY*20) $finish; end //定义结果显示格式 initial $monitor($time,,,"clk=%d reset=%d out=%d", clk, reset,out); endmodule 【例3.5】“与-或-非”门电路 module AOI(A,B,C,D,F); //模块名为AOI(端口列表A,B,C,D,F) input A,B,C,D; //模块的输入端口为A,B,C,D output F; //模块的输出端口为F - 2 -

VHDL+Verilog良好的代码编写风格

VHDL+Verilog良好的代码编写风格(二十五条) 田Sir 发表于: 2010-4-28 13:56 来源: 湖北师范学院电工电子实验教学示范中心良好代码编写风格可以满足信、达、雅的要求。在满足功能和性能目标的前提下,增强代码的可读性、可移植性,首要的工作是在项目开发之前为整个设计团队建立一个命名约定和缩略语清单,以文档的形式记录下来,并要求每位设计人员在代码编写过程中都要严格遵守。良好代码编写风格的通则概括如下:(1)对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写; (2)使用有意义的信号名、端口名、函数名和参数名; (3)信号名长度不要太长; (4)对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀;(5)对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字; (6)对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。注意在同一个设计中要使用同一个小写字母表示低电平有效; (7)对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n; (8)当描述多比特总线时,使用一致的定义顺序,对于verilog 建议采用bus_signal[x:0]的表示; (9)尽量遵循业界已经习惯的一些约定。如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等; (10)在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等;(11)使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂; (12)每一行语句独立成行。尽管VHDL 和Verilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性;(13)建议采用缩进提高续行和嵌套语句得可读性。缩进一般采用两个空格,如西安交通大学SOC 设计中心2 如果空格太多则在深层嵌套时限制行长。同时缩进避免使用TAB 键,这样可以避免不同机器TAB 键得设置不同限制代码得可移植能力; (14)在RTL 源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog 和VHDL 语言的关键字; (15)在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序:输入信号的clk、rst、enables other control signals、data and address signals。然后再申明输出信号的clk、rst、enalbes other control signals、data signals; (16)在例化模块时,使用名字相关的显式映射而不要采用位置相关的映射,这样可以提高代码的可读性和方便debug 连线错误; (17)如果同一段代码需要重复多次,尽可能使用函数,如果有可能,可以将函数通用化,以使得它可以复用。注意,内部函数的定义一般要添加注释,这样可以提高代码的可读性; (18)尽可能使用循环语句和寄存器组来提高源代码的可读性,这样可以有效地减少代码行数; (19)对一些重要的always 语句块定义一个有意义的标号,这样有助于调试。注意标号名不要与信号名、变量名重复; (20)代码编写时的数据类型只使用IEEE 定义的标准类型,在VHDL 语言中,设计者可以定义新的类型和子类型,但是所有这些都必须基于IEEE 的标准; (21)在设计中不要直接使用数字,作为例外,可以使用0 和1。建议采用参数定义代替直接的数字。同

第10章例题verilog源代码(夏宇闻版)

第十章例题 module add_4( X, Y, sum, C); input [3 : 0] X, Y; output [3: 0] sum; output C; assign {C, Sum } = X + Y; endmodule //而16位加法器只需要扩大位数即可,见下例: module add_16( X, Y, sum, C); input [15 : 0] X, Y; output [15 : 0] sum; output C; assign {C, Sum } = X + Y; endmodule 快速乘法器常采用网格形式的迭带阵列结构,图10.3示出两个四位二进制数相乘的结构图,//用Verilog HDL来描述乘法器是相当容易的,只需要把运算表达式写出就可以了,见下例。module mult_4( X, Y, Product); input [3 : 0] X, Y; output [7 : 0] Product; assign Product = X * Y; endmodule // 而8位乘法器只需要扩大位数即可,见下例: module mult_8( X, Y, Product); input [7 : 0] X, Y; output [15 : 0] Product; assign Product = X * Y; endmodule

// 下面就是一个位数可以由用户定义的比较电路模块: module compare_n ( X, Y, XGY, XSY, XEY); input [width-1:0] X, Y; output XGY, XSY, XEY; reg XGY, XSY, XEY; parameter width = 8; always @ ( X or Y ) // 每当X 或Y 变化时 begin if ( X = = Y ) XEY = 1; // 设置X 等于Y的信号为1 else XEY = 0; if (X > Y) XGY = 1; // 设置X 大于Y的信号为1 else XGY = 0; if (X < Y) XSY = 1; // 设置X 小于Y的信号为1 else XSY = 0; end endmodule //下面就是带使能控制信号(nCS)的数据位宽可以由用户定义的(8位)八路数据通道选择器模块: module Mux_8( addr,in1, in2, in3, in4, in5, in6, in7, in8, Mout, nCS); input [2:0] addr; input [width-1:0] in1, in2, in3, in4, in5, in6, in7, in8; input nCS; output [width-1:0] Mout; parameter width = 8; always @ (addr or in1 or in2 or in3 or in4 or in5 or in6 or in7 or in8 or nCS) begin if (!nCS) //nCS 低电平使多路选择器工作 case(addr) 3’b000: Mout = in1; 3’b001: Mout = in2; 3’b010: Mout = in3; 3’b011: Mout = in4;

个人总结Verilog代码编写的25条经验

个人总结Verilog代码编写的25条经验 1、对所有的信号名、变量名和端口名都用小写,这样做是为了和业界的习惯保持一致;对常量名和用户定义的类型用大写; 2、使用有意义的信号名、端口名、函数名和参数名; 3、信号名长度不要太长; 4、对于时钟信号使用clk 作为信号名,如果设计中存在多个时钟,使用clk 作为时钟信号的前缀; 5、对来自同一驱动源的信号在不同的子模块中采用相同的名字,这要求在芯片总体设计时就定义好顶层子模块间连线的名字,端口和连接端口的信号尽可能采用相同的名字; 6、对于低电平有效的信号,应该以一个下划线跟一个小写字母b 或n 表示。注意在同一个设计中要使用同一个小写字母表示低电平有效; 7、对于复位信号使用rst 作为信号名,如果复位信号是低电平有效,建议使用rst_n; 8、当描述多比特总线时,使用一致的定义顺序,对于verilog 建议采用bus_signal[x:0]的表示; 9、尽量遵循业界已经习惯的一些约定。如*_r 表示寄存器输出,*_a 表示异步信号,*_pn 表示多周期路径第n 个周期使用的信号,*_nxt 表示锁存前的信号,*_z 表示三态信号等; 10、在源文件、批处理文件的开始应该包含一个文件头、文件头一般包含的内容如下例所示:文件名,作者,模块的实现功能概述和关键特性描述,文件创建和修改的记录,包括修改时间,修改的内容等; 11、使用适当的注释来解释所有的always 进程、函数、端口定义、信号含义、变量含义或信号组、变量组的意义等。注释应该放在它所注释的代码附近,要求简明扼要,只要足够说明设计意图即可,避免过于复杂; 12、每一行语句独立成行。尽管VHDL 和Verilog 都允许一行可以写多个语句,当时每个语句独立成行可以增加可读性和可维护性。同时保持每行小于或等于72 个字符,这样做都是为了提高代码得可读性; 13、建议采用缩进提高续行和嵌套语句得可读性。缩进一般采用两个空格,如西安交通大学SOC 设计中心2 如果空格太多则在深层嵌套时限制行长。同时缩进避免使用TAB 键,这样可以避免不同机器TAB 键得设置不同限制代码得可移植能力; 14、在RTL 源码的设计中任何元素包括端口、信号、变量、函数、任务、模块等的命名都不能取Verilog 和VHDL 语言的关键字; 15、在进行模块的端口申明时,每行只申明一个端口,并建议采用以下顺序: 输入信号的clk、rst、enables other control signals、data and address signals。然后再申明输出信号的clk、rst、enalbes other control signals、data signals; 16、在例化模块时,使用名字相关的显式映射而不要采用位置相关的映射,这样可以提高代码的可读性和方便debug 连线错误; 17、如果同一段代码需要重复多次,尽可能使用函数,如果有可能,可以将函数通用化,以使得它可以复用。注意,内部函数的定义一般要添加注释,这样可以提高代码的可读性;

第十章 输入输出系统习题

第十章输入输出系统习题 一、单项选择题: 1、“总线忙”信号是由__ __建立的。 A.获得总线控制权的设备B.发出“总线请求”的设备 C.总线控制器D.CPU 2、在不同速度的设备之间传送数据__ __。 A.必须采用同步控制方式B.必须采用异步控制方式 C.可以选用同步方式,也可选用异步方式D.必须采用应答方式 3、挂接在总线上的多个部件___ _。 A.只能分时向总线发送数据,并只能分时从总线接收数据 B.只能分时向总线发送数据,但可同时从总线接收数据 C.可同时向总线发送数据,并同时从总线接收数据 D.可同时向总线发送数据,但只能分时从总线接收数据 4、总线从设备是____。 A.掌握总线控制权的设备 B.申请作为从设备的设备 C.被主设备访问的设备D.总线裁决部件 5、假设某系统总线在一个总线周期中传输4个字节信息,一个总线周期占用2个时钟周期,总线时钟频率为10MHz,则总线带宽是__ __。 A.10 MB/s B.20 MB/s C.40 MB/s D.80 MB/s 6、波特率表示传输线路上____。 A.信号的传输速率B.有效数据的传输速率 C.校验信号的传输速率D.干扰信号的传输速率 7、中断系统中的断点是指____。 A.子程序入口地址B.中断服务子程序入口地址 C.中断服务程序入口地址表D.中断返回地址 8、显示器的主要参数之一是分辨率,其含义是____。 A.显示屏幕的水平和垂直扫描频率 B.显示屏幕上光栅的列数和行数 C.可显示不同颜色的总线 D.同一个画面允许显示不同颜色的最大数目 9、下列选项中,能引起外部中断的事件是____。 A.键盘输入B.除数为0 C.浮点运算下溢D.访存缺页 10.CPU响应中断时,最先完成的两个步骤是_ __和保护现场信息。 A.开中断 B.恢复现场 C.关中断 D.不可屏蔽中断 11、在独立编址方式下,存储单元和I/O设备是靠来区分的。 A.不同的地址代码B.不同的地址总线 C.不同的指令和不同的控制信号D.上述都不同 12、计算机系统的输入/输出接口通常是__ __。 A.CPU与存储器之间的交界面B.存储器与打印机之间的交界面 C.主机与外围设备之间的交界面D.CPU与系统总线之间的交界面 13.根据连线的数量,总线可分为串行总线和_____ ___总线

基于FPGA的SDRAM实验Verilog源代码

// megafunction wizard: %ALTPLL% // GENERATION: STANDARD // VERSION: WM1.0 // MODULE: altpll // ============================================================ // File Name: clk_ctrl.v // Megafunction Name(s): // altpll // // Simulation Library Files(s): // altera_mf // ============================================================ // ************************************************************ // THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! // // 11.0 Build 208 07/03/2011 SP 1 SJ Full Version // ************************************************************ //Copyright (C) 1991-2011 Altera Corporation //Your use of Altera Corporation's design tools, logic functions //and other software and tools, and its AMPP partner logic //functions, and any output files from any of the foregoing //(including device programming or simulation files), and any //associated documentation or information are expressly subject //to the terms and conditions of the Altera Program License //Subscription Agreement, Altera MegaCore Function License //Agreement, or other applicable license agreement, including, //without limitation, that your use is for the sole purpose of //programming logic devices manufactured by Altera and sold by //Altera or its authorized distributors. Please refer to the //applicable agreement for further details. // synopsystranslate_off `timescale 1 ps / 1 ps // synopsystranslate_on moduleclk_ctrl ( areset, inclk0, c0, c1, c2,

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