Verilog实例讲解

Verilog实例讲解
Verilog实例讲解

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

module//测试模块的名字

reg[3:0] a,b; //测试输入信号定义为reg型reg cin;

wire[3:0] sum; //测试输出信号定义为wire型wire cout;

integer

//调用测试对象

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的取值

程序文本

initial

begin

for(j=1;j<16;j=j+1)

#10 b=j; //设定b的取值

end

initial//定义结果显示格式

begin

#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;

//调用测试对象

always//产生时钟波形

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

王金明:《Verilog HDL程序设计教程》wire A,B,C,D,F; //定义信号的数据类型

assign F= ~((A&B)|(C&D)); //逻辑功能描述

endmodule

【例5.1】用case语句描述的4选1数据选择器

module mux4_1(out,in0,in1,in2,in3,sel);

output out;

input in0,in1,in2,in3;

input[1:0] sel;

reg out;

always @(in0 or in1 or in2 or敏感信号列表

case(sel)

2'b00: out=in0;

2'b01: out=in1;

2'b10: out=in2;

2'b11: out=in3;

default: out=2'bx;

endcase

endmodule

【例5.2】同步置数、同步清零的计数器

module count(out,data,load,reset,clk);

output[7:0] out;

input[7:0] data;

input load,clk,reset;

reg[7:0] out;

always @(posedge clk) //clk上升沿触发

begin

if (!reset) out = 8'h00; //同步清0,低电平有效

else if (load) out = data; //同步预置

else out = out + 1; //计数

end

endmodule

【例5.3】用always过程语句描述的简单算术逻辑单元

`define add 3'd0

`define minus 3'd1

`define band 3'd2

`define bor 3'd3

程序文本

module alu(out,opcode,a,b);

output[7:0] out;

reg[7:0] out;

input[2:0] opcode; //操作码

input[7:0] a,b; //操作数

always@(opcode or a or b) //电平敏感的always块begin

case(opcode)

`add: out = a+b; //加操作

`minus: out = a-b; //减操作

`band: out = a&b; //求与

`bor: out = a|b; //求或

`bnot: out=~a; //求反

default: out=8'hx; //未收到指令时,输出任意态

endcase

end

endmodule

【例5.4】用initial过程语句对测试变量A、B、C赋值

`timescale 1ns/1ns

module test;

reg A,B,C;

initial

begin

A = 0;

B = 1;

C = 0;

#50 A = 1; B = 0;

#50 A = 0; C = 1;

#50 B = 1;

#50 B = 0; C = 0;

#50 $finish ;

end

endmodule

【例5.5】用begin-end串行块产生信号波形

`timescale 10ns/1ns

module wave1;

reg wave;

parameter cycle=10;

initial

`timescale 10ns/1ns

module wave2;

reg wave;

parameter cycle=5;

initial

fork

wave=0;

#(cycle) wave=1;

#(2*cycle) wave=0;

#(3*cycle) wave=1;

#(4*cycle) wave=0;

#(5*cycle) wave=1;

#(6*cycle) $finish;

join

initial $monitor($time,,,"wave=%b",wave); endmodule

【例5.7】持续赋值方式定义的2选1多路选择器

module MUX21_1(out,a,b,sel);

input a,b,sel;

output out;

assign out=(sel==0)?a:b;

//持续赋值,如果sel为0,则out=a ;否则out=b endmodule

5.8】阻塞赋值方式定义的2选1多路选择器

module MUX21_2(out,a,b,sel);

程序文本

output out;

reg out;

always@(a or b or sel)

begin

if(sel==0) out=a; //阻塞赋值

else out=b;

end

endmodule

【例5.9】非阻塞赋值

module

output c,b;

input clk,a;

reg c,b;

always @(posedge clk)

begin

b<=a;

c<=b;

end

endmodule

【例5.10】阻塞赋值

module block(c,b,a,clk);

output c,b;

input clk,a;

reg c,b;

always @(posedge clk)

begin

b=a;

c=b;

end

endmodule

【例5.11】模为60的BCD码加法计数器

module count60(qout,cout,data,load,cin,reset,clk);

output[7:0] qout;

output cout;

input[7:0] data;

input load,cin,clk,reset;

reg[7:0] qout;

王金明:《Verilog HDL程序设计教程》begin

if (reset) qout<=0; //同步复位

else if(load) qout<=data; //同步置数

else if(cin)

begin

if(qout[3:0]==9) //低位是否为9,是则

begin

qout[3:0]<=0; //回0,并判断高位是否为5

if (qout[7:4]==5) qout[7:4]<=0;

else

qout[7:4]<=qout[7:4]+1; //高位不为5,则加1

end

else//低位不为9,则加1

qout[3:0]<=qout[3:0]+1;

end

end

assign cout=((qout==8'h59)&cin)?1:0; //产生进位输出信号

endmodule

【例5.12】BCD码—七段数码管显示译码器

module decode4_7(decodeout,indec);

output[6:0] decodeout;

input[3:0] indec;

reg[6:0] decodeout;

always @(indec)

begin

case(indec) //用case语句进行译码

4'd0:decodeout=7'b1111110;

4'd1:decodeout=7'b0110000;

4'd2:decodeout=7'b1101101;

4'd3:decodeout=7'b1111001;

4'd4:decodeout=7'b0110011;

4'd5:decodeout=7'b1011011;

4'd6:decodeout=7'b1011111;

4'd7:decodeout=7'b1110000;

4'd8:decodeout=7'b1111111;

4'd9:decodeout=7'b1111011;

default: decodeout=7'bx;

endcase

程序文本

endmodule

【例5.13】用casez描述的数据选择器

module mux_casez(out,a,b,c,d,select);

output out;

input a,b,c,d;

input[3:0] select;

reg out;

always @(select or a or b or c or d) begin

casez(select)

4'b???1: out = a;

4'b??1?: out = b;

4'b?1??: out = c;

4'b1???: out = d;

endcase

end

endmodule

【例5.14】隐含锁存器举例

module

output c;

input b,a;

reg c;

always @(a or b)

begin

if((b==1)&&(a==1)) c=a&b;

end

endmodule

【例5.15】用for语句描述的七人投票表决器module voter7(pass,vote);

output pass;

input[6:0] vote;

reg[2:0] sum;

integer i;

reg pass;

always @(vote)

begin

王金明:《Verilog HDL程序设计教程》for(i=0;i<=6;i=i+1) //for语句

if(vote[i]) sum=sum+1;

if(sum[2]) pass=1; //若超过4人赞成,则pass=1

else pass=0;

end

endmodule

【例5.16】用for语句实现2个8位数相乘

module mult_for(outcome,a,b);

parameter size=8;

input[size:1] a,b; //两个操作数

output[2*size:1] outcome; //结果

reg[2*size:1] outcome;

integer i;

always @(a or b)

begin

outcome=0;

for(i=1; i<=size; i=i+1) //for语句

if(b[i]) outcome=outcome +(a << (i-1));

end

endmodule

【例5.17】用repeat实现8位二进制数的乘法

module mult_repeat(outcome,a,b);

parameter size=8;

input[size:1] a,b;

output[2*size:1] outcome;

reg[2*size:1] temp_a,outcome;

reg[size:1] temp_b;

always @(a or b)

begin

outcome=0;

temp_a=a;

temp_b=b;

repeat(size) //repeat语句,size为循环次数

begin

if(temp_b[1]) //如果temp_b的最低位为1,就执行下面的加法

outcome=outcome+temp_a;

程序文本

temp_b=temp_b>>1; //操作数b右移一位

end

end

endmodule

【例5.18】同一循环的不同实现方式

module loop1; //方式1

integer i;

initial

for(i=0;i<4;i=i+1) //for语句

begin

$display(“i=%h”,i);

end

endmodule

module loop2; //方式2

integer i;

initial begin

i=0;

while(i<4) //while语句

begin

$display ("i=%h",i);

i=i+1;

end

end

endmodule

module loop3; //方式3

integer i;

initial begin

i=0;

repeat(4) //repeat语句

begin

$display ("i=%h",i);

i=i+1;

end

end

endmodule

王金明:《Verilog HDL程序设计教程》`include "adder.v"

module adder16(cout,sum,a,b,cin);

output cout;

parameter my_size=16;

output[my_size-1:0] sum;

input[my_size-1:0] a,b;

input cin;

adder my_adder(cout,sum,a,b,cin); //调用adder模块

endmodule

//下面是adder模块代码

module adder(cout,sum,a,b,cin);

parameter size=16;

output cout;

output[size-1:0] sum;

input cin;

input[size-1:0] a,b;

assign {cout,sum}=a+b+cin;

endmodule

【例5.20】条件编译举例

module compile(out,A,B);

output out;

input A,B;

`ifdef add //宏名为add

assign out=A+B;

`else

assign out=A-B;

`endif

endmodule

【例6.1】加法计数器中的进程

module count(data,clk,reset,load,cout,qout);

output cout;

output[3:0] qout;

reg[3:0] qout;

input[3:0] data;

input clk,reset,load;

程序文本

always @(posedge clk) //进程1,always过程块

begin

if (!reset) qout= 4'h00; //同步清0,低电平有效

else if (load) qout= data; //同步预置

else qout=qout + 1; //加法计数

end

assign cout=(qout==4'hf)?1:0; //进程2,用持续赋值产生进位信号

endmodule

【例6.2】任务举例

module alutask(code,a,b,c);

input[1:0] code;

input[3:0] a,b;

output[4:0] c;

reg[4:0] c;

task my_and; //任务定义,注意无端口列表

input[3:0] a,b; //a,b,out名称的作用域范围为task任务内部output[4:0] out;

integer i;

begin

for(i=3;i>=0;i=i-1)

out[i]=a[i]&b[i]; //按位与

end

endtask

always@(code or a or b)

begin

case(code)

2'b00: my_and(a,b,c);

/* 调用任务my_and,需注意端口列表的顺序应与任务定义中的一致,这里的a,b,c 分别对应任务定义中的a,b,out */

2'b01: c=a|b; //或

2'b10: c=a-b; //相减

2'b11: c=a+b; //相加

endcase

end

endmodule

王金明:《Verilog HDL程序设计教程》【例6.3】测试程序

`include "alutask.v"

module alu_tp;

reg[3:0] a,b;

reg[1:0] code;

wire[4:0] c;

parameter DELY = 100;

alutask ADD(code,a,b,c); //调用被测试模块

initial begin

code=4'd0; a= 4'b0000; b= 4'b1111;

#DELY code=4'd0; a= 4'b0111; b= 4'b1101;

#DELY code=4'd1; a= 4'b0001; b= 4'b0011;

#DELY code=4'd2; a= 4'b1001; b= 4'b0011;

#DELY code=4'd3; a= 4'b0011; b= 4'b0001;

#DELY code=4'd3; a= 4'b0111; b= 4'b1001;

#DELY $finish;

end

initial $monitor($time,,,"code=%b a=%b b=%b c=%b", code,a,b,c); endmodule

【例6.4】函数

function[7:0] get0;

input[7:0] x;

reg[7:0] count;

integer i;

begin

count=0;

for (i=0;i<=7;i=i+1)

if (x[i]=1'b0) count=count+1;

get0=count;

end

endfunction

【例6.5】用函数和case语句描述的编码器(不含优先顺序)

module code_83(din,dout);

input[7:0] din;

output[2:0] dout;

程序文本

function[2:0] code; //函数定义

input[7:0] din; //函数只有输入,输出为函数名本身casex (din)

8'b1xxx_xxxx : code = 3'h7;

8'b01xx_xxxx : code = 3'h6;

8'b001x_xxxx : code = 3'h5;

8'b0001_xxxx : code = 3'h4;

8'b0000_1xxx : code = 3'h3;

8'b0000_01xx : code = 3'h2;

8'b0000_001x : code = 3'h1;

8'b0000_000x : code = 3'h0;

default: code = 3'hx;

endcase

endfunction

assign dout = code(din) ; //函数调用

endmodule

【例6.6】阶乘运算函数

module funct(clk,n,result,reset);

output[31:0] result;

input[3:0] n;

input reset,clk;

reg[31:0] result;

always @(posedge clk) //在clk的上升沿时执行运算

begin

if(!reset) result<=0; //复位

else begin

result <= 2 * factorial(n); //调用factorial函数

end

end

function[31:0] factorial; //阶乘运算函数定义(注意无端口列表)input[3:0] opa; //函数只能定义输入端,输出端口为函数名本身reg[3:0] i;

begin

factorial = opa ? 1 : 0;

for(i= 2; i <= opa; i = i+1) //该句若要综合通过,opa应赋具体的数值

factorial = i* factorial; //阶乘运算

王金明:《Verilog HDL程序设计教程》#DELY reset=1;

#DELY reset=0;

#(DELY*300) $finish;

end

//结果显示

initial $monitor($time,,,"clk=%d reset=%d qout=%d",clk,reset,qout); endmodule

module counter(qout,reset,clk); //待测试的8位计数器模块

output[7:0] qout;

input clk,reset;

reg[7:0] qout;

always @(posedge clk)

begin if (reset) qout<=0;

else qout<=qout+1;

end

endmodule

【例9.1】基本门电路的几种描述方法

(1)门级结构描述

module gate1(F,A,B,C,D);

input A,B,C,D;

output F;

nand(F1,A,B); //调用门元件

and(F2,B,C,D);

or(F,F1,F2);

endmodule

(2)数据流描述

module gate2(F,A,B,C,D);

input A,B,C,D;

output F;

assign F=(A&B)|(B&C&D); //assign持续赋值

endmodule

(3)行为描述

module gate3(F,A,B,C,D);

input A,B,C,D;

output F;

程序文本

reg F;

always @(A or B or C or D) //过程赋值

begin

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

end

endmodule

【例9.2】用bufif1关键字描述的三态门

module tri_1(in,en,out);

input in,en;

output out;

tri out;

bufif1 b1(out,in,en); //注意三态门端口的排列顺序endmodule

【例9.3】用assign语句描述的三态门

module tri_2(out,in,en);

output out;

input in,en;

assign out = en ? in : 'bz;

//若en=1,则out=in;若en=0,则out为高阻态endmodule

【例9.4】三态双向驱动器

module bidir(tri_inout,out,in,en,b);

inout tri_inout;

output out;

input in,en,b;

assign

assign out = tri_inout ^ b;

endmodule

【例9.5】三态双向驱动器

module bidir2(bidir,en,clk);

inout[7:0] bidir;

input en,clk;

reg[7:0] temp;

assign bidir= en ? temp : 8'bz;

always @(posedge clk)

else temp=temp+1;

end

endmodule

【例9.6】3-8译码器

module decoder_38(out,in);

output[7:0] out;

input[2:0] in;

reg[7:0] out;

always @(in)

begin

case(in)

3'd0: out=8'b11111110;

3'd1: out=8'b11111101;

3'd2: out=8'b11111011;

3'd3: out=8'b11110111;

3'd4: out=8'b11101111;

3'd5: out=8'b11011111;

3'd6: out=8'b10111111;

3'd7: out=8'b01111111;

endcase

end

endmodule

【例9.7】8-3优先编码器

module encoder8_3(none_on,outcode,a,b,c,d,e,f,g,h); output none_on;

output[2:0] outcode;

input a,b,c,d,e,f,g,h;

reg[3:0] outtemp;

assign {none_on,outcode}=outtemp;

always @(a or b or c or d or e or f or g or h)

begin

if(h) outtemp=4'b0111;

else if(g) outtemp=4'b0110;

else if(f) outtemp=4'b0101;

else if(e) outtemp=4'b0100;

else if(d) outtemp=4'b0011;

程序文本

else if(b) outtemp=4'b0001;

else if(a) outtemp=4'b0000;

else outtemp=4'b1000;

end

endmodule

【例9.8】用函数定义的8-3优先编码器

module code_83(din, dout);

input[7:0] din;

output[2:0] dout;

function[2:0] code; //函数定义

input[7:0] din; //函数只有输入端口,输出为函数名本身if (din[7]) code = 3'd7;

else if (din[6]) code = 3'd6;

else if (din[5]) code = 3'd5;

else if (din[4]) code = 3'd4;

else if (din[3]) code = 3'd3;

else if (din[2]) code = 3'd2;

else if (din[1]) code = 3'd1;

else code = 3'd0;

endfunction

assign dout = code(din); //函数调用

endmodule

【例9.9】七段数码管译码器

module decode47(a,b,c,d,e,f,g,D3,D2,D1,D0);

output a,b,c,d,e,f,g;

input D3,D2,D1,D0; //输入的4位BCD码

reg a,b,c,d,e,f,g;

always @(D3 or D2 or D1 or D0)

begin

case({D3,D2,D1,D0}) //用case语句进行译码

4'd0: {a,b,c,d,e,f,g}=7'b1111110;

4'd1: {a,b,c,d,e,f,g}=7'b0110000;

4'd2: {a,b,c,d,e,f,g}=7'b1101101;

4'd3: {a,b,c,d,e,f,g}=7'b1111001;

4'd4: {a,b,c,d,e,f,g}=7'b0110011;

4'd6: {a,b,c,d,e,f,g}=7'b1011111;

4'd7: {a,b,c,d,e,f,g}=7'b1110000;

4'd8: {a,b,c,d,e,f,g}=7'b1111111;

4'd9: {a,b,c,d,e,f,g}=7'b1111011;

default: {a,b,c,d,e,f,g}=7'bx;

endcase

end

endmodule

【例9.10】奇偶校验位产生器

module parity(even_bit,odd_bit,input_bus);

output even_bit,odd_bit;

input[7:0] input_bus;

assign odd_bit = ^ input_bus; //产生奇校验位assign even_bit = ~odd_bit; //产生偶校验位endmodule

【例9.11】用if-else语句描述的4选1 MUX

module mux_if(out,in0,in1,in2,in3,sel);

output out;

input in0,in1,in2,in3;

input[1:0] sel;

reg out;

always @(in0 or in1 or in2 or in3 or sel)

begin

if(sel==2'b00) out=in0;

else if(sel==2'b01) out=in1;

else if(sel==2'b10) out=in2;

else out=in3;

end

endmodule

【例9.12】用case语句描述的4选1 MUX

module mux_case(out,in0,in1,in2,in3,sel);

output out;

input in0,in1,in2,in3;

input[1:0] sel;

reg out;

always @(in0 or in1 or in2 or in3 or sel)

input d,clk,set,reset;

assign q = reset ? 0 : (set ? 1 : (clk ? d : q));

endmodule

【例9.20】8位数据锁存器

module latch_8(qout,data,clk);

output[7:0] qout;

input[7:0] data;

input clk;

reg[7:0] qout;

always @(clk or data)

begin

if (clk) qout<=data;

end

endmodule

【例9.21】8位数据寄存器

module reg8(out_data,in_data,clk,clr);

output[7:0] out_data;

input[7:0] in_data;

input clk,clr;

reg[7:0] out_data;

always @(posedge clk or posedge clr)

begin

if(clr) out_data <=0;

else out_data <=in_data;

end

endmodule

【例9.22】8位移位寄存器

module shifter(din,clk,clr,dout);

input din,clk,clr;

output[7:0] dout;

reg[7:0] dout;

always @(posedge clk)

begin

if (clr) dout<= 8'b0; //同步清0,高电平有效else

begin

FPGA学习心得

回想起自己学FPGA,已经有一段时间了,从开始的茫然,到后来的疯狂看书,设计开发板,调电路,练习各种FPGA实例,到最后能独立完成项目,一路走来,感受颇多,拿出来和大家分享,顺便介绍下自己的一点经验所得,希望对初学者有所帮助。 废话不说了,下面进入正题,学习FPGA我主要经历了这么几个阶段: ①、Verilog语言的学习,熟悉Verilog语言的各种语法。 ②、FPGA的学习,熟悉QuartusII软件的各种功能,各种逻辑算法设计,接口模块(RS232,LCD,VGA,SPI,I2c等)的设计,时序分析,硬件优化等,自己开始设计简单的FPGA 板子。 ③、NiosII的学习,熟悉NiosII的开发流程,熟悉开发软件(SOPC,NiosII IDE),了解NiosII 的基本结构,设计NiosII开发板,编写NiosII C语言程序,调试板子各模块功能。先来说说第一个阶段,现在主要的硬件描述语言有VHDL,Verilog两种,在本科时老师一般教VHDL,不过现在 Verilog用的人越来越多,其更容易上手(与C语言语法比较类似),也更灵活,现在的IC设计基本都用Verilog。像systemC,systemVerilog之类的应该还在萌芽阶段,以后可能会有较大发展。鉴于以上原因我选择了Verilog作为我学习的硬件描述语言。 其实有C语言的基础,学起Verilog的语言很简单,关键要有并行的概念,所有的module,assign,always都是并行的,这一点与软件语言有明显不同。这里推荐几本评价比较好的学习Verilog的书籍: ①、《verilog 数字系统设计教程》,这本书对于入门是一本很好的书,通俗易懂,让人很快上手,它里面的例子也不错。但本书对于资源优化方面的编程没有多少涉及到。 ②、《设计与验证Verilog HDL》,这本书虽然比较薄,但是相当精辟,讲解的也很深入,很多概念看了这本书有种豁然开朗的感觉,呵呵。 学习Verilog其实不用看很多书,基本的语法部分大家都一样,关键是要自己会灵活应用,多做练习。 Verilog语言学了一段时间,感觉自己可以编点东西,希望自己编的程序在板子上运行看看结果,下面就介绍我学习的第二个阶段。 刚开始我拿了实验室一块CPLD的开发板做练习,熟悉QuartusII的各种功能,比如IP的调用,各种约束设置,时序分析,Logiclock设计方法等,不过做到后面发现CPLD 的资源不太够(没有内嵌的RAM、不能用SignalTapII,LE太少等),而实验室没有FPGA开发板,所以就萌生了自己做FPGA开发板的意图,刚好Cadence我也学的差不多了,就花了几天时间主要研究了FPGA配置电路的设计,在板子上做了Jtag和AS下载口,在做了几个用户按键和LED,其他的口全部引出作为IO口,电路比较简单,板子焊好后一调就通了(心里那个爽啊...)。我选的FPGA是cycloneII系列的EP2C5,资源比以前的FPGA多了好几倍,还有PLL,内嵌的RAM,可以试试SignalTapII,用内嵌的逻辑分析仪测试引脚波形,对于FPGA的调试,逻辑分析仪是至关重要的。利用这块板子我完成了项目中的几个主要功能:RS232通信,指令译码,配置DDS,AD数据高速缓存,电子开关状态设置等,在实践中学习起来真的比平时快很多,用到什么学什么动力更大。这个时候我主要看的数据有这几本感觉比较好: ①、《Altera FPGA/CPLD 设计(基础篇)》:讲解一些基本的FPGA设计技术,以及QuartusII中各个工具的用法(IP,RTL,SignalProbe,SignalTapII,Timing Closure Floorplan,chip Editor等),对于入门非常好。 ②、《Altera FPGA/CPLD 设计(高级篇)》:讲解了一些高级工具的应用,LogicLock,时序约束很分析,设计优化,也讲述了一些硬件编程的思想,作为提高用。

数字系统设计与verilog HDL课程设计

数字系统设计与verilog HDL课程设计 设计题目:实用多功能数字钟 专业:电子信息科学与技术 班级:0313410 学号:031341025 姓名:杨存智 指导老师:黄双林

摘要 本课程设计利用QuartusII软件Verilog VHDL语言的基本运用设计一个多功能数字钟,经分析采用模块化设计方法,分别是顶层模块、alarm、alarm_time、counter_time、clk50mto1、led、switch、bitel、adder、sound_ddd、sound_ddd_du模块,再进行试验设计和软件仿真调试,分别实现时分秒计时、闹钟闹铃、时分秒手动校时、时分秒清零,时间保持和整点报时等多种基本功能。 单个模块调试达到预期目标,再将整体模块进行试验设计和软件仿真调试,已完全达到分块模式设计功能,并达到设计目标要求。 关键字:多功能数字钟、Verilog、模块、调试、仿真、功能

目录 1.课程设计的目的及任务............................................................. 错误!未定义书签。 1.1 课程设计的目的 (3) 1.2 课程设计的任务与要求 (4) 2.课程设计思路及其原理 (4) 3.QuartusII软件的应用 (5) 3.1工程建立及存盘 (5) 3.2工程项目的编译 (5) 3.3时序仿真 (6) 4.分模块设计、调试、仿真与结果分析 (7) 4.1 clk50mto1时钟分频模块 (7) 4.2 adder加法器模块 (7) 4.3 hexcounter16 进制计数器模块 (7) 4.4 counter_time 计时模块 (8) 4.5 alarm闹铃模块 (8) 4.6 sound_ddd嘀嘀嘀闹铃声模块 (9) 4.7 sound_ddd_du嘀嘀嘀—嘟声音模块 (9) 4.8 alarm_time闹钟时间设定模块 (10) 4.9 bitsel将输出解码成时分秒选择模块 (10) 4.10 switch去抖模块 (11) 4.11 led译码显示模块 (11) 4.12 clock顶层模块 (12) 5.实验总结 (13) 5.1调试中遇到的问题及解决的方法 (13) 5.2实验中积累的经验 (14) 5.3心得体会 (14) 6.参考文献 (14) 1.1 课程设计的目的 通过课程设计的锻炼,要求学生掌握V erilog HDL语言的一般设计方法,掌握VerilogHDL语言的基本运用,具备初步的独立设计能力,提高综合运用所学的理论知识独立分析和解决问题的能力,基于实践、源于实践,实践出真知,实践检验真理,培养学生的

Verilog设计练习十例及答案

设计练习进阶 前言: 在前面九章学习的基础上,通过本章的练习,一定能逐步掌握Verilog HDL设计的要点。我们可以先理解样板模块中每一条语句的作用,然后对样板模块进行综合前和综合后仿真,再独立完成每一阶段规定的练习。当十个阶段的练习做完后,便可以开始设计一些简单的逻辑电路和系统。很快我们就能过渡到设计相当复杂的数字逻辑系统。当然,复杂的数字逻辑系统的设计和验证,不但需要系统结构的知识和经验的积累,还需要了解更多的语法现象和掌握高级的Verilog HDL系统任务,以及与C语言模块接口的方法(即PLI),这些已超出的本书的范围。有兴趣的同学可以阅读Verilog语法参考资料和有关文献,自己学习,我们将在下一本书中介绍Verilog较高级的用法。 练习一.简单的组合逻辑设计 目的: 掌握基本组合逻辑电路的实现方法。 这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。在Verilog HDL中,描述组合逻辑时常使用assign 结构。注意equal=(a==b)1:0,这是一种在组合逻辑实现分支判断时常使用的格式。 模块源代码: " qual(equal),.a(a),.b(b)); 简单时序逻辑电路的设计 目的:掌握基本时序逻辑电路的实现。

在Verilog HDL中,相对于组合逻辑电路,时序逻辑电路也有规定的表述方式。在可综合的Verilog HDL模型,我们通常使用always块和@(posedge clk)或@(negedge clk)的结构来表述时序逻辑。下面是一个1/2分频器的可综合模型。 eset(reset),.clk_in(clk),.clk_out(clk_out)); endmodule 仿真波形: 练习:依然作clk_in的二分频clk_out,要求输出与上例的输出正好反相。编写测试模块,给出仿真波形。 练习三. 利用条件语句实现较复杂的时序逻辑电路 目的:掌握条件语句在Verilog HDL中的使用。 与常用的高级程序语言一样,为了描述较为复杂的时序关系,Verilog HDL提供了条件语句供分支判断时使用。在可综合风格的Verilog HDL模型中常用的条件语句有if…else和case…endcase两种结构,用法和C程序语言中类似。两者相较,if…else用于不很复杂的分支关系,实际编写可综合风格的模块、特别是用状态机构成的模块时,更常用的是case…endcase 风格的代码。这一节我们给的是有关if…else的范例,有关case…endcase结构的代码已后会经常用到。 下面给出的范例也是一个可综合风格的分频器,是将10M的时钟分频为500K的时钟。

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;

verilog综合心得

综合:不可综合的运算符:= = = ,!= =,/(除法),%(取余数)。 1、不使用初始化语句。 2、不使用带有延时的描述。 3、不使用循环次数不确定的循环语句,如:forever、while等。 4、尽量采用同步方式设计电路。 5、除非是关键路径的设计,一般不调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 6、用always过程块描述组合逻辑,应在信号敏感列表中列出所有的输入信号。 7、所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 8、在verilog模块中,任务(task)通常被综合成组合逻辑的形式,每个函数(function)在调用时通常也被综合为一个独立的组合电路模块。 9、用户自定义原语(UDP)是不可综合的,它只能用来建立门级元件的仿真模型。 一般综合工具支持的V erilog HDL结构

移位运算符:V erilog HDL提供向右(>>)及向左(<<)两种运算符,运算符高位或地位一旦移出即予丢弃,其空缺的位则予以补零。 连续赋值语句(assign)、case语句、if…else语句都是可以综合的 initial 语句内若包含有多个语句时,必须以begin end 作聚合;单一的初值赋值,因此并不需以begin end做聚合。 循环(Loops)并不能单独地在程序中存在,而必须在initial和always块中才能使用。initial过程块中的语句仅执行一次,而always块中的语句是不断重复执行的。 编写顶层模块的注意事项 每个端口除了要声明是输入、输出还是双向外,还要声明其数据类型,是连线型(wire)还是寄存器型(reg),如果没有声明则综合器默认为wire型。 1、输入和双向端口不能声明为寄存器型。 2、在测试模块中不需要定义端口。 编写testbentch所归纳的心得

verilog课程设计—交通灯

课程论文 论文题目基于DE2的交通灯设计完成时间 课程名称Verilog语言设计 任课老师 专业 年级

1.交通信号控制器设计要求与思路 1.1设计背景 FPGA是一种用户根据各自需要而自行构造逻辑功能的数字集成电路,其种类很多,内部结构也不同,但共同的特点是体积小、使用方便。本文介绍了用VerilogHDL语言设计交通灯控制器的方法,并在QuartusII系统对FPGA芯片进行编译下载,由于生成的是集成化的数字电路,没有传统设计中的接线问题,所以故障率低、可靠性高,而且体积非常小。本文通过EDA设计,利用VerilogHDL语言模拟仿真交通灯控制电路。 1.2设计要求 根据交通灯控制器要实现的功能,考虑用两个并行执行的always语句来分别控制A方向和B方向的3盏灯。这两个always语句使用同一个时钟信号,以进行同步,也就是说,两个进程的敏感信号是同一个。每个always语句控制一个方向的3种灯按如下顺序点亮,并往复循环:绿灯----黄灯----红灯,每种灯亮的时间采用一个减法计数器进行计数,计数器用同步预置数法设计,这样只需改变预置数据,就能改变计数器的模,因此每个方向只要一个计数器进行预置数就可以。为便于显示灯亮的时间,计数器的输出均采用BCD码,显示由4个数码管来完成,A方向和B方向各用两个数码管。设定A方向红灯、黄灯、绿灯亮的时间分别为:35s、5s、35s,B方向的红灯、黄灯、绿灯亮的时间分别为:35s、5s、35s。假如要改变这些时间,只需要改变计数器的预置数即可。 1.3设计思路 两个方向各种灯亮的时间能够进行设置和修改,此外,假设B方向是主干道,车流量大,因此B方向通行的时间应该比A方向长。交通灯控制器的状态转换表见下表。表中,1表示灯亮,0表示灯不亮。A方向和B方向的红黄绿分别用R1、Y1、G1、R2、Y2、G2来表示。

Ncverilog_的一些经验

Ncverilog 的一些经验 1.Verilog和Ncverilog命令使用库文件或库目录 ex). ncverilog -f run.f -v lib/lib.v -y lib2 +libext+.v //一般编译文件在run.f中, 库文件在lib.v中,lib2目录中的.v文件系统自动搜索使用库文件或库目录,只编译需要的模块而不必全部编译 2.Verilog Testbench信号记录的系统任务: 1). SHM数据库可以记录在设计仿真过程中信号的变化. 它只在probes有效的时间内记录你set probe on的信号的变化. ex). $shm_open("waves.shm"); //打开波形数据库 $shm_probe(top, "AS"); // set probe on "top", 第二个参数: A -- signals of the specific sc rope S -- Ports of the specified s cope and below, excluding library cells C -- Ports of the specified s cope and below, including library cells AS -- Signals of the specifie d scope and below, excluding library cells AC -- Signals of the specifie d scope and below, including library cells 还有一个 M ,表示当前scope的m emories, 可以跟上面的结合使用, "AM" "AMS" "AMC" 什么都不加表示当前scope的por ts; $shm_close //关闭数据库 2). VCD数据库也可以记录在设计仿真过程中信号的变化. 它只记录你选择的信号的变化. ex). $dumpfile("filename"); //打开数据库 $dumpvars(1, top.u1); //scope = top.u1, depth = 1 第一个参数表示深度, 为0时记录所有深度; 第二个参数表示scope,省略时表当前的scope. $dumpvars; //depth = all scope = all $dumpvars(0); //depth = all scope = current $dumpvars(1, top.u1); //depth = 1 scope = top. u1 $dumpoff //暂停记录数据改变,信号变化不写入库文件中 $dumpon //重新恢复记录 3). Debussy fsdb数据库也可以记录信号的变化,它的优势是可以跟debus sy结合,方便调试.

Verilog HDL数字时钟课程设计

课程设计报告 课程设计名称:EDA课程设计课程名称:数字时钟 二级学院:信息工程学院 专业:通信工程 班级:12通信1班 学号:1200304126 姓名:@#$% 成绩: 指导老师:方振汉 年月日

目录 第一部分 EDA技术的仿真 (3) 1奇偶校验器 (3) 1.1奇偶校验器的基本要求 (3) 1.2奇偶校验器的原理 (3) 1.3奇偶校验器的源代码及其仿真波形 (3) 28选1数据选择器 (4) 2.18选1数据选择器的基本要求 (4) 2.28选1数据选择器的原理 (4) 2.38选1数据选择器的源代码及其仿真波形 (5) 34位数值比较器 (6) 3.14位数值比较器的基本要求 (6) 3.24位数值比较器的原理 (6) 3.34位数值比较器的源代码及其仿真波形 (7) 第二部分 EDA技术的综合设计与仿真(数字时钟) (8) 1概述 (8) 2数字时钟的基本要求 (9) 3数字时钟的设计思路 (9) 3.1数字时钟的理论原理 (9) 3.2数字时钟的原理框图 (10) 4模块各功能的设计 (10) 4.1分频模块 (10) 4.2计数模块(分秒/小时) (11) 4.3数码管及显示模块 (13) 5系统仿真设计及波形图........................... 错误!未定义书签。5 5.1芯片引脚图.................................... 错误!未定义书签。5 5.2数字时钟仿真及验证结果 (16) 5.3数字时钟完整主程序 (17) 6课程设计小结 (23) 7心得与体会 (23) 参考文献 (24)

Verilog语言基础知识

Verilog HDL语言基础知识 先来看两个Verilog HDL程序。 例一个8位全加器的Verilog HDL源代码 module adder8(cout,sum,ina,inb,cin); output[7:0] sum; output cout; input[7:0] ina,inb; input cin; @ assign {cout,sum}=ina+inb+cin; 模块的端口声明了模块的输人和输出口。其格式如下: module 模块名(口1,口2,口3,口4,……); 2.模块内容 模块内容包括I/O说明,信号类型声明和功能定义。 (1) I/O说明的格式如下: ; 输人口: input端口名1,端口名2,……端口名N; 输出口: output端口名l,端口名2,……端口名N; I/O说明也可以写在端口声明语句里。其格式如下: module module_name(input portl,input port2,…output portl,output port2,…); (2)信号类型声明: 它是说明逻辑描述中所用信号的数据类型及函数声明。如 ( reg[7:0] out; 数字 (1)整数

在Verilog HDL中,整数型常量(即整常数)有以下4种进制表示形式: ◇二进制整数(b或B); ◇十进制整数(d或D); ◇十六进制整数(h或H); ◇八进制整数(o或O)。 ) 完整的数字表达式为: <位宽>'<进制> <数字>, 位宽为对应二迸制数的宽度,如: 8'b nets型变量wire nets型变量指输出始终根据输入的变化而更新其值的变量,它一般指的是硬件电路中的各种物理连接。Verilog HDL中提供了多种nets型变量,具体见表。 这里着重介绍wire型变量。wire是一种常用的nets型变量,wire型数据常用来表示assign语句赋值的组合逻辑信号。Verilog HDL模块中的输入/输出信号类型缺省时自动定义为wire型。Wire型信号可以用作任何方程式的输入,也可以用作assign语句和实例元件的输出,其取值为0,1,x,z。 wire型变量格式如下: & ⑴.定义宽度为1位的变量: wire 数据名1,数据名2,……数据名n; 例如:wire a,b; register型变量reg register型变量对应的是具有状态保持作用的电路元件,如触发器、寄存器等。register

verilog算法小结

verilog算法小结 2009-11-0923:20:45|分类:FPGA|字号大中小订阅 编程要点: 1、RTL中基本上不用for语句,它会被综合器展开为所有变量情况的执行语句,每个变量独立占用寄存器资源,造成资源浪费。 For语句大多数用在testbeach中。 能复用的的处理模块尽量复用,即使所有操作都不能复用,也要用case语句展开处理。 2、if—else if—else应该避免使用,因为它综合出来会产生“优先级”,消耗资源。 if—if、case是平行结构的,不产生“优先级”。 尽量使用case和if—if。 3、系统上复用模块节省的面积远比代码上优化来的实惠的多。 4、使用FPGA,还是CPLD: FPGA触发器资源丰富;——时序逻辑设计 CPLD组合逻辑资源丰富。——组合逻辑设计 5、只采用同步时序电路,不采用异步时序电路。 6、延时: 同步时序电路的延时最常用的设计方法是用分频或倍频的时钟或者同步计数器完成所需要的延时。 对于比较大的和特殊定时要求的延时,一般用高速时钟产生一个计算器; 对于比较小的延时,可以用一个D触发器打一下。 #n一般只用在testbeach,在电路综合时会被忽略,所以不用。

常用代码总结: D触发器: always@(posedge clk or negedge rst) if(rst==0) dout<=0; else dout<=din; 应用:1、由于是在clk上升沿才打入,所以可以消除din存在的毛刺。 2、延时 Gray码计数器: 000-001-011-010-110-100-101-111 module gray_cnt( //input clk, rst //output gray_cnt_out); input clk;

Verilog课程设计

一.实验目的 (1)学习RISC_CPU的基本结构和原理; (2)了解Verilog HDL仿真和综合工具的潜力; (3)展示Verilog设计方法对软/硬件联合设计和验证的意义; (4)学习并掌握一些常用的Verilog语法和验证方法。 二.实验原理 CPU即中央处理单元的英文缩写,它是计算机的核心部件。计算机进行信息处理可分为两个步骤: (1)将数据和程序(即指令序列)输入计算机的存储器中。 (2)从第一条指令的地址起开始执行该程序,得到所需结果,结束运行。CPU的作用是协调并控制计算机的各个部件并执行程序的指令序列,使其有条不紊地进行。因此它必须具有以下基本功能。 ①取指令——当程序忆在存储器中时,首先根据程序入口地址取出一条程序,为此要发出指令地址及控制信号。 ②分析指令——即指令译码,这是对当前取得的指令进行分析,指出它要求什么操作,并产生相应的操作控制命令。 ③执行指令——根据分析指令时产生的“操作命令”形成相应的操作控制信号序列,通过运算器、存储器及输入/输出设备的执行,实现每条指令的功能,其中包括对运算结果的处理以及下条指令地址的形成。 将CPU的功能进一步细化,可概括如下: (1)能对指令进行译码并执行规定的动作; (2)可以进行算术和逻辑运算; (3)能与存储器和外设交换数据; (4)提供整个系统所需要的控制。 尽管各种CPU的性能指标和结构细节各不相同,但它们所能完成的基本功能相同。由功能分析,可知任何一种CPU内部结构至少应包含下面这些部件:(1)算术逻辑运算部件(ALU); (2)累加器; (3)程序计数器;

(4)指令寄存器和译码器; (5)时序和控制部件。 三.实验内容 通过我们自己动手,设计出一个CPU的软核和固核。这个CPU是一个简化的专门为教学目的而设计的RISC_CPU。在设计中我们不但关心CPU总体设计的合理性,而且还使得构成这个RISC_CPU的每一个模块不仅是可仿真的也都可以综合成门级网表。因而从物理意义上说,这也是一个能真正通过具体电路结构而实现的CPU。为了能在这个虚拟的CPU上运行较为复杂的程序并进行仿真,把寻址空间规定为8K(即13们地址线)字节。 四.实验代码 1.源代码 //----------------------------------clk_gen.v------------------------------ `timescale 1ns/1ns //时间单位1ns,时间单位1ns module clk_gen(clk,reset,fetch,alu_ena); //模块名clk_gen,参数列表(clk,reset,fetch,alu_ena)input clk,reset; //输入clk,reset output fetch,alu_ena; //输出fetch,alu_ena wire clk,reset; //wire型变量clk,reset reg fetch,alu_ena; //reg寄存器型变量fetch,alu_ena reg[7:0]state; //reg寄存器型变量8位的state parameter S1=8'b00000001,S2=8'b00000010,S3=8'b00000100,S4=8'b00001000,S5=8'b00010000,S6=8'b001 00000,S7=8'b01000000,S8=8'b10000000,idle=8'b00000000; //参数型定义8位二进制常量s1,s2,s3,s4,s5,s6,s7,s8,idle always@(posedge clk) //always块时钟触发 if(reset) //如果reset为真 begin //执行begin,and顺序块 fetch<=0; //fetch非阻塞赋值赋为0 alu_ena<=0; //alu_ena非阻塞赋值赋为0 state<=idle; //idle非阻塞赋值给state end else //reset为假执行下面begin语句 begin case(state) //case表达式(state) S1:begin alu_ena<=1; //alu_ena非阻塞赋值赋为1 state<=S2; //state非阻塞赋值赋为S2 end S2:begin alu_ena<=0; //alu_ena非阻塞赋值赋为0 state<=S3; //state非阻塞赋值赋为S3 end

verilog语言的综合与不可综合

Verilog的综合与不可综合 综合说明编的代码可以对应出具体的电路,不可综合说明没有对应的电路结构。不可综合的代码编译通过,只能看到输出,不能实现电路,就是不能用来制作具体的芯片。 一、基本 Verilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器。 二:verilog语句结构到门级的映射 1、连续性赋值:assign 连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因些连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。 2、过程性赋值: 过程性赋值只出现在always语句中。 阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。 建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。 过程性赋值的赋值对象有可能综合成wire,latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。 过程性赋值语句中的任何延时在综合时都将忽略。 建议同一个变量单一地使用阻塞或者非阻塞赋值。 3、逻辑操作符: 逻辑操作符对应于硬件中已有的逻辑门 4、算术操作符: Verilog中将reg视为无符号数,而integer视为有符号数。因此,进行有符号操作时使用integer,使用无符号操作时使用reg。 5、进位: 通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如: Wire [3:0] A,B; Wire [4:0] C; Assign C=A+B; C的最高位用来存放进位。 6、关系运算符: 关系运算符:<,>,<=,>= 和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是reg,net还是integer。

学习FPGA verilog的心得--编程技巧--如何写代码减少逻辑单元的使用数量

一....尽量不要使用"大于""小于"这样的判断语句,这样会明显增加使用的逻辑单元数量.看一下报告,资源使用差别很大. 例程:always@(posedge clk) begin count1=count1+1; if(count1==10000000) feng=1; //no_ring else if(count1==90000000) begin feng=0; //ring count1=0; end end //这么写会用107个逻辑单元 // 如果把这句话if(count1==10000000)改成大于小于,报告中用了135个逻辑单元二.....一定要想尽办法减少reg寄存器的长度 上次把[30:0]改到[50:0],报告里逻辑单元从100多直升到2000多!!!太吓人了,至于为什么我就不知道了哈! 三....case语句里一定要加default if一定要加else 如果是组合逻辑的设计,不加default或else的话,不能保证所有的情况都有赋值,就会在内部形成一个锁存器,不再是一个纯粹的组合逻辑了,电路性能就会下降.

例如:case({a,b}) 2'b11 e=b; 2'b10 e=a; endcase //不加default,虽然只关心a=1时的结果,但是a=0的时候,e就会保存原来的值,直到a变为1 //那么e要保存原来的值,就要在内部生成锁存器了. 四....尽量使用Case语句而不是if--else语句 复杂的if--else语句通常会生成优先级译码逻辑,这将会增加这些路径上的组合时延 用来产生复杂逻辑的Case语句通常会生成不会有太多时延的并行逻辑 五...组合逻辑的always块中,要注意所有的输入全部放入敏感变量表里 比如:always@(a or b) begin out=(a&b&c); end 此时生成的不是纯的组合逻辑,因为当C变化时, out不会立刻发生变化(需要等到a或b变化,c 的变化才会显现), 所以需要生成一个寄存器来保存C的值. 连续赋值语句的综合:从赋值语句右边提取出逻辑,用于驱动赋值语句左边的net

基于Verilog的课程设计

基于Verilog的课程设计 直流电机的PWM控制 指导老师:翁嘉民 班级:1031电气自动化技术成员:李高峰9112 王俊才9186 孟令朋9143

目录 1.绪论 (3) 直流电机介绍 (3) 1.1.1直流电机的特点 (3) 1.1.2直流电机的应用 (3) 介绍 (4) 介绍 (4) V ERILOG HDL硬件描述语言 (5) 1.4.1V ERILOG HDL硬件描述语言介绍 (5) 1.4.2V ERILOG HDL功能 (5) PWM脉冲宽度调制介绍 (6) 直流电机的PWM控制 (7) 2.设计原理 (8) 设计原理框图 (8) 原理图 (9) 模块设计 (9) 2.3.1 MOTO_TEST模块 (9) 2.3.4计数器模块 (12) 7实训心得 (13) 参考文献 (13)

直流电机的PWM控制器的设计 1.绪论 直流电机介绍 直流电机是实现直流电能与机械能之间相互转换的一种电力机械,按照直流电机的用途分为直流电动机和直流发电机两类。能够将机械能转换成直流电能的电机称为直流发电机;能够将直流电能转换成机械能的电机称为直流电动机。 1.1.1直流电机的特点 从直流电机与交流电机相比中可以看出,直流电机具有优良的调速性能和启动性能。直流电机具有宽广的调速范围,平滑的无级调速特性,可实现频繁的无级快速启动、制动和反转;过载能力大,能承受频繁的冲击负载;能满足自动化生产系统中各种特殊运行的要求。而直流发电机则能提供无脉动的大功率直流电源,且输出电压可以精确地调节和控制。 1.1.2直流电机的应用 直流电机是交通、工矿、建筑等行业中的常见动力机械,是机电行业人员的重要工作对象和工具。在某些要求调速范围广、速度快、精密度高、控制性能优异的场合,直流电机的应用目前仍占有较大的比重,如大型可逆式轧钢机、内燃机车、矿井卷扬机、造纸和印刷机械、宾馆高速电梯、城市电车、电动自行车、龙门刨床、电力机车、地铁列车、船舶机械、大型精密机床和大型起重机等生产机械中。

verilog语句可综合vs不可综合

1)所有综合工具都支持的结构: always,assign,begin,end,case,wire,tri,supply0,supply1,reg,integer,default,for,function,and,nand,or,nor,xor,xnor,buf,not,bufif0,bufif1,notif0,notif1,if,inout,input,instantitation,module,negedge,posedge,operators,output,parameter。 2)所有综合工具都不支持的结构: time,defparam,$finish,fork,join,initial,delays,UDP,wait。 3)有些工具支持有些工具不支持的结构: casex,casez,wand,triand,wor,trior,real,disable,forever,arrays,memories,repeat,task,while。 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点: 1)不使用initial。 2)不使用#10。 3)不使用循环次数不确定的循环语句,如forever、while等。 4)不使用用户自定义原语(UDP元件)。 5)尽量使用同步方式设计电路。 6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对

Verilog HDL课程设计

人民武装学院Verilog HDL课程设计洗衣机控制器的设计 学生姓名: 周云 学号: PB102027115 专业: 电子信息科学与技术 年级: 2010 级 指导老师: 周骅老师 时间: 2011年12月22日

目录 引言...................................................................................................................... - 3 - 一、设计内容...................................................................................................... - 4 - 1.设计内容.................................................................................................... - 4 - 2.功能............................................................................................................ - 4 - 二、洗衣机控制器的工作原理.......................................................................... - 6 - 1. 洗衣机的工作状态.................................................................................. - 6 - 2. 全自动洗衣过程...................................................................................... - 7 - 3.单独执行某个洗衣程序............................................................................ - 8 - 三、洗衣机的状态转换图.................................................................................. - 9 - 1.洗衣机的状态转换图................................................................................ - 9 - 2. 设计思路.................................................................................................. - 9 - 四、设计程序.................................................................................................... - 11 - 1.全自动洗衣机主程序.............................................................................. - 11 - 2.全自动洗衣机测试程序.......................................................................... - 15 - 五、步骤及仿真图............................................................................................ - 17 - 1.在代码提示框架中完成核心子模块wash_ctrl.v的设计 ................... - 17 - 2.对核心子模块wash_ctrl.v 进行时序仿真 ........................................... - 17 - 六、功能图........................................................................................................ - 20 - 1.设计顶层图形文件,编译.................................................................... - 20 - 2.功能引脚锁定.......................................................................................... - 20 - 心得体会............................................................................................................ - 22 -

Verilog HDL设计练习

Verilog HDL设计练习进阶(一) 练习一.简单的组合逻辑设计 目的:掌握基本组合逻辑电路的实现方法。 这是一个可综合的数据比较器,很容易看出它的功能是比较数据a与数据b,如果两个数据相同,则给出结果1,否则给出结果0。在Verilog HDL中,描述组合逻辑时常使用assign结构。注意equal=(a==b)?1:0,这是一种在组合逻辑实现分支判断时常使用的格式。 模块源代码: //--------------- compare.v ----------------- module compare(equal,a,b); input a,b; output equal; assign equal=(a==b)?1:0; //a等于b时,equal输出为1;a不等于b时, //equal输出为0。 endmodule 测试模块用于检测模块设计得正确与否,它给出模块的输入信号,观察模块的内部信号和输出信号,如果发现结果与预期的有所偏差,则要对设计模块进行修改。 测试模块源代码: `timescale 1ns/1ns //定义时间单位。 `include "./compare.v" //包含模块文件。在有的仿真调试环境中并不需要此语句。 //而需要从调试环境的菜单中键入有关模块文件的路径和名称module comparetest; reg a,b; wire equal; initial //initial常用于仿真时信号的给出。 begin a=0; b=0; #100 a=0; b=1; #100 a=1; b=1; #100 a=1; b=0; #100 $stop; //系统任务,暂停仿真以便观察仿真波形。 end compare compare1(.equal(equal),.a(a),.b(b)); //调用模块。 endmodule 仿真波形(部分):

相关文档
最新文档