当前位置:文档之家› verilog串并转换并串转换

verilog串并转换并串转换

verilog串并转换并串转换
verilog串并转换并串转换

1.

设计名称:38译码器带使能端的

主要功能:

实现38译码功能,并且在使能段处于低电平是输出为00000000 设计框图:

设计代码:

module decoder3_8(a,b,ena);

input [2:0] a;

input ena;

output [7:0] b;

reg [7:0] b;

always @ (ena,a)

if(!ena)

begin

b=8'b00000000;

end

else

begin

case(a)

3'b000: b=8'b00000001;

3'b001: b=8'b00000010;

3'b010: b=8'b00000100;

3'b011: b=8'b00001000;

3'b100: b=8'b00010000;

3'b101: b=8'b00100000;

3'b110: b=8'b01000000;

3'b111: b=8'b10000000;

default: b=8'b00000000; endcase

end

endmodule

仿真代码:

`timescale 1ns/1ns

module tb;

reg [2:0] a;

reg ena;

wire [7:0] b;

initial begin

a = 3'b000;

ena = 1'b0;

#50;

ena = 1'b1;

#50;

a=3'b001;

#50;

a=3'b010;

#50;

a=3'b011;

#50;

a=3'b100;

#50;

a=3'b101;

#50;

a=3'b110;

#50;

a=3'b111;

#50;

$ stop;

end

decoder3_8 udecoder3_8(

.a(a),

.ena(ena),

.b(b)

);

endmodule

仿真结果:

辅助说明:

当ena为低电平时,无论a为何值,总是输出00000000,当ena为高电平时,输出即随a 的数值变化而变化,当a为001时,b的值变为00000010;当a为010时,b的值变为00000100,这与设计时的功能是一致的。

_______________________________________________________________________________ 2.

设计名称:83编码器带使能端的和优先级

主要功能:

实现83编码功能,并且在使能段处于低电平是输出为000,同时最高位的优先级最高

设计框图:

设计代码:

module undecoder8_3(a,b,ena);

input [7:0] a;

input ena;

output [3:0] b;

reg [3:0] b;

always @ (ena,a)

if(!ena)

begin

b=3'b000;

end

else

if(a[7]) b=3'b111;

else

if(a[6]) b=3'b110;

else

if(a[5]) b=3'b101;

else

if(a[4]) b=3'b100;

else

if(a[3]) b=3'b011;

else

if(a[2]) b=3'b010;

else

if(a[1]) b=3'b001;

else

if(a[0]) b=3'b000;

else b=3'b000;endmodule

仿真代码:

module tb;

reg [7:0] a;

reg ena;

wire [2:0] b;

initial begin

a = 8'b10000000;

ena = 1'b0;

#50;

ena = 1'b1;

#50;

a=8'b01000000;

#50;

a=8'b00100000;

#50;

a=8'b00010000;

#50;

a=8'b00001000;

#50;

a=8'b00000010;

#50;

a=8'b00000001;

#50;

a=8'b10100000;

#50;

$stop;

end

undecoder8_3 unit1_undecoder8_3(

.a(a),

.ena(ena),

.b(b)

);

endmodule

仿真结果:

辅助说明:

当ena为低电平时,无论a为何值,总是输出000,当ena为高电平时,输出即随a的数值变化而变化,当a为01000000时,b为110,当a为00100000是,b为101以此类推,同时最后一个波形为,当a为10100000时,b为111,体现了优先译码的功能,此结果和当初设计的功能一致的。

_______________________________________________________________________________ 3.

设计名称:设计一个1:1的3分频器

主要功能:

实现3分频,同时高低电平比为1:1

设计框图:

设计代码:

这个设计可以利用模三计数器分别在时钟的上升和下降沿设计一个高低电平为1:2的3分频,然后将两个波形相或即能得到结果。

代码一:

module Devider2_1(

//inputs

clk,

rst_n,

//outputs

opt1,

opt2,

opt);

input clk;

input rst_n;

output opt;

output opt1;

output opt2;

reg opt1;

reg [1:0] temp1;

reg opt2;

reg [1:0] temp2;

always@(posedge clk)

begin

if(!rst_n)

begin

temp1 <= 2'd0;

opt1 <= 1'b0;

end

else if(temp1==1)

begin

opt1 <=1'b1;

temp1 <= temp1 + 2'd1;

end

else if(temp1==2'd2) begin

opt1 <= 1'b0;

temp1 <= 2'd0;

end

else

begin

temp1 <= temp1+2'd1; end

end

always@(negedge clk)

begin

if(!rst_n)

temp2 <= 2'd0;

opt2 <= 1'b0;

end

else if(temp2==1) begin

opt2 <=1'b1;

temp2 <= temp2 + 2'd1;

end

else if(temp2==2'd2)

begin

opt2 <= 1'b0;

temp2 <= 2'd0;

end

else

begin

temp2 <= temp2+2'd1;

end

end

assign opt = opt1 || opt2;

endmodule

同时也可以用同样的方法设计一个在上升和下降沿高低电平2:1的3分频器,将两个波形相与即可。

代码二:

module Devider2_1(

//inputs

clk,

rst_n,

//outputs

opt1,

opt2,

opt);

input clk;

input rst_n;

output opt;

output opt1;

output opt2;

reg opt1;

reg opt2;

reg [1:0] temp1;

reg [1:0] temp2;

always@(posedge clk)

if(!rst_n)

begin

temp1 <= 2'd0;

opt1 <= 1'b0;

end //reset

else if(temp1==2'd0)

begin

opt1<=1'b1;

temp1 <= temp1 + 2'd1; end

else if(temp1==2'd1)

begin

opt1 <=1'b1;

temp1 <= temp1 + 2'd1; end

else if(temp1==2'd2)

begin

opt1 <= 1'b0;

temp1 <= 2'd0;

end

end

always@(negedge clk)

begin

if(!rst_n)

begin

temp2 <= 2'd0;

opt2 <= 1'b0;

end //reset

else if(temp2==2'd0)

begin

opt2<=1'b1;

temp2 <= temp2 + 2'd1; end

else if(temp2==2'd1)

begin

opt2 <=1'b1;

temp2 <= temp2 + 2'd1; end

else if(temp2==2'd2)

begin

opt2 <= 1'b0;

temp2 <= 2'd0;

end

assign opt = opt1&&opt2; endmodule

仿真代码:

上面两个代码的仿真代码是一样的。`timescale 1ns/1ns

module tb;

//inputs

reg clk;

reg rst_n;

//outputs

wire opt1;

wire opt2;

wire opt;

//generate clk

always #10 clk = ~clk;

//tb starts

Initial

begin

clk = 1'b0;

rst_n = 1'b0;

#100;

rst_n = 1'b1;

#500;

$stop;

end

//Instant DUT

Devider2_1 uDevider2_1(

//inputs

.clk(clk),

.rst_n(rst_n),

//outputs

.opt1(opt1),

.opt2(opt2),

.opt(opt)

);

endmodule

仿真结果:

(a)高低电平为1:2设计的

(b)高低电平为2:1设计的

辅助说明:

(a)中opt1为上升沿触发的高低电平1:2的3分频,opt2为下降沿触发的高低电平为1:2的3分频,可以看出在rst_n为0进行清复位,之后在rst_n为1是进行分频,最后所得opt结果为1:1的3分频,符合设计要求。

(b)中opt1为上升沿触发的高低电平2:1的3分频,opt2为下降沿触发的高低电平为2:1的3分频,可以看出在rst_n为0进行清复位,之后在rst_n为1是进行分频,最后所得opt结果为1:1的3分频,符合设计要求。

_______________________________________________________________________________ 4.

设计名称:七人表决器

主要功能:

7个人进行表决,人数过4则LED灯亮,否则灯灭

设计框图:

设计代码:

module v(vote,rst,Q);

input [6:0]vote;

input rst;

output Q;

reg Q;

reg [2:0]c;

always @(vote or rst) begin

c=0;

if(rst)

c=3'b000;

else

begin

c=c+vote[0];

c=c+vote[1];

c=c+vote[2];

c=c+vote[3];

c=c+vote[4];

c=c+vote[5];

c=c+vote[6];

end

if(c>3) Q=1;

else Q=0;

end

endmodule

仿真代码:

`timescale 1ns/1ns

module q;

reg rst;

reg [6:0]vote;

wire Q;

initial begin

rst=0;

vote=7'b111111;

#50; rst=1;

#50; rst=0;

#50; vote=7'b0110101;

#50; vote=7'b0100101;

#50; vote=7'b0111101;

#50; vote=7'b1111001;

#50; vote=7'b0100001;

#50; vote=7'b0000001;

#50; $stop;

end

v v_unit(

.vote(vote),

.rst(rst),

.Q(Q));

endmodule

仿真结果:

辅助说明:

第一个表决为0111111,有6人同意,于是显示通过,Q为高电平,第二个单位是,rst复位信号显示为1,此时对表决器复位,于是Q清0,后面当rst为低电平时又可以开始表决,当最后一个表决信号只有1个人同意时,由于人数少于4,所以Q为0,不通过,结果与设计相仿。

_______________________________________________________________________________ 5

设计名称:

十进制计数器的设计

主要功能:

使能端为高电平且复位信号为低电平是,进行模十同步计数,同时满10 的时候清0并且进位co置1,在一个始终后默认高位已经接受完进位信号将其清0。使能端为低电平时计数器保持输出不变,当使能端为高电平,且复位信号为高电平时,将计数器异步清0.

设计框图:

设计代码:

module ten(clk,rst_tong,rst_yi,a,co,ena);

input clk;

input rst_tong;

input rst_yi;

input ena;

output [3:0] a;

output co;

reg [3:0]a;

reg co;

always@(posedge clk or posedge rst_yi) begin

co<=0;

if(rst_yi)

begin

a<=4'b0000;

co<=0;

end

if(!ena)

begin

co<=0;

end

else

begin

if(rst_tong)

begin

a<=4'b0000;

co<=0;

end

else

if(a<4'b1001)

a<=a+4'b0001;

else

if(a==4'b1001)

begin

a<=4'b0000;

co<=1;

end

end

end

endmodule

仿真代码:

`timescale 1ns/1ns

module tb;

reg clk;

reg rst_yi;

reg ena;

reg rst_tong;

wire [3:0]a;

wire co;

always #10 clk = ~clk;

initial begin

ena=0;

clk = 1'b0;

rst_yi= 1'b1;

rst_tong=1'b0;

#10;

ena=1;

#14;

rst_yi= 1'b0;

#230;

rst_yi= 1'b1;

#20;

rst_yi=1'b0;

#20;

ena=0;

#30;

rst_tong=1'b1;

#500;

$stop;

end

ten ten_unit(.clk(clk),

.rst_yi(rst_yi),

.rst_tong(rst_tong),

.ena(ena),

.a(a),

.co(co)

);

endmodule

仿真结果:

辅助说明:

这个十进制计数器里面我设计了两个复位端口,一个是同步复位端口rst_tong,一个是异步复位端口rst_yi,从仿真图形中可以看出,在使能端ena为低是计数器保持数值不变,输出全是0,当使能端ena为高电平的时候,当异步复位rst_yi为高电平是实现异步清零,这个可以在rst_yi的第二个高电平处看清楚,当rst_yi为低电平时,若rst_tong为低电平,实现正常计数,此时从0000计数到1001,在下一个时钟周期产生一个半个周期的进位高电

平co,在并且计数a重新变为0,当rst-tong为高电平时,在时钟的上升沿进行同步置数此功能和当初的设计目标一致。

_______________________________________________________________________________ 6:

设计名称:4路抢答器

主要功能:

完成抢答功能,并且在抢答结束的时候清0,在下一次抢答开始之前按抢答键无效。

设计框图:

设计代码:

module qiang(a,b,start);

input [3:0] a;

input start;

output [3:0]b;

reg [3:0]b;

reg [3:0]temp;

always@(a or start)

begin

if(!start)

begin

temp=0;

b=0;

end

else

if(temp== 4'b0000)

begin

temp=a;

b=temp;

end

end

endmodule

仿真代码:

`timescale 1ns/1ns

module tb;

reg [3:0]a;

reg start;

wire [3:0]b;

initial begin

start=0;

a=4'b0000;

#10;

start=1;

#10;

a=4'b0100;

#10;

a=4'b0110;

#50; start=0;

#10; a=4'b0100;

#30; a=4'b0000;

#50; start=1;

#50; a=4'b1000;

#50;

$stop;

end

qiang qiang_unit(

.a(a),

.start(start),

.b(b)

);

Endmodule

仿真结果:

辅助说明:

可以看出,当start为0,抢答器未启动时,输出为0000,当start为1时,此时a=0010,表明第二个人已经先按下抢答器,这是输出为0010,之后a=0110,又有人再次之后按下抢答器,但是由于a【1】已经先按下,所以a【2】按下后还是只能显示0010,这就实现了抢答功能,当start=0是,这是输出清零,这是输入0100,由于抢答器未工作,所以输出还是0000,后面当start又是1的时候,这时候a【3】抢答成功,所输出又为1000,符合当初的设计功能。

7.

设计名称:并串转换

主要功能:

在没有数据输出时,输出为x,此时ready信号为高,若load信号也为高时,则将输入的数据传输给中间寄存器temp,然后resdy信号变为低电平,ready信号有temp【7】决定,当temp【7】中还有数据时,表明还没有全部转换完,则ready为低,当temp【7】没有数据显示为x时,则ready为高,表明可以接收数据了。当接收完数据之后,在8个时钟周期将信号输出。

设计框图:

设计代码:

module bcc(clk,ain,rst,bout,load,ready);

input clk;

input [7:0]ain;

input rst;

input load;

output bout;

output ready;

reg bout;

reg [7:0]temp;

reg ready;

always @(posedge rst or posedge clk)

if(rst)

begin

bout <=1'bx;

temp <=8'bxxxxxxxx;

ready<=1;

end

else

if(load && ready)

temp<=ain;//if load is high leve and temp is empty,then,transport data

if(temp[7]||!temp[7]) //temp[7] has data

begin

bout<=temp[7];

//temp shift left,and temp[0] equal x

temp[7:1]<=temp[6:0];

temp[0]<=1'bx;

ready<=0;

end

else

begin

bout<=1'bx;

ready<=1;

end

end

endmodule

仿真代码:

`timescale 1ns/1ns

module bcc_tb;

reg clk;

reg [7:0]ain;

reg rst;

reg load;

wire ready;

wire bout;

always #10 clk = ~clk;

initial

begin

clk=0;

rst=1;

load=0;

ain=11;

#10;

rst=0;

#10;

load=1;

#20;

load=0;

#20;

ain=8;

#40;

load=1;

#20;

load=0;

#100;

load=1;

#20;

load=0;

#200;

rst=1;

#10;

$stop;

end

bcc bcc_unit(

.clk(clk),

.ain(ain),

.rst(rst),

.load(load),

.bout(bout),

.ready(ready)

);

Endmodule

仿真结果:

辅助说明:

可以从仿真图形中看出,在rst为高时,进行复位,当rst为低时,由于temp里面没有数据,所以ready信号为高,此时表明temp可以接受数据,若load信号为高,之后temp则接收到ain的信号,此时temp里面有了数据,则ready信号为0,不能再传输数据,此时后8个时钟周期输出为00001011,完成串并转换,期间就算load为高电平,但是ready信号为低,所以不会传输下一个数据00001000,只有当之后ready为高电平时,此时财货执行下一个数据的传输。此仿真波形与我当时设计的目标相符,基本达到设计目标。

8.

设计名称:串并转换

主要功能:当rst为高电平时进行复位,当rst为低电平时,若load为高电平且ready为高电平(ready信号有temp决定,若temp里面的数据已经传满则ready为低电平,若temp 数据还未传满,则ready为高电平)时将输入数据传给自己定义的中间寄存器temp,若temp 接受完8位数据,则ok信号为高电平并且将ready置为低电平,就可以将temp的值传给bout输出,传输完毕之后temp又被清空,此时ok又置为低电平,ready显示高电平。

设计框图:

设计代码:

module cbc(clk,ain,load,rst,ready,bout,ok);

input clk;

input ain;

input load;

input rst;

output ready;

Verilog可综合与不可综合语句汇总

1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,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不可被综合的语句

verilog 不可综合语句总结汇总 2009-04-20 18:37 (1)所有综合工具都支持的结构:always,assign,begin,end,case,wire,tri,aupply0,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过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。 (11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。 (12)避免混合使用上升沿和下降沿触发的触发器。 (13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。 (14)避免在case语句的分支项中使用x值或z值。 不可综合verilog语句2009-04-14 19:33

可综合的Verilog语句

可综合Verilog语句 ?一: 综合就是从采用Verilog HDL 语言描述的寄存器传输级电路模型构造出门级网表的过程.产生门级网表之后,逻辑优化器读入网表并以用户指定的面积和定时约束为目标优化网表. ?二. 设计流程中的综合 ?Verilog HDL允许用户在不同的抽象层次上对电路进行建模,这些层次从门级、寄存器传输级、行为级直至算法级。因此,同一电路就可以有多种不同的描述方式,但不是每一中描述都是可综合的。事实上,Verilog HDL 原本被设计成一种仿真语言,而不时一种综合语言。结果导致Verilog HDL 中很多结构没有相应的硬件可以对应,例如系统调用$display.同样也不存在用于寄存器传输级综合的Verilog HDL 标准子集.?正是由于存在这些问题,不同的综合系统所支持的Verilog HDL 综合子集是不同的.由于Verilog HDL 中不存在单个的对象来表示锁存器或触发器,所以每一种综合系统都会提供不同的机制以实现锁存器或触发器的建模.因此各种综合系统都定义了自己的Verilog HDL 可综合子集以及自己的建模方式. ?使用Verilog HDL 以不同的方式描述了同一电路.某综合系统支持对方式A和方式B的综合,但可能不支持对方式C的综合,这意味着综合模型在不同的综合系统之间通常是不可移植的. ?这一局限性使设计者不仅需要理解Verilog HDL ,而且必须理解特定综合系统的建模方式, 才能编写出可综合的模型.可综合的数据类型?1.网线数据类型: ?Wire,wor,wand,tri,supply0,supply1 ?2.寄存器数据类型: ?Reg,integer ?Time,real:不能综合. ?3.常量: ?整型. ?实型和字符串型不能综合.可综合的运算符?1.逻辑运算符能直接映射成硬件中的基本逻辑门. ?2.算术运算符 ?3.关系运算符: ?能综合的有:>,<,<=,>=. ?4.相等性算符: ?能够综合的有:==和!=. ?不能综合:===和!==(有些工具按==和!=综合). ?5.移位运算符: ?<<和>>,移位腾出的位都补0. 多个时钟的可综合情况 ?1.多个时钟的情况:对变量的赋值不能受多个时钟控制 例如: ? module multclk(clk1,clk2,addclk,and,rstn,subclr,subn,dsadd,dssub);

Verilog中的一些语法和技巧

1、. 2、. 3、Reg型的数据类型默认初始值为X。reg型数据可以赋正值也可以赋负值,但 是当一个reg型数据是一个表达式的操作数的时候,他的值被当做无符号数及正值。 4、在数据类型中?和Z均表示高阻态。 5、Reg型只表示被定义的信号将用在“always”模块内,并不是说reg型一定 是寄存器或触发器的输出。虽然reg型信号常常是寄存器或触发器的输出但是并不一定总是这样。 6、Verilog语言中没有多维数组的存在。Memory型数据类型是通过扩展reg型 数据的弟子和范围来生成的。其格式如下reg[n-1:0]存储器名[m-1:0]; 7、在除法和取余的运算中结果的符号和第一个操作数的符号位是相同的。 8、不同长度的数据进行运算:两个长度不同的数据进行位运算时,系统会自动 地将两者按有端对齐,位数少的操作数会在相应的高位用0填满以便连个操作数安慰进行操作。 9、= = =与!= = =和= =与!= =的区别:后者称为逻辑等是运算符,其结果是 2个操作数的值决定的。由于操作书中某些位可能不定值x和高阻态z结果可能是不定值x。而 = = =和!= = =运算符对操作数的比较时对某些位的高阻态z和不定值x也进行比较,两个操作数必须完全一致,其结果才是1,否则是0. 10、非阻塞和阻塞赋值方式:非阻塞赋值方式(如a<=b)上面语句所赋得变 量值不能立即被下面语句所用,(2)快结束后才能完成这次赋值操作 3在编写克综合的时序逻辑模块时这是最常用的赋值方法。阻塞赋值(如a=b)赋值语句执行完后,块才结束 2 b的值在赋值语句完成后立即执行 3在时序逻辑使用中,可能产生意想不到的结果。 11、模块的描述方式:(RTL为寄存器传输级描述) “(1)数据流描述方式:数据流行描述主要用来描述组合功能,具体用“assign”连续赋值语句来实现。分为两种a、显式连续赋值语句;

verilog中可综合和不可综合语句概述

Verilog 中可综合及不可综合语句概述Verilog 硬件描述语言有很完整的语法结构和系统,类似高级语言,这些语法结构的应用给我们的设计描述带来很多方便。但是,我们知道,Verilog 是描述硬件电路的,它是建立在硬件电路的基础上的。有些语法结构是不能与实际硬件电路对应起来的,也就是说我们在把一个语言描述的程序映射成实际硬件电路中的结构时是不能实现的。下面就是我多年工作经验总结出来的大部分综合工具支持或不支持的verilog 语法结构。 一.用verilog 建立可综合模型的原则 要保证Verilog HDL赋值语句的可综合性,在建模时应注意以下要点: (1)不使用initial 。 (2)不使用#10。 (3)不使用循环次数不确定的循环语句,如forever、while 等。 (4)不使用用户自定义原语(UDP元件)。 (5)尽量使用同步方式设计电路。 (6)除非是关键路径的设计,一般不采用调用门级元件来描述设计的方法,建议采用行为语句来完成设计。 (7)用always过程块描述组合逻辑,应在敏感信号列表中列出所有的输入信号。 (8)所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,应尽量使用器件的全局复位端作为系统总的复位。 (9)对时序逻辑描述和建模,应尽量使用非阻塞赋值方式。对组合逻辑描述和建模,既可以用阻塞赋值,也可以用非阻塞赋值。但在同一个过程块中,最好不要同时用阻塞赋值和非阻塞赋值。 (10)不能在一个以上的always过程块中对同一个变量赋值。而对同一个赋值对象不能既使用阻塞式赋值,又使用非阻塞式赋值。

(11)如果不打算把变量推导成锁存器,那么必须在if语句或case语句的所有条件分支中都对变量明确地赋值。 ( 12)避免混合使用上升沿和下降沿触发的触发器。 ( 13)同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。 (14)避免在case语句的分支项中使用x值或z值。 二.不可综合verilog 语句 1 、initial 只能在testbench中使用,不能综合。(我用ISE9.1综合时,有的简单的initial 也可以综合,不知道为什么) 2、events event 在同步test bench 时更有用,不能综合。 3、real 不支持real 数据类型的综合。 4、time 不支持time 数据类型的综合。 5、force 和release 不支持force禾口release的综合。 6、assign 禾口deassign 不支持对reg数据类型的assign或deassign进行综合,支持对wire数据类型的assign或deassign进行综合。 7、fork join

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

实验二 verilog行为语句实验

实验二:基于verilogHDL行为语句的电路设计班级:姓名:学号: 作业完成后,以班级为单位,班长或课代表收集齐电子版实验报告,统一提交. 文件命名规则如“通1_王五_学号” 一、实验目的 1、了解verilog HDL行为语句,可综合与非可综合 2、掌握always过程块的格式,注意事项 3、掌握串行块begin-end、assign持续赋值 4、掌握if-else、for、·define、等可综合过程语句 5、练习基本的组合电路和时序电路的verilogHDL设计与仿真 二、预习要求 1.了解veirlogHDL行为语句。 2. Verilog HDL的模块结构的组成。 3.简单电路系统设计的流程和方法。 三、实验基本概念 1、74HC138的功能表入下 2、74160的功能表

3、74161 四、实验内容 (一)典型习题的验证与仿真 设计要求: 1、将课本(课件)中的模256计数器在QuartusII进行编辑和综合,体会计数器设计,注意控制信号的同步、异步,高电平与低电平有效的问题。 2、将阻塞赋值与非阻塞赋值的实例进行综合,对比RTL与门级视图,体会区别。 3、将模60的BCD码加法计数器进行编辑、综合和仿真,并思考数电仿真中的24进制加法

器电路设计与此设计的关联性,可尝试设计一个模24进制计数器。 4.BCD码的七段管译码器设计 5、for循环实现2个8位乘法,尝试用别的方法设计乘法器并进行综合,并进行对比 6、过程和结果(后面继续添加) 上述题目,课件皆有源代码,如果个人对代码有改进,有引申,将代码黏贴到下面空白处,或者写一下自己对上述需注意问题的体会。(内容不限) (二)设计一个类似于74138的译码器电路 设计要求: 1、用verilog设计译码器,并进行综合和仿真 2.观察RTL级和门级综合视图,对比在数字电路上学过的电路结构。 3.QuartusII进行功能仿真,验证设计的正确性。 4、过程和结果(后面继续添加) 将在程序编辑、编译过程中的错误进行记录(截图或者文本),并错误指出来 (2)代码与仿真结果(结果截图) module test(s1,s2,s3,a0,a1,a2,y0,y1,y2,y3,y4,y5,y6,y7); input s1,s2,s3,a0,a1,a2; output reg y0,y1,y2,y3,y4,y5,y6,y7; always @(s1 or s2 or s3 or a0 or a1 or a2) begin if((~s1)|(~(s2&s3))) {y7,y6,y5,y4,y3,y2,y1,y0}=7'b11111111; if(s1&(s2&s3)) begin case({a2,a1,a0}) 3'b000:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b11111110; 3'b001:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b11111101; 3'b010:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b11111011; 3'b011:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b11110111; 3'b100:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b11101111; 3'b101:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b11011111; 3'b110:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b10111111; 3'b111:{y7,y6,y5,y4,y3,y2,y1,y0}=7'b01111111; default:{y7,y6,y5,y4,y3,y2,y1,y0}=7'bxxxxxxxx; endcase end end endmodule

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