《搭建你的数字积木 数字电路与逻辑设计》(1)


书籍的电子版链接 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之间状态不确定。
组合逻辑毛刺的处理:添加选通信号,让门网络只在选通信号作用期间有效;
异步时序电路竞争问题:当异步时序电路在状态变化的瞬间,有多个变量同时发生改变,则此异步电路存在竞争问题,
临界竞争:若电路存在竞争问题,且最终态与变量的变化次序有关,则此竞争为临界竞争;此异步电路就会出现毛刺;

由于电路写的太少,对于此部分不能生深刻的理解,决定先去做一部分项目之后,再来完善
未完待续。。。。。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
相同数字积木在Python中,是通过使用一个变量来存储该数字的值,并且可以通过对这个变量进行操作来实现对积木的建造、拆卸和改变。首先,我们可以创建一个变量来存储这个数字,比如可以命名为"num"。然后,我们可以使用不同的数据结构来表示积木的形式,比如使用一个列表来表示一堆积木。例如,我们可以创建一个列表来存储多个相同数字积木,比如[1, 1, 1, 1]。这样,我们就可以通过索引来访问和操作其中的积木。 例如,我们可以通过添加一个新的数字到列表中来建造新的积木,比如在列表的末尾添加一个新的数字1,可以使用append()函数实现:num.append(1)。这样,列表的内容就变成了[1, 1, 1, 1, 1],表示有5个相同数字积木。 如果我们想要拆除一个积木,可以使用pop()函数实现,比如num.pop()。这样,列表中最后一个积木就会被移除,列表的内容变成了[1, 1, 1, 1]。 如果我们想要改变一个积木的值,可以通过修改列表中对应位置的值来实现,比如将列表中第二个积木的值改为2,可以使用赋值操作,例如num[1] = 2。这样,列表的内容变成了[1, 2, 1, 1]。 通过这些操作,我们可以根据需要来建造、拆除和改变相同数字积木。无论是建造、拆除还是改变积木的值,我们都可以通过对变量进行操作来实现,这就是Python中最远的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值