一、数字技术基础
1.数制与编码
R进制到 十进制
按权展开
十进制到R进制
不断整除,直到商为0,将余数取倒序
注意:当位数不够时,只能往远离小数点的方向补0
常用编码
BCD码
8421/5421/2421(大于4的数首位为1)/余三码(8421码+3)
循环码/格雷码
相邻两相邻数所对应的循环码只有一位不同
校验码
最高位为检验位,分奇校验码和偶校验码
2.逻辑代数
逻辑运算
与运算:P=A·B / A /\ B / AB (注意第二种写法)
或运算:P= A+B / A / B
非运算
以及衍生的相关复合运算 如同或运算(O里·)、异或运算(O里+)
逻辑函数
基本形式: F=f(A,B,C)
最简式求解
1.利用代数基本定理与规则
交换律、结合律略
分配律:A+BC = (A+B)(A+C)
反演律:~(A+B)= (~A) \/(~B)
反演规则,F -> ~F
对偶规则 F = G --> F* = G*(不改变原变量和反变量)
常用公式:A+(~A)B = A+B 、AB+(~A)C+BC = AB+(~A)C
2.利用卡诺图、圈最大卡诺圈
最小项:形如ABC,任意两最小项乘积为0
最大项:形如A+B+C,任意两最大项和为1
编码规则
使最小项取值为1的输入为最小项的编码,使最大项取值为0的输入为最大项的编码
在此规则下有:
~(m_i)的编码 == M_i(重要)
且由于F输出要么为0,要么为1,
故一个逻辑函数中标准与-或式中最小项编号和标准或-与式中最大项编号是互补的
按循环码作卡诺图
1、注意事项
注意图中不相邻,但可能逻辑相邻,如四角或边缘,以确保圈出最大卡诺圈
卡诺图既可以化简最简与-或式(圈1合并),也可以化简最简或-与式(圈0合并)
2.含任意项
可指定任意项(正常输入不会出现的编码)为任意值,以简化逻辑函数
二、Verilog语法基础
1、代码的基本结构
端口说明->端口reg类型说明(可与第一步写一起)->
内部信号说明(reg,wire)说明部分
实例元件或模块(门级)、assign(数据流描述),always/initial(过程流描述) 功能描述部分
module half_adder(A,B,S,C);
input A,B;
output S,C;
reg S,C;
---
上面可写成
module half_adder(input A, input B, output reg S, output reg C);
---
always@(A or B)
begin
case ({A,B})
2 'b00: begin S=0;C=0;end
...
end
endmodule
注意事项:
除了endmodule语句外,都要以分号结束
过程块内部如有多条语句,一定要写在begin end 间
多个实例化引用、多个assign语句、多个always之间均是并行
Verilog基本词法
合法标识符
第一个字母是英文字母或下划线,内部可以有’$'符号 区分大小写
'\a+3*b’也是合法转义标识符
且不能是保留字,如buf,bufif0 time inout等
常量
逻辑常量
0 1 x z 实际电路中没有x态,但有z态(高阻态)
数值常量
数字常量
<-><位宽><`进制><数值> 注意负号的位置
字符串常量
initial块里赋值为寄存器
参数常量
类似于宏定义
变量
wire形 作输入输出 / assign赋值作中间连线
reg形 存储器,可非阻塞赋值
memory形: reg memB[3:0]
integer形:32位有符号二进制数,主要用于循环变量
运算符
- 取模运算:结果与被除数符号一致
- 逻辑运算:只要一个操作数为x,返回值就为1’bx
- 关系运算符同上
- 等值运算符:‘==’同上, ’ === '同时比较是否均为x或z
- 移位运算:逻辑移位
- 缩减运算:各位按位运算方法运算
- 拼接运算:{3{1’b0},{a[1:0]}}
- 三目运算
Verilog基本句法
1、过程块语句
always 块 / initial 块
敏感事件列表用 or
或 ,
分隔,可以是变量或信号名
begin
和 end
里顺序执行
里面的赋值语句称为过程赋值语句,用“=”或“<=”实现,“<=”表示与其他赋值语句并行(非阻塞)
过程赋值语句只能赋给reg型
if 语句
case 语句
循环语句
2.模块化电路
module调用/实例化
- 按声明顺序传参
- 按
".端口名(参数)
的格式传参
task 和 function
必须出现在模块内部,但可在模块的任意位置
function
输入变量只能是 input
形
function [7:0] rsword8; // 函数名即返回的寄存器 [7:0]说明寄存器类型
input [7:0] word8;
...
endfunction
task
可以不返回值,或通过output端口返回多个值
task example;
input din,s;
output reg d0,d1;
...
endtask