文档库 最新最全的文档下载
当前位置:文档库 › verilog hdl答案

verilog hdl答案

verilog hdl答案
verilog hdl答案

第1章简介

1.Verilog HDL是在哪一年首次被IEEE标准化的?

Verilog HDL是在1995年首次被IEEE标准化的。

2.Verilog HDL支持哪三种基本描述方式

Verilog HDL可采用三种不同方式或混合方式对设计建模。这些方式包括:行为描述方式—使用过程化结构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述建模

3.可以使用Verilog HDL描述一个设计的时序吗?

Verilog HDL可以清晰的建立时序模型,故可以使用Verilog HDL描述一个设计的时序。

4.语言中的什么特性能够用于描述参数化设计?

在行为级描述中, Verilog HDL不仅能够在RT L级上进行设计描述,而且能够在体系结

构级描述及其算法级行为上进行设计描述,而且能够使用门和模块实例化语句在结构级进行结构描述,这种特性可用于描述参数化设计。

5.能够使用Verilog HDL编写测试验证程序吗?

能,可以编写testbench来对编写的程序进行验证。

6.Verilog HDL是由哪个公司最先开发的?

Verilog HDL是由Gateway Design Automation公司最先开发的

7.Verilog HDL中的两类主要数据类型是什么?

线网数据类型和寄存器数据类型。线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。

8.UDP代表什么?

UDP代表用户定义原语

9.写出两个开关级基本门的名称。

pmos nmos

10.写出两个基本逻辑门的名称。

and or

第2章 HDL指南

1. 在数据流描述方式中使用什么语句描述一个设计?

设计的数据流行为使用连续赋值语句进行描述

2. 使用` t i m e s c a l e 编译器指令的目的是什么?举出一个实例。

使用编译指令将时间单位与物理时间相关联。

例如` timescale 1ns /100ps 此语句说明时延时间单位为1ns并且时间精度为100ps (时间精度是指所有的时延必须被限定在0.1ns内)

3. 在过程赋值语句中可以定义哪两种时延?请举例详细说明。

1) 语句间时延: 这是时延语句执行的时延。

例:S u m = (A ^ B) ^ C i n;

#4 T 1 = A & C i n;

在第二条语句中的时延规定赋值延迟4个时间单位执行

2) 语句内时延: 这是右边表达式数值计算与左边表达式赋值间的时延。

例:S u m = #3 (A^ B) ^ C i n;

这个赋值中的时延意味着首先计算右边表达式的值, 等待3个时间单位,然后赋值给S u m。

4. 采用数据流描述方式描述图2 - 4中所示的1位全加器。

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

input A, B, Cin ;

output Sum, Cout;

wire T1, T2, T3,S1;

assign T1 = A & Cin;

assign T2 = B & Cin;

assign T3 = A & B;

assign S1=A^B;

assign Sum=S1^Cin;

assign Cout= (T 1| T 2) | T 3;

endmodule

4. initial语句与always 语句的关键区别是什么?

1) initial语句:此语句只执行一次。

2) always语句:此语句总是循环执行, 或者说此语句重复执行。

6. 写出产生图2 - 1 0所示波形的变量B u l l s E y e的初始化语句。

`timescale 1ns / 1ns

module Test (BullsEye) ;

output BullsEye;

reg BullsEye;

initial

begin

BullsEye = 0;

BullsEye=#2 1;

BullsEye=#1 0;

BullsEye=#9 1;

BullsEye=#10 0;

BullsEye=#2 1;

BullsEye=#3 0;

BullsEye=#5 1;

end

endmodule

7. 采用结构描述方式描写图2 - 2中所示的2 - 4译码器。

module Decoder2x4(A, B, EN, Z) ;

input A,B,EN;

output [0:3] Z;

wire Abar, Bbar;

not

v0(Abar,A),

v1(Bbar,B);

nand

N0(Z[0],Abar,Bbar,EN),

N1(Z[1],Abar,B,EN),

N2(Z[2],A,Bbar,EN),

N3(Z[3],A,B,EN);

endmodule

8. 为2 . 3节中描述的模块Decode2X4编写一个测试验证程序。module Tes;

reg TA,TB,TEN;

wire [0:3]TZ;

Decoder2x4 DT2x4(TA,TB,TEN,TZ);

initial

begin

$monitor($time,"A=%b,B=%b,EN=%b,Z=%b",TA,TB,TEN,TZ);

end

initial

begin

TA=0;TB=0;TEN=0;

#5 TA=1;TB=1;

#5 TEN=1;

#5 TA=0;TB=0;

#5 TA=0;TB=1;

#5 TA=1;TB=0;

end

endmodule

9. 列出你在Verilog HDL模型中使用的两类赋值语句。

连续赋值语句assign,阻塞赋值语句=

1 0. 在顺序过程中何时需要定义标记?

顺序过程内有局部声明的变量时,初始化语句中的顺序过程必须标记。

11. 使用数据流描述方式编写图2 - 11所示的异或逻辑的Verilog HDL描述,并使用规定的时延。

module XORL(A,B,Z);

input A,B;

output Z;

wire Abar,Bbar,Z1,Z2;

assign #1 Bbar=~B;

assign #1 Abar=~A;

assign #5 Z1=A&Bbar;

assign #5 Z2=B&Abar;

assign #4 Z=Z1|Z2;

endmodule

12. 找出下面连续赋值语句的错误。assign Reset = #2 ^ WriteBus;

不符合连续赋值语句的语法,应该为:

assign #2 Reset = ^ WriteBus;

第3章 Verilog 语言要素

1.下列标识符哪些合法,哪些非法?

COunT, 1_2 Many, \**1, Real?, \wait, Initial

答:COunT合法,1_2 Many非法,\**1,Real?非法,\wait合法,Initial合法2. 系统任务和系统函数的第一个字符标识是什么?

答:$

3.举例说明文本替换编译指令?

答:` define指令用于文本替换,它很像C语言中的#define指令,如:

` define MAX_BUS_SIZE 32

. . .

reg [ `MAX_BUS_SIZE - 1:0 ] AddReg;

4.在Verilog HDL 中是否有布尔类型?

答:没有

5.下列表达式的位模式是什么?

7'o44 位八进制数, 'Bx0位二进制数, 5'bx110位二进制数, 'hA0位十六进制数, 10'd2位十进制数, 'hzF位十六进制数

6.赋值后存储在Qpr中的位模式是什么?

reg [1:8*2] Qpr;

. . .

Qpr = "ME" ;

答:变量需要8 * 2位

7.如果线网类型变量说明后未赋值,其缺省值为多少?

答:z

8.Verilog HDL 允许没有显示说明的线网类型。如果是这样,怎样决定线网类型?

答:在Verilog HDL 中,有可能不必声明某种线网类型。在这样的情况下,缺省线网类型为1位线网。

可以使用` default_nettype编译器指令改变这一隐式线网说明方式。使用方法如下:` default_nettype net_kind

例如,带有下列编译器指令:

`default_nettype wand

任何未被说明的网缺省为1位线与网。

9.下面的说明错在哪里?

integer [0:3] Ripple;

答:应该是integer Ripple [0:3]

10.编写一个系统任务从数据文件“ memA . data” 中加载32×64字存储器。

答:reg[15:0] RomB[0:2047];

$readmemb ("memA.data",RomB);

11.写出在编译时覆盖参数值的两种方法。

答:以使用参数定义语句或通过在模块初始化语句中定义参数值。

第4章表达式

1.说明参数GATE_DELAY,参数值为5。

parameter GATE_DELAY = 5

2.假定长度为64个字的存储器,每个字8位,编写Verilog代码,按逆序交换存储器的内容。即将第0个字与第63个字交换,第1个字与第62个字交换,以此类推。

reg [7:0] mem [63:0];

integer i = 0;

reg [7:0] temp;

while(i < 32)

begin

temp = mem[i];

mem[i] = mem[63 - i];

mem[63 - i] = temp;

i = i + 1;

end

3.假定32位总线Address_Bus,编写一个表达式,计算从第11位到底20位的归约与非。

~& addressBus[20:11]

4.假定一条总线Control_Bus[15:0],编写赋值语句将总线分为两条总线:Abus[0:9]和Bbus[6:1]。

Abus = ControlBus[9:0];

Bbus = ControlBus[15:10];

5.编写一个表达式,执行算术移位,将Qparity中包含的8位有符号数算术移位。

{Qparity[7-i:0], Qparity[7:8-i]}//左移,i表示移的位数

{Qparity[i-1:0], Qparity[7: i]}//右移,i表示移的位数

6.使用条件操作符,编写赋值语句选择NextState的值。如果CurrentState的值为RESET,那么NextState的值为GO;如果CurrentState的值为GO,则NextState的值为BUSY;如果CurrentState的值为BUSY,则NextState的值为RESET。

NextState = (CurrentState == RESET) ? Go : (CurrentState == Go ? BUSY : RESET)

7.使用单一连续赋值语句为图2-2所示的2-4解码器电路的行为建模。【提示:使用移位操作符、条件操作符和连接操作符。】

assign Z = EN ? {~(A & B), ~(A & ~B), ~(~A & B), ~(~A & ~B)} : 4b'1111;

8.如何从标量变量A、B、C和D中产生总线BusQ[3:0]?如何从两条总线BusA[3:0]和BusY[20:15]形成新的总线BusR[10:1]?

BusQ[3:0] = {D, C, B, A}

BusR[10:1] = {BusY[20:15], BusA[3:0]}

第5章门电平模型化

1. 用基本门描述图5 - 11显示的电路模型。编写一个测试验证程序用于测试电路的输出。

使用所有可能的输入值对电路进行测试。

module compare(A,B,Q);

input [3:0] A;

input [3:0] B;

output Q;

xor (E0,A[0],B[0]),

(E1,A[1],B[1]),

(E2,A[2],B[2]),

(E3,A[3],B[3]);

or (Q,E0,E1,E2,E3);

endmodule

测试:

module comparetest;

parameter CLK_PERIOD=20;//20ns 50MHZ

reg [7:0] p;

reg [3:0] A;

reg [3:0] B;

reg clock;

reg [7:0] p1;

initial

clock=0;

always #(CLK_PERIOD/2)clock=~clock;

initial

p=8'b00000000;

always @(posedge clock)

begin

p1=p;

p=p1+1;

A[0]=p[0];

A[1]=p[1];

A[2]=p[2];

A[3]=p[3];

B[0]=p[4];

B[1]=p[5];

B[2]=p[6];

B[3]=p[7];

end

compare inst_compare( .A(A), .B(B));

endmodule

2. 使用基本门描述如图5 - 1 2所示的优先编码器电路模型。

当所有输入为0时,输出Valid为0,否则输出为1。并且为验证优先编码器的模型行为编写测

试验证程序。

module priority(Data,Encode,valid);

input [3:0] Data;

output [1:0] Encode;

output valid;

not (Data2bar,Data[2]);

and (out1,Data2bar,Data[1]);

or (out2,Data[1],Data[0]),

(Encode[0],Data[3],out1),

(Encode[1],Data[3],Data[2]),

(valid,Data[3],Data[2],out2);

endmodule

测试:

module priority_tb;

reg [3:0] Data;

initial

begin

#100 Data[3]=0;Data[2]=0;Data[1]=0;Data[0]=0;

#100 Data[3]=1;Data[2]=0;Data[1]=0;Data[0]=0;

end

priority inst_priority( .Data(Data));

endmodule

第6章用户定义的原语

1. 组合电路U D P与时序电路U D P如何区别?

在组合电路U D P中,表规定了不同的输入组合和相对应的输出值。没有指定的任意组合输出为x。

在时序电路U D P中,使用1位寄存器描述内部状态。该寄存器的值是时序电路U D P的输出值。有时钟作为输入信号。

2. UDP可有一个或多个输出,是否正确?

不正确。U D P只能有一个输出和一个或多个输入。

3. 初始语句可用于初始化组合电路U D P吗?

不可以。只有时序电路U D P的状态初始化可以使用带有一条过程赋值语句的初始化语句实现。

4. 为图5 - 1 2中显示的优先编码器电路编写U D P描述。使用测试激励验证描述的模型。

//encode.v

primitive encode0 (encode0,data3,data2,data1,data0); output encode0;

input data3,data2,data1,data0;

table

//data[3] [2] [1] [0] encode[1] [0] valid

0 0 0 0 : 0;

0 0 0 1 : 0;

0 0 1 ? : 1;

0 1 ? ? : 0;

1 ? ? ? : 1;

endtable

endprimitive

primitive encode1 (encode1,data3,data2,data1,data0); output encode1;

input data3,data2,data1,data0;

table

//data[3] [2] [1] [0] encode[1] [0] valid

0 0 0 0 : 0;

0 0 0 1 : 0;

0 0 1 ? : 0;

0 1 ? ? : 1;

1 ? ? ? : 1;

endtable

endprimitive

//encoder.v

module encoder(encode,data);

output [1:0] encode;

input [3:0] data;

encode0(encode[0],data[3],data[2],data[1],data[0]);

encode1(encode[1],data[3],data[2],data[1],data[0]);

endmodule

//encoder_tb.v

module encoder_tb;

reg [3:0] data;

initial

begin

#100 data[3]=0;data[2]=0;data[1]=0;data[0]=0;

#100 data[3]=1;data[2]=0;data[1]=0;data[0]=0;

#100 data[3]=0;data[2]=1;data[1]=0;data[0]=0;

#100 data[3]=0;data[2]=0;data[1]=1;data[0]=0;

end

encoder inst_encoder(.data(data));

endmodule

5. 为T触发器编写U D P描述。在T触发器中,如果数据输入为0,则输出不变化。如果数据输入是1,那么输出在每个时钟沿翻转。假定触发时钟沿是时钟下跳沿,使用测试激励验证所描述的模型。

//Q 初始化有问题??

//T_Edge_FF.v

primitive T_Edge_FF (Q, Clk, Data) ; output Q;

reg Q;

input Data,Clk;

initial Q = 0;

table

// Clk Data Q (State) Q( n e x t ) (10) 0 : 0 : - ;

(10) 0 : 1 : - ;

(10) 1 : 0 : 1 ;

(10) 1 : 1 : 0;

(1x) 0 : 0 : - ;

(1x) 0 : 1 : - ;

(1x) 1 : 0 : 1 ;

(1x) 1 : 1 : 0;

// 忽略时钟上边沿:

(?1) ? : ? : - ;

// 忽略在稳定时钟上的数据变化:

? (??): ? : - ;

endtable

endprimitive

//T_FF.v

module T_FF(Q,Clk,Data);

output Q;

input Data, Clk;

T_Edge_FF(Q,Clk,Data);

endmodule

// T_FF_tb.v

module T_FF_tb;

parameter CLK_PERIOD = 100; // 100ns 10MHz

reg Data,Clk;

wire Q;

initial

Clk = 0;

always #(CLK_PERIOD/2) Clk = ~Clk;

initial

begin

#200 Data = 0;

#200 Data = 1;

#200 Data = 0;

#200 Data = 1;

#200 Data = 0;

end

T_FF inst_T_FF(.Q(Q),.Data(Data),.Clk(Clk));

endmodule

6. 以U D P方式为上跳边沿触发的J K触发器建模。如果J和K两个输入均为0,则输出不变。如果J为0,K为1,则输出为0。如果J是1,K是0,则输出是1。如果J和K都是1,则输出翻转。使用测试激励验证描述的模型。

// JK_FF.v

module JK_FF (Q, Clk, J,K) ;

output Q;

input J,K,Clk;

JK_Edge_FF(Q,Clk,J,K);

endmodule

primitive JK_Edge_FF(Q, Clk, J,K) ; output Q;

reg Q;

input J,K, Clk;

initial Q = 0;

table

// Clk J K Q (State) Q( n e x t ) (01) 0 0 : ? : -;

(01) 0 1 : ? : 0;

(01) 1 0 : ? : 1;

(01) 1 1 : 1 : 0;

(01) 1 1 : 0 : 1;

(0x) 0 0 : 0 : -;

(0x) 0 1 : 0 : 0;

(0x) 1 0 : 1 : 1;

(0x) 1 1 : 0 : 0;

//(0x) 1 1 : 0 : 1;

// 忽略时钟负边沿:

(?0) ? ? : ? : - ;

// 忽略在稳定时钟上的数据变化:

//? ??: ? : - ;

endtable

endprimitive

// JK_FF_tb.v

module JK_FF_tb;

parameter CLK_PERIOD = 100; // 100ns 10MHz

reg J,K,Clk;

wire Q;

initial

Clk = 0;

always #(CLK_PERIOD/2) Clk = ~Clk;

initial

begin

#5 J=1;K=0;

#100 J=0;K=0;

#100 J=1;K=0;

#100 J=1;K=1;

end

JK_FF inst_JK_FF(.Q(Q),.Clk(Clk),.J(J),.K(K)); endmodule

第7章数据流模型化

1.例说明截止时延在连续赋值语句中如何使用

Verilog~HDL~电梯程序

这个程序不需要你再添加任何的程序,你只需要添加楼层数就可以成功控制6层以上电梯,另外你必须得读懂每一块程序的作用,才能对这个程序有更好的应用 module dtsj(clk,reset,up1,up2,up3,up4,up5,dn2,dn3, dn4,dn5,dn6,d1,d2,d3,d4,d5,d6,overw,pro,led,hex,Buzzer1,lig); input clk,reset; //reset键使用key input overw,pro,up1,up2,up3,up4,up5,dn2,dn3,dn4,dn5,dn6,d1,d2,d3,d4,d5,d6; //故障警报键 output[6:0] hex,lig; //light和led用数码管 output[5:0] led; output Buzzer1; reg Buzzer1,door; reg[6:0] hex,lig; reg[2:0]state,next_state,count; reg[5:0] d,up,dn,now_f,curr,led; //d是部按键,up外部上升按键,dn是外部下降按键, //now_f是当前楼层,curr是当前楼层的另外一个变量 reg[1:0] ud_f; //上升下降标志位 reg light; //reg[29:0] counter; //regclkout; parameter idle_state=3'b001,open_state=3'b010,close_state=3'b011, up_state=3'b100,down_state=3'b101,sleep_state=3'b110, alarm_state=3'b111,f1=6'b000001,f2=6'b000010,f3=6'b000100,f4=6'b001000 ,f5=6'b010000,f6=6'b100000,up_f=2'b01,dn_f=2'b10,idle=2'b00; //jiuzhongzhuangtai he shang sheng zhuang tai 'shang sheng zhuang tai he xiajiazhuang tai initial begin state<=idle_state; end always (posedgeclk or posedge reset) if(reset) state<=idle_state; else state<=next_state; always (state or up or dn or d or now_f or count or ud_f) case(state) open_state: begin if(count<5)

数电实验考试 verilogHDL语言及参考程序

题目一:表决器电路设计 一、设计任务及原理:所谓表决器就是对于一个行为,由多个人投票,如果同意的票数过半,就认为此行为可行;否则如果否决的票数过半,则认为此行为无效。 七人表决器顾名思义就是由七个人来投票,当同意的票数大于或者等于4时,则认为同意;反之,当否决的票数大于或者等于4时,则认为不同意。实验中用7个拨动开关来表示七个人,当对应的拨动开关输入为‘1’时,表示此人同意;否则若拨动开关输入为‘0’,则表示此人反对。表决的结果用一个LED表示,若表决的结果为同意,则LED被点亮;否则,如果表决的结果为反对,则LED不会被点亮。同时,数码管上显示通过的票数。 二、具体要求: 本实验就是利用实验系统中的拨动开关模块和LED模块以及数码管模块来实现一个简单的七人表决器的功能。拨动开关模块中的K1~K7表示七个人,当拨动开关输入为‘1’时,表示对应的人投同意票,否则当拨动开关输入为‘0’时,表示对应的人投反对票;LED模块中LED1表示七人表决的结果,当LED1点亮时,表示此行为通过表决;否则当LED1熄灭时,表示此行为未通过表决。同时通过的票数在数码管上显示出来。 在此实验中数码管、LED、拨动开关与FPGA的连接电路和管脚连接使用模块 信号 对应FPGA 管脚 说明

在以前的实验中都做了详细说明,这里不在赘述。端口名 S1 按键开关 S1 R16 表示1号抢 答者 S2 按键开关 S2 P14 表示2号抢 答者 S3 按键开关 S3 P16 表示3号抢 答者 S4 按键开关 S4 P15 表示4号抢 答者 S5 按键开关 S5 M15 表示5号抢 答者 S6 按键开关 S6 N16 表示6号抢 答者 S7 按键开关 S7 N15 表示7号抢 答者 DOUT0 LED模块D1 L14 表决结果 亮为通过 LEDAG0 数码管模 块A段N4 抢答成功 者 号码显示 LEDAG1 数码管模 块B段 G4

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;

1、VerilogHDL设计流程

1、Verilog HDL 设计流程: 1、文本编辑:文件保存为.v的文件; 2、功能仿真:将.v文件调入HDL仿真软件,逻辑功能是否正确(前仿真); 3、逻辑综合:将源文件调入逻辑综合软件进行综合,把语言综合成最简的布尔表达式,生成.edf的EDA工业标准文件;矚慫润厲钐瘗睞枥庑赖。 4、布局布线; 5、时序仿真:验证电路的时序(后仿真)。 2、Verilog 程序包括四部分: 1、端口定义 2、I/O口说明 3、内部信号声明 4、功能定义 3、逻辑功能定义: 三种方法在模块中产生逻辑: (1)用assign 声明语句;如assign a = b & c;(描述组合逻辑) (2)用实例元件;如and #2 u1(q,a,b); (3)用always块;如(既可描述组合逻辑也可描述时序逻辑) always @ (posedge clk or posedge clr) begin if(clr) q <= 0; else if(en) q <= d; end 4、网络类型变量 两种:wire tri Wire型变量:用来表示单个门驱动或连续赋值语句驱动的网络类型数据。 Tri 型变量:用来表示多驱动器驱动的网络型数据。 线网类型两种:wire tri Tri 主要用于定义三态的线网; Wire型:代表的是物理连接,不存储逻辑值,要由器件驱动,通常用assign进行赋值Wire类型的信号没被驱动,缺省值为Z(高阻);信号没有定义数据类型时,缺省为wire 类型。(缺省==默认)聞創沟燴鐺險爱氇谴净。 Reg型:默认初始值为x,通常用always模块内的指定信号,常代表触发器; always模块内被赋值的每一个信号都必须定义为reg型。(寄存器类型) Verilog HDL 有5种寄存器类型: reg、integer、time、real、realtime 5、运算符号所带操作数 单目运算符:可带一个操作数,操作数放在运算符右边 双目运算符:可带两个操作数,操作数放在运算符两边 三目运算符:可带3个操作数,用三目运算符分隔开 6、底层模块的调用:底层模块(被测试模块)可由测试模块调用 如:(位置关联方式) : AND_G2 AND_G2(A,B,F); 第一个AND_G2 为底层模块名,第二个为实例名,(A,B,F)为参数定义。 语法结构为:底层模块名实例名参数定义

简单自动售货机VerilogHDL程序

自动售货机VerilogHDL程序 一个简单的自动售卖饮料机的程序。该机器具有投币,显示余额,购买六种饮料,退钱等功能,为了更具实用性,增添了饮料选择允许提示和投币允许提示的功能。具体形容,可投入一元、五元、十元和二十元面值的钱币,显示出当前的余额,并根据当前的余额提示能购买哪些饮料,选择某种饮料,则输出选定的饮料,同时余额减去相应的金钱。若选择退钱,机器就退出所有的钱,余额清零。 下图为功能示意图: 程序的状态表:

程序中包含了一个状态机,定义了一个任务(task)和函数(function),用该任务调用了该函数,使用若干分支语句,详见附后源程序和测试程序。 附上程序编译仿真图:

源程序如下: `define one 3'b001 `define five 3'b010 `define ten 3'b011 `define twenty 3'b100 module automart(money,state,moneyout,coinable,adrkable,bdrkable, cdrkable,drkout1,drkout2,drkout3,drkout4,drkout5, drkout6,coin,clk,reset,moneyback,choice1,choice2, choice3,choice4,choice5,choice6); input[2:0] coin;//投币输入,分为1、5、10、20元四种输入 input clk,reset,moneyback,choice1,choice2,choice3,choice4, choice5,choice6;//moneyback为退钱输入,choice1~6是饮料选择output moneyout,coinable,adrkable,bdrkable,cdrkable,drkout1, drkout2,drkout3,drkout4,drkout5,drkout6; //依次为退钱输出,投币许可提示,饮料选择许可,6种饮料输出output[2:0] state;//状态记录 output[7:0] money;//余额显示 reg[7:0] money; reg[2:0] state; reg moneyout,coinable,backable,adrkable,bdrkable,cdrkable; parameter A=3'b000, B=3'b001, C=3'b010,D=3'b011, E=4'b100; assign drkout1=choice1&adrkable;

EDA课程设计报告-用VerilogHDL语言编写-红绿灯控制程序

成绩: XI’AN UNIVERSITY OF TECHNOLOGY EDA综合实践 所在院系自动化与信息工程学院 专业名称电子信息科学与技术 班级电技111 题目红绿灯设计 指导教师XXXX

二、红绿灯原理及设计思路 设计思路: 为了实现两个方向红绿灯循环亮灭的过程,假设该过程如下: 起始(st0)东西方向绿灯亮(green1=1),南北方向红灯亮(red2=1),这个过程持续3个clock周期;然后(st3)东西方向黄灯亮,绿灯灭,南北方向红灯仍然亮着,这个过程持续1个clock;然后(st4)东西方向红灯亮,南北方向绿灯亮,这个过程持续3个clock;然后南北(st7)方向黄灯亮,东西方向红灯仍然亮着,这个过程持续一个clock;接下来就回到起始(st0)的状态进行循环。 此程序中无论哪个方向,各个灯亮着的时间之比为, 绿:黄:红=3:1:4,可以设置clock的值确定各灯具体的亮的时间。 1、红绿灯工作状态的真值表:

2、模型图:(见下页) 3状态机:

三、源程序 module traffic(clock,reset,red1,yellow1,green1,red2,yellow2,green2); input clock,reset; output red1,yellow1,green1,red2,yellow2,green2; parameter st0=0,st1=1,st2=2,st3=3,st4=4,st5=5,st6=6,st7=7; reg[2:0] state,nxstate; reg red1,yellow1,green1,red2,yellow2,green2; always(posedge clock or posedge reset) begin if(reset) state=st0;

verilog HDL抢答器(两个程序)

一、设计任务 智力竞赛抢答器Verilog HDL要求有6位参赛者进行抢答,有六个抢答信号进行抢答。当有抢答选手按下抢答键后系统能够快速准确的判断是那一组选手按下了抢答信号,由于系统比较小,速度比较快一般不会有同时按下的可能,所以只有六种状态,然后系统能够根据这六种状态进行适时的显示和提示。当有选手按下以后就对抢答信号进行锁存,其他选手的输入无效。然后就是对抢答进行时间限制了,根据设定的时间进行倒计时,当倒计时完成还没有人抢答的时候系统发出警报声音提示时间已经到了。当有选手在主持人未按下抢答键抢答时视为超前抢答,系统显示该选手号,同时蜂鸣器响,该抢答无效。还有清除复位键,抢答完成以后按复位键即可清除已有的状态。通过Verilog HDL程序代码实现系统的各个功能。 二、设计目的与要求 目的:理论联系实际,巩固和运用所学课程,提高分析、解决计算机技术实际问题的独立工作能力,培养学生正确的设计思想,严肃认真、实事求是的科学态度和勇于探索的创新精神。通过对一个智力抢答器的设计,进一步加深对计算机原理以及数字电路应用技术方面的了解与认识,进一步熟悉数字电路系统设计、制作与调试的方法和步骤,通过Verilog 程序的编写,进一步熟悉Verilog HDL 的语法知识;规范化训练学生撰写技术研究报告,提高书面表达能力。 要求: ?掌握FPGA设计系统的一般方法。 ?熟练掌握使用modelsim软件设计较复杂的数字逻辑电路。 ?培养学生独立分析问题和解决实际问题的能力。 三、课程设计的内容 设计一抢答器,要求如下: (1)抢答台数为6; (2)具有抢答开始后20s倒计时,20秒倒计时后6人抢答显示超时,并报警; (3)能显示超前抢答台号并显示犯规报警; (4)系统复位后进入抢答状态,当有一路抢答按键按下,该路抢答信号将其 余各路抢答信号封锁,同时铃声响起,直至该路按键松开,显示牌显示该路抢答台号。 四、系统设计方案 根据系统设计要求可知,系统的输入信号有:主持人按钮inputEn,各选手的抢答按钮分别是inputL1、inputL2、inputL3、inputL4,inputL5,inputL6,主

Verilog_HDL的交通灯控制器设计

课程设计报告 2015-2016学年第2学期 课程设计名称:电子综合设计EDA课程设计 院(系):电子信息学院 专业:电子信息工程班级:电子1313 姓名: xx 学号: 1310034303xx 综合实验时间: 2016/7/11-2016/7/15 指导教师:钟旭 提交时间: 2016/7/15

上海电机学院课程设计任务书

目录 第一章设计原理 (4) 1.1设计要求 (4) 1.2设计思路和原理 (4) 1.3实现方法 (4) 第二章Verilog HDL程序设计 (6) 2.1整体设计 (6) 2.2 具体设计 (7) 第三章仿真测试 (7) 3.1 波形仿真 (7) 第四章设计总结 (10)

第一章设计原理 1.1设计要求 设计一个交通控制器,用LED显示灯表示交通状态,并以7段数码显示器显示当前状态剩余秒数主干道绿灯亮时,支干道红灯亮;反之亦然,二者交替允许通行,主干道每次放行35s,支干道每次放行25s。每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为5s。能进行特殊状态显示,特殊状态时东西、南北路口均显示红灯状态。用LED灯显示倒计时,并且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。能实现特殊状态的功能显示。[1] 1.2设计思路和原理 (1) 主、支干道用传感器检测车辆到来情况,实验电路用逻辑开关代替。 (2) 选择1HZ时钟脉冲作为系统时钟。 (3) 45s、25s、5s定时信号可用顺计时,也可用倒计时,计时起始信号由主控电路给出,每当计满所需时间,启、闭三色信号灯,并启动另一计时电路。 (4) 交通灯状态变化如表1及图1所示: 表1 交通灯状态图

数字跑表VerilogHDL程序

数字跑表VerilogHDL程序 顶层模块 module paobiao(CLK,CLR,PAUSE,CLK,CLK1); input CLK,CLK1; // 100Hz基准时钟,1kHz数码管扫描时钟 input CLR, PAUSE; output[3:0] MSH,MSL,SH,SL,MH,ML; reg[3:0] MSH,MSL,SH,SL,MH,ML; wire[3:0] dec_in; jishi jishi(CLK,CLR,PAUSE,MSH,MSL,SH,SL,MH,ML); count10 count10(CLK,CLK1); decode4_7 decode4_7(decodeout,dec_in); segscan segscan(dec_in,MSL,MSH,SL,SL,ML,MH); endmodule 时基分频器模块 module count10(CLK,CLK1); input CLK1; output CLK; reg[4:0] qout; always @(posedge CLK1) begin if(qout<9) qout<=qout+1; else qout<=0; end assign CLK=(qout==9)?1:0; endmodule reg CLK1; reg [4:0]qunt; always @(posedge CLK or negedge RST) //异步清零 begin if(~rst) begin qunt<=5'd0; end else if(qunt==5'd9) begin qunt<=5'd0; end else begin qunt<=qunt+1'b1; end end wire CLK1; assign CLK1=qunt[4];

EDA课程设计-用VerilogHDL语言编写-红绿灯控制程序

XI’AN UNIVERSITY OF TECHNOLOGY EDA综合实践 ] 所在院系自动化与信息工程学院专业名称电子信息科学与技术《 班级电技111 题目红绿灯设计 指导教师XXXX 成员XXX -2014年元月 成绩:

3、报告评语及成绩(30%): 二、< 三、红绿灯原理及设计思路 设计思路: 为了实现两个方向红绿灯循环亮灭的过程,假设该过程如下: 起始(st0)东西方向绿灯亮(green1=1),南北方向红灯亮(red2=1),这个过程持续3个clock周期;然后(st3)东西方向黄灯亮,绿灯灭,南北方向红灯仍然亮着,这个过程持续1个clock;然后(st4)东西方向红灯亮,南北方向绿灯亮,这个过程持续3个clock;然后南北(st7)方向黄灯亮,东西方向红灯仍然亮着,这个过程持续一个clock;接下来就回到起始(st0)的状态进行循环。 此程序中无论哪个方向,各个灯亮着的时间之比为, 绿:黄:红=3:1:4,可以设置clock的值确定各灯具体的亮的时间。 1、红绿灯工作状态的真值表: 2、; 3、模型图: (见下页)

3状态机: (

三、源程序 module traffic(clock,reset,red1,yellow1,green1,red2,yellow2,green2); input clock,reset; output red1,yellow1,green1,red2,yellow2,green2; parameter st0=0,st1=1,st2=2,st3=3,st4=4,st5=5,st6=6,st7=7; reg[2:0] state,nxstate; | reg red1,yellow1,green1,red2,yellow2,green2; always(posedge clock or posedge reset) begin if(reset) state=st0; else state=nxstate; $ end always(state) begin red1=1'b0; yellow1=1'b0; green1=1'b0; red2=1'b0; yellow2=1'b0; green2=1'b0; case(state) st0:begin green1=1'b1; < red2=1'b1; nxstate=st1; end st1:begin green1=1'b1; red2=1'b1;

第2节 Verilog HDL基本程序结构

第2节Verilog HDL基本程序结构 Verilog HDL 程序结构 Verilog HDL基本程序结构 用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型,也称为模块,是Verilog 的基本描述单位。模块描述某个设计的功能或结构以及与其他模块通信的外部接口,一般来说一个文件就是一个模块,但并不绝对如此。模块是并行运行的,通常需要一个高层模块通过调用其他模块的实例来定义一个封闭的系统,包括测试数据和硬件描述。一个模块的基本架构如下: module module_name (port_list) //声明各种变量、信号 reg //寄存器 wire//线网 parameter//参数 input//输入信号 output/输出信号 inout//输入输出信号 function//函数 task//任务 …… //程序代码 initial assignment always assignment module assignment gate assignment UDP assignment continous assignment endmodule 说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。语句用于定义设计的功能和结构。说明部分可以分散于模块的任何地方,但是变量、寄存器、线网和参数等的说明必须在使用前出现。一般的模块结构如下: module <模块名> (<端口列表>) <定义> <模块条目> endmodule 其中,<定义>用来指定数据对象为寄存器型、存储器型、线型以及过程块。<模块条目>可以是initial结构、always结构、连续赋值或模块实例。 下面给出一个简单的Verilog模块,实现了一个二选一选择器。

基于Verilog HDL实现的秒表程序

基于Verilog HDL实现的秒表程序 module clock(clk,pause,rst,sm_bit,sm_seg); input clk,rst,pause; output [2:0]sm_bit;//三位位选信号 output [6:0]sm_seg;//7 段数码管输出信号 reg [3:0] dataout; reg [6:0] sm_seg; reg [2:0] sm_bit; reg [3:0] led0;//百分秒低位 reg dd0; //百分秒进位 reg [3:0] led1;//百分秒高位 reg dd1; //百分秒高位进位 reg [3:0] led2;//秒低位 reg dd2; //秒低位进位 reg [3:0] led3;//秒高位 reg dd3; //秒高位进位 reg [3:0] led4;//分低位 reg dd4; //分低位进位 reg [3:0] led5;//分高位 reg dd5; //分高位进位 /*reg [3:0] led6;//时低位 reg dd6; //时低位进位*/ reg clk_100; reg [2:0]cnt_scan; reg [3:0] counter; /*1000——100分频器*/ always @(posedge clk) begin if(!pause) begin if(counter==4'b1001) begin counter<=0; end else counter<=counter+1; end clk_100<=counter[3]; end //////////////////////计数器///////////////////////// always@(posedge clk_100 or posedge rst)///////////////// 百秒个位

动态扫描数码管的verilog hdl程序

动态扫描数码管的verilog hdl程序module led(seg,dig,clock,);//seg 段选,dig位选,clock时钟input clock; output [7:0] seg; //数码管段码输出 output [7:0] dig; //数码管位码输出 reg [7:0] seg; //数码管段码输出寄存器 reg [7:0] dig; //数码管位码输出寄存器 reg [3:0] disp_dat; //显示数据寄存器 reg [36:0] count; //定义计数寄存器 always @ (posedge clock ) begin count = count + 1'b1; end always @ (count[10]) begin disp_dat = {count[13:11]}; end always @ (disp_dat) begin case (disp_dat)

3'h0 : dig = 8'b11111110; //显示第一个数码管,低电平有效3'h1 : dig = 8'b11111101; //显示第二个数码管,低电平有效3'h2 : dig = 8'b11111011; //显示第三个数码管,低电平有效3'h3 : dig = 8'b11110111; //显示第四个数码管,低电平有效3'h4 : dig = 8'b11101111; //显示第五个数码管,低电平有效3'h5 : dig = 8'b11011111; //显示第六个数码管,低电平有效3'h6 : dig = 8'b10111111; //显示第七个数码管,低电平有效3'h7 : dig = 8'b01111111; //显示第八个数码管,低电平有效 endcase end always @ (disp_dat) begin case (disp_dat) 4'h0 : seg = 8'hc0; //显示"0" 4'h1 : seg = 8'hf9; //显示"1" 4'h2 : seg = 8'ha4; //显示"2" 4'h3 : seg = 8'hb0; //显示"3" 4'h4 : seg = 8'h99; //显示"4"

Verilog HDL程序设计

上机实验1:Verilog HDL程序设计 一、实验目的: 1.掌握Verilog HDL程序的设计方法 2.熟悉Quartus_II 9.0的安装 3.熟悉Quartus_II 9.0的使用 二、实验工具:Quartus_II 9.0 三、上机内容: 本上机实验采用Verilog HDL描述一个基本的数字逻辑单元(数据选择器、加法器、计数器等),在Quartus_II 9.0中进行仿真,并观察逻辑综合后得到的RTL图。 Verilog HDL是一种硬件描述语言(HDL: Hardware Discription Language),是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 模块是Verilog 的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。一个设计的结构可使用开关级原语、门级原语和用户定义的原语方式描述; 设计的数据流行为使用连续赋值语句进行描述; 时序行为使用过程结构描述。一个模块可以在另一个模块中调用。 模块的定义从关键字module开始,到关键字endmodule结束,每条Verilog HDL语句以“;”做为结束(块语句、编译向导、endmodule等少数除外)。 一个完整的Verilog模块由以下五个部分组成: 1.模块定义行:module module_name (port_list); 2.说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。语句定义设计的功能和结构。说明部分和语句可以散布在模块中的任何地方;但是变量、寄存器、线网和参数等的说明部分必须在使用前出现。为了使模块描述清晰和具有良好的可读性, 最好将所有的说明部分放在语句前。 说明部分包括: 寄存器,线网,参数:reg, wire, parameter 端口类型说明行:input, output, inout 函数、任务:function, task, 等 3.描述体部分:这是一个模块最重要的部分,在这里描述模块的行为和功能,子模块的调用和连接,逻辑门的调用,用户自定义部件的调用,初始态赋值,always块,连续赋值语句等等。 4.结束行,以endmodule结束,注意后面没有分号了。 在模块中,可用下述方式描述一个设计: 1) 数据流方式; 2) 行为方式;

动态扫描数码管的verilog hdl程序

动态扫描数码管的verilog hdl程序 module led(seg,dig,clock,);//seg段选,dig位选,clock时钟input clock; output [7:0] seg; //数码管段码输出 output [7:0] dig; //数码管位码输出 reg [7:0] seg; //数码管段码输出寄存器 reg [7:0] dig; //数码管位码输出寄存器 reg [3:0] disp_dat; //显示数据寄存器 reg [36:0] count; //定义计数寄存器 always @ (posedge clock ) begin count = count + 1'b1; end always @ (count[10]) begin disp_dat = {count[13:11]}; end always @ (disp_dat) begin case (disp_dat) 3'h0 : dig = 8'b11110; //显示第一个数码管,低电平有效3'h1 :

dig = 8'b11101; //显示第二个数码管,低电平有效3'h2 : dig = 8'b111011; //显示第三个数码管,低电平有效3'h3 : dig = 8'b110111; //显示第四个数码管,低电平有效3'h4 : dig = 8'b111011; //显示第五个数码管,低电平有效3'h5 : dig = 8'b110111; //显示第六个数码管,低电平有效3'h6 : dig = 8'b10111; //显示第七个数码管,低电平有效3'h7 : dig = 8'b01111; //显示第八个数码管,低电平有效endcase end always @ (disp_dat) begin case (disp_dat) 4'h0 : seg = 8'hc0; //显示"0" 4'h1 : seg = 8'hf9; //显示"1" 4'h2 : seg = 8'ha4; //显示"2" 4'h3 : seg = 8'hb0; //显示"3" 4'h4 : seg = 8'h99; //显示"4"

相关文档
相关文档 最新文档