数字系统设计与verilog_HDL_王金明_第四版__EDA期末知识点复习(宁波工程学院电科版)
1、采用硬件描述语言(HDL)进行电路设计的优势。
1)更适合用于描述规模大、功能复杂的数字系统
2)语言标准化、便于设计的复用、交流、保存和修改
3)设计与工艺的无关性,宽范围的描述能力,便于组织大规模、模块化的设计
2、Verilog模块的结构
模块声明:包括模块名字、模块输入、输出端口列表,结束关键字为endmodule
端口定义:格式为:input: 端口名1,端口名2…端口名n;
output: 端口名1,端口名2…端口名n;
inout: 端口名1,端口名2…端口名n;
3、标识符是用户在编程时给verilog对象起的名字,模块、端口和实例的名字都是标识符。标识符可以是任意一组字母、数字以及符
号“$”和“_”的组合,但标识符的第一个字符必须是字母(a-z,A-Z)或者是下划线“_”,标识符最长可包含1023个字符,此外,标识符区分大小写。
4、整数写法:+/-’
1、在较长的数之间可用下划线分开
2、当数字不说明位宽时,默认值为32位
3、 X或(z)在二进制中代表1位x(或z),在八进制中代表3位,在16进制中代表4位
4、如果没有定义一个整数的位宽,其宽度为相应值中定义的位数。
5、如果定义的位宽比实际的位数长,通常在左边填0补位,但如果最左边一位为x或z,就相应的用x或z左边补位。
6、 “?”是高阻态z的另一种表示符号,在数字的表示中,字符“?”和z 是完全等价的,可相互代替。
7、整数可以带符号,并且正负号应写在最左边,负数通常表示为二进制补码的形式。
8、当位宽与进制缺省时表示的是10进制数
9、在位宽和‘之间,以及进制和数值之间允许出现空格,但’和进制之间以及数值之间是不能出现空格的。
要求掌握整数正确的书写方式。
5、向量:宽度大于1位的变量;
标量:宽度为1位的变量。
定义2个8位reg型矢量:reg [7:0] ra, rb;
6、运算符
(1)注意:逻辑运算符,例如逻辑与&&、逻辑或||、逻辑非!,运算结
果是1位的。如果操作数不止1位的话,则应将操作数作为一个整体来对待,即如果操作数全是0,则相当于逻辑0,但只要某一位是1,则操作数就应该整体看作逻辑1。
例如:若A = 4’b0000, B = 4’b0101,则有:
A &&
B = 0;
(2)位拼接运算符:{ }将两个或多个信号的某些位拼接起来
7、initial语句和always语句的区别:initial语句常用于仿真中的初始化,initial过程块中的语句只执行一次,不带触发条件;always块内的语句则是不断重复执行的,Always过程语句是可综合的,带有触发条件。
8、posedge:上升negedge:下降
弄清楚同步和异步的概念。
例如:如果Nreset和Nset是异步,时钟clock上升沿触发。
always @(posedge clk or posedge rst_n )
if (! rst_n ) Q<=0;
else if(Nset) Q<=1;
else Q<=D;
9、阻塞赋值与非阻塞赋值的区别:非阻塞赋值在整个过程块结束时才完成赋值操作;阻塞赋值在该语句结束时就立即完成赋值操作。在always过程块中,阻塞赋值可以理解为赋值语句是顺序执行的,而非阻塞赋值可以理解为赋值语句是并发执行的.
10、条件语句,条件语句也称分支语句。
11、顺序执行:阻塞赋值语句;
并发执行:非阻塞赋值语句。
12、用行为语句设计一个8位计数器,每次在时钟的上升沿,计数器加1,当计数器逸出时,自动从零开始重新计数。计数器有同步复位端。module count(count,reset,clk);
input clk,reset;
output clk,reset;
output [7:0] count;
reg count;
always @(posedge clk)
if(reset==1)
begin
count=8'b0;
end
else if (count=8'b11111111)
begin
count=9'b0;
end
else if
begin
count=count+1;
end
end module
13奇偶校验位产生器的Verilog HDL描述:
module parity(evrn_bit,odd_bit,a);
input[7:0] a; output even_bit,odd_bit;
assign even_bit=^a; //生成偶校验位
assign odd_bit=~even_bit; //生成奇校验位endmodule;
14、课本197页:8.2 有限状态机的Verilog描述
参考例8.3,例8.7,学会用有限状态机设计序列检测器。module fsm_seq1111(x,z,clk,reset);
input x,clk,reset;
output reg z;
reg[4:0] state;
parameter S0=’d0,S1=’d1,S2=’d2,S3=’d3,S4=’d4; always @(posedge clk)
begin if(reset) begin state<=S0;z<=0; end
else casex(state)
S0: begin if(x==0) begin state<=S0;z<=0;end else begin state<=S1;z<=0;end end
S1: begin if(x==0) begin state<=S0;z<=0;end else begin state<=S2;z<=0;end end
S2: begin if(x==0) begin state<=S0;z<=0;end else begin state<=S3;z<=0;end end
S3: begin if(x==0) begin state<=S0;z<=0;end else begin state<=S4;z<=1;end end
S4: begin if(x==0) begin state<=S0;z<=0;end else begin state<=S4;z<=1;end end
default: state<=S0;
endcase
end
endmodule
15、状态机设计流水灯:
module led_water(clk50M,rst,led);
input clk50M;
output[7:0] led;
input rst;
wire clk_5hz;
reg[7:0] led_r;
reg[3:0] state;
reg[23:0] count;
parameter s0='d0,s1='d1,s2='d2,s3='d3,
s4='d4,s5='d5,s6='d6,s7='d7,
s8='d8,s9='d9,s10='d10,s11='d11,
s12='d12,s13='d13,s14='d14,s15='d15;
always @(posedge clk50M)
begin
if(count==10000000)
begin count<=1'b0;end
else
宁波学编程哪里好count<=count+1'b1;
end
assign clk_5hz=count[23];
assign led=led_r;
always @(posedge clk_5hz)
begin
if(!rst) state=s0;
else case(state)
s0: begin led_r=8'b01111111; state<=s1;end s1: begin led_r=8'b10111111; state<=s2;end s2: begin led_r=8'b11011111; state<=s3;end s3: begin led_r=8'b11101111; state<=s4;end s4: begin led_r=8'b11110111; state<=s5;end s5: begin led_r=8'b11111011; state<=s6;end s6: begin led_r=8'b11111101; state<=s7;end s7: begin led_r=8'b11111110; state<=s8;end s8: begin led_r=8'b11111100; state<=s9;end