verilog3(1)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章 Verilog HDL硬件描述语言
3.1 3.2 3.3 3.4 3.5 3.6 3.7 Verilog HDL概述 Verilog HDL语言要素 Verilog HDL基本语句 Verilog HDL门元件和结构描述 仿真验证 可综合性描述 设计实例
3.3 Verilog HDL基本语句
值1 : 块语句1; 值2 : 块语句2; … 值n : 块语句n; default : 块语句n+1; endcase
module decode4_7(dout, ind); output [6:0] dout;
case (ind) 4'd0 : dout = 7'b1111110; 4'd1 : dout = 7'b0110000; 4'd2 : dout = 7'b1101101; 4'd3 : dout = 7'b1111001; 4'd4 : dout = 7'b0110011; 4'd5 : dout = 7'b1011011; 4'd6 : dout = 7'b1011111; 4'd7 : dout = 7'b1110000; 4'd8 : dout = 7'b1111111; 4'd9 : dout = 7'b1111011; default : dout = 7'bx; endcase
赋值语句
连续赋值语句
assign
赋值对象
线型变量(标量或矢量) 线型变量(矢量)中的某一位 线型变量(矢量)中的某几位
过程赋值语句 =, <=
寄存器型变量(标量或矢量) 寄存器变量(矢量)中的某一位 寄存器变量(矢量)中的某几位 存储器
4.1.1 assign连续赋值语句
用于对wire型变量进行赋值。
else if(表达式2) 块语句2;
else if(表达式3) 块语句3;
…
else if(表达式n) 块语句n;
else
块语句n+1;
第一种情况,如果条件表达式成立(即表达式的值为1 时),执行后面的块语句1;当条件表达式不成立(即 表达式的值为0,x,z)时,停止执行块语句1,此时 会形成锁存器,保存块语句1的执行结果。 第二种情况,如果条件表达式不成立,执行块语句2。 这样,在硬件电路上通常会形成多路选择器
for
11.
for (i=0; i<=6; i=i+1) if (vote[i] ) sum=sum+1;
12. if (sum[2]) pass=1; 13. else pass=0; 14. end 15.endmodule
3.3.1 赋值语句Assignments
赋值语句是Verilog HDL中对线型和寄存器型变量赋值,分为 连续赋值语句和过程赋值语句。 (1) 赋值过程实现方式不同:线型变量被连续赋值语句赋值 后是实时;过程赋值语句只有在语句被执行到时,才能够 进行赋值。 (2) 语句出现的位置不同:连续赋值语句不能够出现在任何 一个过程块中;过程赋值语句只能够出现在过程块中。 (3) 语句结构不同:连续赋值语句以关键词assign为先导; 过程赋值语句不需要任何先导的关键词,但是,语句的赋 值分为阻塞型和非阻塞型。
for (i=0; i<=6; i=i+1)
例 采 用 语 句 描 述 的 七 人 投 票 器
1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
module vote(pass , vote); input [6:0] vote; output pass; reg pass; reg [2:0] sum; integer i; always @ (vote) begin sum=0;
阻塞型赋值语句与非阻塞型赋值语句的比较
1 0 0 a b 10 D Q
in
D Q
CLK
clk 0 in
阻塞型赋值语句
c D Q d
010
clk
CLK
CLK
非阻塞型赋值语句
3.3.2
条件语句(Conditional statement)
1. if-else语句 Verilog HDL语言共提供了3种形式的if-else语句。 (1)if(表达式) 块语句1; (2)if(表达式) 块语句1; else (3)if 块语句2; (表达式1) 块语句1;
第三种情况,依次检查表达式是否成立,根据表达式 的值判断执行的块语句。由于if-else的嵌套,需要注 意if与else的配对关系,以免设计错误。
if (reset) qout<=0;
module count60(qout, cout, else if(load) qout<=data; data, load, cin, reset, clk); else if(cin) output [7:0] qout; begin
// example for casex casex (encoder) 4'b1xxx : high_d=3; 4'b01xx : high_d=2; 4'b001x : high_d=1; 4'b0001 : high_d=0; default : high_d=0; 1. endcase
case语句的 使用示例
if(qout[3:0]==9) begin qout[3:0]<=0; if (qout[7:4]==5) qout[7:4]<=0 ; else qout[7:4]<=qout[7:4]+1; end else qout[3:0]<=qout[3:0]+1; end
2
case语句
case语句构成了一个多路条件分支的结构,用 于逻辑电路的真值表描述,如译码器、数据选择器、 状态机等。3种形式的case语句。 (1) case(敏感表达式)
3.3.3 循环语句
Verilog HDL中存在4种类型的循环语句, 可以控制语句的执行次数。分别是:
for语句 repeat语句 while语句 forever语句
1. for 语句
与C语言完全相同,for语句的描述格式为:
for
( 循环变量赋初值;循环条件;循环变量增值 )
块语句; 即在第一次循环开始前,对循环变量赋初值;循环 开始后,判断初值是否符合循环结束条件,如果不 符合,执行块语句,然后给循环变量增值;再次判 断是否符合循环结束条件,如果符合循环结束条件, 循环过程终止。
out2 = in1 & in2;
阻塞型赋值语句与非阻塞型赋值语句的比较
1. module block_nonblock (dataout_a, dataout_b,dataout_c, dataout_d, data_in, clock ); 2. input data_in,clock; 3. output dataout_a, dataout_b; 4. output dataout_c, dataout_d; 5. reg dataout_a, dataout_b; 6. reg dataout_c, dataout_d; 7. 8. always @(posedge clock) //block assignment 9. begin 10. dataout_a = data_in; 11. dataout_b = dataout_a; 12. end
4.1.2
过程赋值语句
用于对寄存器类变量赋值,没有任何先导的关键词,而 且只能够在always语句或initial语句的过程块中赋值。 其基本的描述语法为:
1) <寄存器型变量> = <表达式> ; // 阻塞型过程赋值 2) <寄存器型变量> <= <表达式> ; // 非阻塞性过程赋值
采用阻塞型过程赋值方式的描述: // 过程赋值语句 always @( in1 or in2 )
第三种(casex)则扩充为,如果给定的值中有某 一位(或某几位)是高阻态(z)或不定态(x), 同样认为该位为“真”,不予判断。
// example for casez casez (encoder) 4'b1??? : high_d=3; 4'b01?? : high_d=2; 4'b001? : high_d=1; 4'b0001 : high_d=0; default : high_d=0; endcase
3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 赋值语句(Assignments) 条件语句(Conditional statement) 循环语句 块语句(Block statements) 结构化语句(Structured procedures) 任务与函数
阻塞型赋值语句与非阻塞型赋值语句的比较
13. always @(posedge clock) //nonblock assignment 14. begin 15. dataout_c <= data_in; 16. dataout_d <= dataout_c; 17. end 18. 19. endmodule
描述语法为:
assign #[delay] <线型变量> = <表Biblioteka Baidu式> ;
delay是门延时
例 四位加法器的verilog的描述:
例 四位加法器的verilog的描述:
module adder (sum_out, carry_out, carry_in, ina, inb); 1. 2. output [3:0] sum_out; 3. output carry_out; 4. 5. input [3:0] ina, inb; 6. input carry_in; 7. 8. wire carry_out, carry_in; 9. wire [3:0] sum_out, ina, inb; 10. 11. assign {carry_out, sum_out} = ina + inb + carry_in; 12. endmodule
3.3 Verilog HDL基本语句
Verilog HDL可以用于仿真、综合的语 句只是HDL语言的一个子集。不同的仿 真器、综合器支持的HDL语句集不同。
Verilog HDL的语句包括:
(1) 赋值语句Assignments 连续赋值语句(Continuous assignments) 过程赋值语句(Procedural assignments) (2) 条件语句(Conditional statement) if-else,case (3) 循环语句 for ,repeat,while,forever (4) 语句块语句(Block statements) 串行块(begin-end) 并行块(fork-join) (5) 结构化语句(Structured procedures) initial语句 always语句 (6)task任务和function函数
output cout; input [7:0] data;
input load, cin, clk, reset; reg [7:0] qout; always @(posedge clk) begin
…
end
assign cout=((qout==8'h59)&cin) ?1:0; endmodule
input [3:0] ind; reg [6:0] dout;
always @ ( ind ) begin … end endmodule
casez
值1: 值2:
…
,casex
块语句1; 块语句2; 块语句n;
(2) casez(敏感表达式)
值n:
default: 块语句n+1; endcase (3) casex(敏感表达式) 值1:块语句1;
值2:块语句2;
…
值n: 块语句n; default: 块语句n+1;
endcase
这三种语句的描述方式唯一的区别就是对敏感表达式的 判断,其中: 第一种要求敏感表达式的值与给定的值1、值 2,……,或值n中的一个全等时,执行后面相应的 块语句;如果均不等时,执行default语句。
第二种(casez)则认为,如果给定的值中有某一 位(或某几位)是高阻态(z),则认为该位为 “真”,敏感表达式与其比较时不予判断,只需比 较其他位。
3.1 3.2 3.3 3.4 3.5 3.6 3.7 Verilog HDL概述 Verilog HDL语言要素 Verilog HDL基本语句 Verilog HDL门元件和结构描述 仿真验证 可综合性描述 设计实例
3.3 Verilog HDL基本语句
值1 : 块语句1; 值2 : 块语句2; … 值n : 块语句n; default : 块语句n+1; endcase
module decode4_7(dout, ind); output [6:0] dout;
case (ind) 4'd0 : dout = 7'b1111110; 4'd1 : dout = 7'b0110000; 4'd2 : dout = 7'b1101101; 4'd3 : dout = 7'b1111001; 4'd4 : dout = 7'b0110011; 4'd5 : dout = 7'b1011011; 4'd6 : dout = 7'b1011111; 4'd7 : dout = 7'b1110000; 4'd8 : dout = 7'b1111111; 4'd9 : dout = 7'b1111011; default : dout = 7'bx; endcase
赋值语句
连续赋值语句
assign
赋值对象
线型变量(标量或矢量) 线型变量(矢量)中的某一位 线型变量(矢量)中的某几位
过程赋值语句 =, <=
寄存器型变量(标量或矢量) 寄存器变量(矢量)中的某一位 寄存器变量(矢量)中的某几位 存储器
4.1.1 assign连续赋值语句
用于对wire型变量进行赋值。
else if(表达式2) 块语句2;
else if(表达式3) 块语句3;
…
else if(表达式n) 块语句n;
else
块语句n+1;
第一种情况,如果条件表达式成立(即表达式的值为1 时),执行后面的块语句1;当条件表达式不成立(即 表达式的值为0,x,z)时,停止执行块语句1,此时 会形成锁存器,保存块语句1的执行结果。 第二种情况,如果条件表达式不成立,执行块语句2。 这样,在硬件电路上通常会形成多路选择器
for
11.
for (i=0; i<=6; i=i+1) if (vote[i] ) sum=sum+1;
12. if (sum[2]) pass=1; 13. else pass=0; 14. end 15.endmodule
3.3.1 赋值语句Assignments
赋值语句是Verilog HDL中对线型和寄存器型变量赋值,分为 连续赋值语句和过程赋值语句。 (1) 赋值过程实现方式不同:线型变量被连续赋值语句赋值 后是实时;过程赋值语句只有在语句被执行到时,才能够 进行赋值。 (2) 语句出现的位置不同:连续赋值语句不能够出现在任何 一个过程块中;过程赋值语句只能够出现在过程块中。 (3) 语句结构不同:连续赋值语句以关键词assign为先导; 过程赋值语句不需要任何先导的关键词,但是,语句的赋 值分为阻塞型和非阻塞型。
for (i=0; i<=6; i=i+1)
例 采 用 语 句 描 述 的 七 人 投 票 器
1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
module vote(pass , vote); input [6:0] vote; output pass; reg pass; reg [2:0] sum; integer i; always @ (vote) begin sum=0;
阻塞型赋值语句与非阻塞型赋值语句的比较
1 0 0 a b 10 D Q
in
D Q
CLK
clk 0 in
阻塞型赋值语句
c D Q d
010
clk
CLK
CLK
非阻塞型赋值语句
3.3.2
条件语句(Conditional statement)
1. if-else语句 Verilog HDL语言共提供了3种形式的if-else语句。 (1)if(表达式) 块语句1; (2)if(表达式) 块语句1; else (3)if 块语句2; (表达式1) 块语句1;
第三种情况,依次检查表达式是否成立,根据表达式 的值判断执行的块语句。由于if-else的嵌套,需要注 意if与else的配对关系,以免设计错误。
if (reset) qout<=0;
module count60(qout, cout, else if(load) qout<=data; data, load, cin, reset, clk); else if(cin) output [7:0] qout; begin
// example for casex casex (encoder) 4'b1xxx : high_d=3; 4'b01xx : high_d=2; 4'b001x : high_d=1; 4'b0001 : high_d=0; default : high_d=0; 1. endcase
case语句的 使用示例
if(qout[3:0]==9) begin qout[3:0]<=0; if (qout[7:4]==5) qout[7:4]<=0 ; else qout[7:4]<=qout[7:4]+1; end else qout[3:0]<=qout[3:0]+1; end
2
case语句
case语句构成了一个多路条件分支的结构,用 于逻辑电路的真值表描述,如译码器、数据选择器、 状态机等。3种形式的case语句。 (1) case(敏感表达式)
3.3.3 循环语句
Verilog HDL中存在4种类型的循环语句, 可以控制语句的执行次数。分别是:
for语句 repeat语句 while语句 forever语句
1. for 语句
与C语言完全相同,for语句的描述格式为:
for
( 循环变量赋初值;循环条件;循环变量增值 )
块语句; 即在第一次循环开始前,对循环变量赋初值;循环 开始后,判断初值是否符合循环结束条件,如果不 符合,执行块语句,然后给循环变量增值;再次判 断是否符合循环结束条件,如果符合循环结束条件, 循环过程终止。
out2 = in1 & in2;
阻塞型赋值语句与非阻塞型赋值语句的比较
1. module block_nonblock (dataout_a, dataout_b,dataout_c, dataout_d, data_in, clock ); 2. input data_in,clock; 3. output dataout_a, dataout_b; 4. output dataout_c, dataout_d; 5. reg dataout_a, dataout_b; 6. reg dataout_c, dataout_d; 7. 8. always @(posedge clock) //block assignment 9. begin 10. dataout_a = data_in; 11. dataout_b = dataout_a; 12. end
4.1.2
过程赋值语句
用于对寄存器类变量赋值,没有任何先导的关键词,而 且只能够在always语句或initial语句的过程块中赋值。 其基本的描述语法为:
1) <寄存器型变量> = <表达式> ; // 阻塞型过程赋值 2) <寄存器型变量> <= <表达式> ; // 非阻塞性过程赋值
采用阻塞型过程赋值方式的描述: // 过程赋值语句 always @( in1 or in2 )
第三种(casex)则扩充为,如果给定的值中有某 一位(或某几位)是高阻态(z)或不定态(x), 同样认为该位为“真”,不予判断。
// example for casez casez (encoder) 4'b1??? : high_d=3; 4'b01?? : high_d=2; 4'b001? : high_d=1; 4'b0001 : high_d=0; default : high_d=0; endcase
3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 赋值语句(Assignments) 条件语句(Conditional statement) 循环语句 块语句(Block statements) 结构化语句(Structured procedures) 任务与函数
阻塞型赋值语句与非阻塞型赋值语句的比较
13. always @(posedge clock) //nonblock assignment 14. begin 15. dataout_c <= data_in; 16. dataout_d <= dataout_c; 17. end 18. 19. endmodule
描述语法为:
assign #[delay] <线型变量> = <表Biblioteka Baidu式> ;
delay是门延时
例 四位加法器的verilog的描述:
例 四位加法器的verilog的描述:
module adder (sum_out, carry_out, carry_in, ina, inb); 1. 2. output [3:0] sum_out; 3. output carry_out; 4. 5. input [3:0] ina, inb; 6. input carry_in; 7. 8. wire carry_out, carry_in; 9. wire [3:0] sum_out, ina, inb; 10. 11. assign {carry_out, sum_out} = ina + inb + carry_in; 12. endmodule
3.3 Verilog HDL基本语句
Verilog HDL可以用于仿真、综合的语 句只是HDL语言的一个子集。不同的仿 真器、综合器支持的HDL语句集不同。
Verilog HDL的语句包括:
(1) 赋值语句Assignments 连续赋值语句(Continuous assignments) 过程赋值语句(Procedural assignments) (2) 条件语句(Conditional statement) if-else,case (3) 循环语句 for ,repeat,while,forever (4) 语句块语句(Block statements) 串行块(begin-end) 并行块(fork-join) (5) 结构化语句(Structured procedures) initial语句 always语句 (6)task任务和function函数
output cout; input [7:0] data;
input load, cin, clk, reset; reg [7:0] qout; always @(posedge clk) begin
…
end
assign cout=((qout==8'h59)&cin) ?1:0; endmodule
input [3:0] ind; reg [6:0] dout;
always @ ( ind ) begin … end endmodule
casez
值1: 值2:
…
,casex
块语句1; 块语句2; 块语句n;
(2) casez(敏感表达式)
值n:
default: 块语句n+1; endcase (3) casex(敏感表达式) 值1:块语句1;
值2:块语句2;
…
值n: 块语句n; default: 块语句n+1;
endcase
这三种语句的描述方式唯一的区别就是对敏感表达式的 判断,其中: 第一种要求敏感表达式的值与给定的值1、值 2,……,或值n中的一个全等时,执行后面相应的 块语句;如果均不等时,执行default语句。
第二种(casez)则认为,如果给定的值中有某一 位(或某几位)是高阻态(z),则认为该位为 “真”,敏感表达式与其比较时不予判断,只需比 较其他位。