第一部分 逻辑设计基础
书籍的电子版链接 link
提取码:kdp2
1.逻辑设计概述及vivado基础
这部分是数电里老生常谈的问题,没什么看的;
2.布尔代数和Verilog基础
内部输入端口必须为wire型;
外部输出端口必须为wire型;
移位运算 缩减运算 位拼接运算
移位运算:>> 和 << 逻辑移位,移入的是0;
<<< 和 >>> 算术移位 ,移入是最高位标志位;
reg [15:0] ROMA [7:0] 表示位宽16位,深度为8的存储器;
reg memb[n-1:0] //表示由n个1位寄存器构成的存储器组;
reg [n-1:0] mema //一个n位的寄存器;
其中 memb不能直接全部赋值,只能指定地址;
位运算,缩减运算,逻辑运算
缩减运算举例:即与,或,异或运算只有一个操作数时
wire [3:0] a;
wire y;
assign y=|a; //代表y=a[3]|a[2]|a[1]|a[0];
位拼接运算进行循环移位
wire [7:0] a;
assign rot ={a[2:0],a[8:3]}; //循环右移3位
assign rot1={3'b000,a[8:3]}; // 右移3位,插入0
assign rot2 ={3a[8],a[8:3]}; //右移3位,插入3个a[8]
位宽调整机制
位宽调整机制:
assign sum1 = (a+b)>>1; //a b都是8位的加法的溢出位直接舍弃
assign sum2 = (0+a+b)>>1; //verilog中0是32位的0,括号中的加法结果是32位,
//先移位将最低位移出,再截断8位
3.组合逻辑电路设计基础
阻塞/非阻塞赋值
阻塞赋值:在执行下一条语句前,一个表达式只能赋给一个数据类型的值,赋值阻断了其他语句的执行;
非阻塞赋值:表达式的值在always块结束时进行赋值;
赋值语句
过程赋值语句:
y=a;
y=y&b;
y=y&c;
持续赋值语句:
assign y=a;
assign y=y&b;
assign y=y&c;
我理解的是持续赋值,不会被后续的赋值所覆盖;过程赋值会被覆盖;
initial块:只执行一次,多用于TB文件里面的初始化语句,用来产生测试环境和设置信号记录;
always块:不断重复的活动着,直到仿真结束;
循环语句
for循环
和我们C语言中的for循环一样,注意循环体中是顺序执行的;
repeat语句
将一条语句执行多次;
repeat(8)
begin
...
...
end
将块内的语句执行8次;
while语句
同C语言中while语句的用法;
forever语句
一般用在initial块中,产生周期性的波形,作为仿真激励信号;
verilog实例
//test1 8位2进制数相乘
module 8bit_mul{
input [8:1] op1;
input [8:1] op2;
output reg [16:1] result;
}
integer i; //循环变量
always@(*)
result =0;
for(i=1;i<=8;i++)begin
if(op1[i])
result = result + (op0<<(i-1));
end
endmodule
组合电路意外综合出内部存储单元(latch)的原因以及解决方法:
组合电路中变量如果没有赋值将会一直保持原来的值,在if else语句或者case语句中,没有全部赋值完全,则会综合出锁存器;
解决方法:一个是在任务开始前给变量赋初值;另一个则是用else或者default语句全部赋值;
设计实例
多路选择器(multiplexer)
module multiplexer(
input in0,in1,in2,in3,
input s1,
input s0,
output reg out //为什么要用reg型
);
always@(*)begin
case({s1,s0})
2'b00:
out=in0;
2'b01:
out=in1;
2'b10:
out=in2;
2'b11:
out=in3;
endcase
end
endmodule
还有一些简单的比较器什么之前刷HDLBits的时候都写过,就不在重复;
4 时序逻辑电路设计基础
触发器和锁存器(Flip_flop And Latch)
D触发器
在clk的上升沿到达时发生变化,并存储在触发器中;输入信号只在时钟的上升沿进行采样,值的变化不会立刻相应;还可以在D触发器上添加使能和复位信号;构成其他的触发器;
同步信号:信号的变化受到CLK的约束,即使输入信号发生了变化,这种变化所带来的的响应,只有在CLK的跳变沿才会转化成响应;
异步信号:不受CLK的约束,输入信号的改变会立刻得到响应;
锁存器
电平触发锁存器,即只有信号保持在一个高电平或者低电平的期间,信号的变化才有效;
触发器和锁存器的区别:一个时钟沿驱动,一个是电平驱动;
寄存器
在D触发器的基础上增加一个load信号,在需要的时候将值取出;
移位寄存器和计数器都比较简单,一带而过;
实例:数码管显示秒表
这个之前写过数码管秒表
5.FSM–Finite State Machine(有限状态机)设计
之前有写过有限状态机
6 逻辑设计工程技术基础
抖动:实际应用中的信号,比如是1us一个周期,每500ns一个时钟跳变沿,但在实际中可能不会这么准确,学术上定义为,高速串行信号边沿到来时刻与理想值的偏差。
竞争与冒险:一个信号经过多条传输途径,输出之后的顺序有前有后,称为竞争,竞争带来的毛刺称为冒险。
亚稳态:同步系统中,不满足建立时间,保持时间,触发器输出端在0和1之间状态不确定。
组合逻辑毛刺的处理:添加选通信号,让门网络只在选通信号作用期间有效;
异步时序电路竞争问题:当异步时序电路在状态变化的瞬间,有多个变量同时发生改变,则此异步电路存在竞争问题,
临界竞争:若电路存在竞争问题,且最终态与变量的变化次序有关,则此竞争为临界竞争;此异步电路就会出现毛刺;
由于电路写的太少,对于此部分不能生深刻的理解,决定先去做一部分项目之后,再来完善
未完待续。。。。。