数电第7周周结_by_yc
一、通用双向移位寄存器:
- 功能描述:
4位的双向移位寄存器,含控制输入端(ctrl)、串行输入端(Dsl、Dsr)、4个并行输入端和4个并行输出端,要求实现5种功能:异步置零、同步置数、左移、右移和保持原状态不变,功能如下:
.center { width: auto; display: table; margin-left: auto; margin-right: auto }
ctrl | action |
---|---|
00 | 保持 |
01 | 右移 |
10 | 左移 |
11 | 并行输入 |
- 设计方案:
①异步置零:复位信号需放入敏感列表;
②优先级:reset>ctrl;
③ctrl的多方案可以用case来完成 - 关键代码:
always@(posedge clk or negedge reset) begin
if(~reset)
Dout <= 4'b0000; //Asynchronous zero setting
else begin
case(ctrl)
2'b00: Dout <= Dout; //remain
2'b01: Dout <= {Dsr, Dout[3:1]}; //shift right
2'b10: Dout <= {Dout[2:0], Dsl}; //Shift left
2'b11: Dout <= Din; //Parallel input
endcase
end
end
- 仿真验证:
分别控制实现保持、右移、左移和并行输入。
initial begin
clk=0;
forever #10 clk=~clk;
end
initial begin
reset=0; Dsl=0; Dsr=1; ctrl=2'b00; Din=4'b1111;
#100 reset=1; Dsl=0; Dsr=1; ctrl=2'b01; Din=4'b1111;
#100 reset=1; Dsl=0; Dsr=0; ctrl=2'b10; Din=4'b1111;
#100 reset=1; Dsl=0; Dsr=0; ctrl=2'b11; Din=4'b0001;
#100 $stop;
end
输出波形如下图所示,符合题意。
- 综合结果:
- 总结反思:
看好模块名称!!!
二、带控制组的触发器组:
功能描述:
16位D触发器,以byteena来控制寄存器的高低字节是否被写入。byteena[1]控制高字节d[15:8],而byteena[0]控制低字节d[7:0].resetn是低电平有效的同步复位信号.所有DFF由时钟的上升沿触发.设计方案:
①普通的16位同步复位D触发器,resetn不在敏感列表中
②优先级:reset>byteena;
③byteena的多方案可以用case来完成关键代码:
always @(posedge clk) begin
if(~resetn)
q <= 16'b0000000000000000;
else begin
case(byteena)
2'b00: q <= q;
2'b01: q <= {q[15:8],d[7:0]};
2'b10: q <= {d[15:8],q[7:0]};
2'b11: q <= d;
endcase
end
end
- 仿真验证:
依次设计进行:不赋值、低位赋值、高位赋值、全部赋值
initial begin
clk=0;
forever #10 clk=~clk;
end
initial begin
resetn=1; byteena=2'b00; d=16'b1010101111001101;
#100 resetn=1; byteena=2'b01; d=16'b1010101111001101;
#100 resetn=1; byteena=2'b10; d=16'b1010101111001101;
#100 resetn=1; byteena=2'b11; d=16'b1010101111001101;
#100 resetn=0;
#100 $stop;
end
如图,在第一个大周期内,输出悬空,未赋值;第二个时钟周期内,完成了低位赋值,高位悬空;三四周期依次完成了高位赋值和全赋值,符合题意。
- 综合结果:
三、算数左右移:
- 功能描述:
64位算术移位寄存器,具有同步load数据功能,具体移位由ctrl控制,由下表所示:
.center { width: auto; display: table; margin-left: auto; margin-right: auto }
ctrl | action |
---|---|
00 | 算术左移1位 |
01 | 算术左移8位 |
10 | 算术右移1位 |
11 | 算术右移8位 |
- 设计方案:
①算术右移时,需要复制最高位,可以通过拼接运算符来完成;算术左移同逻辑左移
②优先级:load>ena>ctrl;
③ctrl的多方案可以用case来完成 - 关键代码:
always@(posedge clk) begin
if(load)
q <= data;
else if(ena) begin
case(ctrl)
2'b00: q <= {q[62:0], 1'b0};
2'b01: q <= {q[55:0], 8'b0};
2'b10: q <= {1'b0, q[63:1]};
2'b11: q <= {8'b0, q[63:8]}; //unsigned number
endcase
end
end
- 仿真验证:
分别设计进行加载数据、算术左移1、算术左移8、算术右移1、算术右移8、不移位。
initial begin
clk=0;
forever #10 clk=~clk;
end
initial begin
load=1; ena=1; ctrl=2'b00; data=16'h1111111111111111;
#20 load=0; ena=1; ctrl=2'b01; data=16'h1111111111111111;
#20 load=0; ena=1; ctrl=2'b10; data=16'h1111111111111111;
#20 load=0; ena=1; ctrl=2'b11; data=16'h1111111111111111;
#20 load=0; ena=0; ctrl=2'b10; data=16'h1111111111111111;
end
得到对应波形如下图所示,符合预设。
- 综合结果:
- 总结分析:
拼接运算符的正确应用:q <= {{8{q[63]}}, q[63:8]}。
四、8位同步二进制加减法计数器:
功能描述:
8位同步二进制加减法计数器,输入为时钟端clk(下降沿有效)和异步清除端rstn(低电平有效),加减控制端updown,当updown为1时执行加法计数,为0时执行减法计数;输出为进位端C和8位计数输出端Q设计方案:
①异步置零:复位信号需放入敏感列表;
②优先级:rstn>updown;
③updown的多方案可以用case来完成.
④进位端C只有在从255->0时才为高电平,其余为低电平,可以将当前值是否为255作为一级判断。关键代码:
always @(negedge clk) begin
if(~rstn) begin Q <= 8'b0;C=0; end
else if(Q == 8'b11111111) begin
if(updown == 1) begin C=1; Q=8'b00000000; end
else begin C=0; Q=8'b11111110; end
end
else begin
case(updown)
1'b1: begin Q = Q + 1; C=0; end
1'b0: begin Q = Q - 1; C=0; end
endcase
end
end
- 仿真验证:
设计含加减法和255->0的testbench
initial begin
clk=0;
forever #10 clk=~clk;
end
initial begin
rstn=0; updown=1;
#20 rstn=1; updown=1;
#20 rstn=1; updown=0;
#40 rstn=1; updown=1;
#100 $stop;
end
相应的波形图如下,加减法合题意,且由255->0时,相应的进位输出为1.
- 综合结果:
五、分频器:
功能描述:
N分频时钟,50%占空比,上升沿采样,异步低电平复位,不可采用电平触发,同一敏感列表不可同时出现同一个信号的上升沿和下降沿。设计方案:
①异步复位:rstn信号出现在敏感列表中;
②因为对于奇偶性不同的N值,涉及到分别在上升沿和下降沿进行翻转,故需对N值得奇偶进行讨论:
N为偶数:
为实现能够对时钟频率进行分频,则需要对时钟的翻转次数进行计数,这里采用对时钟上升沿进行计数,cnt每加一,则说明经过了一个时钟周期,如按图中需分四倍频,则需经过两个时钟周期,进行一次反转,四倍频即为\({cnt==1}\),则进行一次翻转,推广到偶数的N,则为每逢\({cnt==(N>>1)-1}\),进行一次翻转。
N为奇数:
而奇数的特殊点在于涉及到在时钟的上升沿和下降沿分别翻转,则可将其等效为两个偶倍频的并.
如图中\({odd\_clk\_out\_1}\),\({odd\_clk\_out\_2}\),其中前者在时钟上升沿进行翻转;后者在时钟下降沿进行翻转。
同时依旧在上升沿进行计数(图上cnt有一定误差,画不到中间的部分),对于图中五倍频来说,前者在\({cnt==0|cnt==2}\)进行翻转,后者在\({cnt==1|cnt==3}\)进行翻转,
推广到奇数的N,则有前者在\({cnt==0|cnt==N>>1}\)进行翻转,后者在\({cnt==1|cnt==N>>1+1}\)进行翻转。
- 关键代码:
//even
always@(posedge clk, negedge rstn) begin
if(!rstn)
even_cnt <= 1'b0;
else if(even_cnt == (N>>1'b1)-1'b1)
even_cnt <= 1'b0;
else
even_cnt <= even_cnt + 1'b1;
end
always@(posedge clk, negedge rstn) begin
if(!rstn)
even_clk_out <= 1'b0;
else if(even_cnt == (N>>1'b1)-1'b1)
even_clk_out <= ~even_clk_out;
else
even_clk_out <= even_clk_out;
end
//odd
always@(posedge clk, negedge rstn) begin
if(!rstn)
odd_cnt <= 1'b0;
else if(odd_cnt == N-1'b1)
odd_cnt <= 1'b0;
else
odd_cnt <= odd_cnt + 1'b1;
end
always@(posedge clk, negedge rstn) begin
if(!rstn)
odd_clk_out1 <= 1'b0;
else if(odd_cnt == N>>1'b1 | odd_cnt == 1'b0)
odd_clk_out1 <= ~odd_clk_out1;
else
odd_clk_out1 <= odd_clk_out1;
end
always@(negedge clk, negedge rstn) begin
if(!rstn)
odd_clk_out2 <= 1'b0;
else if(odd_cnt == (N>>1'b1)+1'b1 | odd_cnt == 1'b1)
odd_clk_out2 <= ~odd_clk_out2;
else
odd_clk_out2 <= odd_clk_out2;
end
assign odd_clk_out = odd_clk_out1 | odd_clk_out2;
assign clk_out = (N%2==0) ? even_clk_out : odd_clk_out;
- 仿真验证:
由代码,我们只需要控制生成时钟信号clk和复位信号rstn即可。
initial begin
clk = 0;
forever #10 clk = ~clk;
end
initial begin
rstn=0;
#20 rstn=1;
end
相应地,五倍频的仿真波形结果如下,符合要求。
- 综合结果:
- 总结分析:
①:总结规律->设计实现;
②:优先级:算术运算符>移位运算符,想要先进行移位时,应加括号。
六、异步四位二进制加计数器:
- 功能描述:
每个D触发器的Q非端连接到D端,实现翻转功能。计数时钟clk加至触发器FF0的时钟脉冲输入端,每输入一个计数脉冲,FF0翻转一次。
FF1-FF3都以前一级触发器的Q端作为触发信号,当Q0由1变0时,FF1翻转,其余类推。
设计方案:
①设计基本的D触发器作为FF,例化4次得到功能实现;
②据图连接例化端口。关键代码:
module FF(
input clk,
input rstn,
input d,
output reg q);
always @(negedge clk) begin
if(!rstn) q <= 0;
else q <= d;
end
endmodule
module asyn_counter(
input clk,
input rstn,
output q0,
output q1,
output q2,
output q3);
FF FF0(
.clk(clk),
.rstn(rstn),
.d(~q0),
.q(q0));
FF FF1(
.clk(q0),
.rstn(rstn),
.d(~q1),
.q(q1));
FF FF2(
.clk(q1),
.rstn(rstn),
.d(~q2),
.q(q2));
FF FF3(
.clk(q2),
.rstn(rstn),
.d(~q3),
.q(q3));
endmodule
- 仿真验证:
只需控制生成时钟信号和复位信号
initial begin
clk = 0;
forever #10 clk=~clk;
end
initial begin
rstn=0;
#20 rstn=1;
#100 $stop;
end
对应波形图如下,正确完成从零开始的下降沿计数。
- 综合结果:
数电第7周周结_by_yc的更多相关文章
- 模电&数电知识整理(不定期更新)
模电总复习之爱课堂题目概念整理 Chapter 1 1) 设室温情况下某二极管的反偏电压绝对值为1V,则当其反偏电压值减少100mV时,反向电流的变化是基本不发生变化. 2) 二极管发生击穿后,在击穿 ...
- 数电课设——琐碎
这几天没有更新过网站了,也没继续开发VellLock了,可是感觉还是没有闲着,一直在跟下面的一些元器件在打交道,当然下面的都是小儿科,英文文档都看得我快吐血了.数电基本属于棺材边上过的我,是各种头大, ...
- java第二周周学习总结
java运算符和循环 java运算符 一.for 语句 for 语句的基本结构如下所示:for(初始化表达式;判断表达式;递增(递减)表达式){ 执行语句; //一段代码} 初始化表达式:初 ...
- web前端笔记整理,从入门到上天,周周更新
由于大前端知识点太多,所以一一做了分类整理,详情可见本人博客 http://www.cnblogs.com/luxiaoyao/ 一.HTML 1.注释 格式:<!-- 注释内容 --> ...
- 数电基础之《OC门》
OC门,又称集电极开路门,Open Collector. 为什么引入OC门?实际使用中,有时需要两个或两个以上与非门的输出端连接在同一条导线上,将这些与非门上的数据(状态电平)用同一条导线输送出去 ...
- FPGA大公司面试笔试数电部分,看看你会多少
1:什么是同步逻辑和异步逻辑?(汉王) 同步逻辑是时钟之间有固定的因果关系.异步逻辑是各时钟之间没有固定的因果关系. 答案应该与上面问题一致 [补充]:同步时序逻辑电路的特点:各触发器的时钟端全部连接 ...
- STM32f103的数电采集电路的DMA设计和使用优化程序
DMA,全称为:Direct Memory Access,即直接存储器访问.DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直 ...
- 数电——全减器分析(用74HC138设计提示)
-1=1(即Di=1). Di=(Y1' * Y2' * Y4' * Y7')'可以得到74HC138来表示,(注意:Ai,Bi,Ci-1的各自位权对应A2,A1,A0) Ci同理可得.
- STM32f103的数电采集电路的TIMER定时器的使用与时序控制的程序
STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成.STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较 ...
- STM32f103的数电采集电路的双ADC的设计与使用
STM32F103C8T6拥有3个ADC,其独立使用已经在本文的3.1.3里面有详细的介绍,这里主要是介绍双ADC的同时使用,即STM32的同步规则模式使用.在此模式在规则通道组上执行时,外部触发来自 ...
随机推荐
- Elasticsearch 数据建模指南
文章转载自:https://mp.weixin.qq.com/s/vSh6w3eL_oQvU1mxnxsArA 0.题记 我在做 Elasticsearch 相关咨询和培训过程中,发现大家普遍更关注实 ...
- K8S Ingress使用|常见问题列表
官方文档地址:https://kubernetes.github.io/ingress-nginx/
- 使用KVM安装windows10系统出现内存直接占满的情况解决
情况说明: 在使用kvm安装windows10系统的时候,采用的win10系统不是原版系统,而是经过进一步封装的系统,使用大白菜PE先格式化磁盘,然后再安装的系统,在系统安装好重启的时候,卡在安装界面 ...
- day43-反射02
2.Class类 2.1基本介绍 Class类也是类,因此也继承Object类 Class类对象不是new出来的,而是系统创建的 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次 每个 ...
- java连接数据库加载驱动到java项目
java连接数据库 package com.cook.zheng; import java.sql.Connection; import java.sql.DriverManager; public ...
- elementUi使用dialog的进行信息的添加、删除表格数据时进行信息提示。删除或者添加成功的信息提示(SpringBoot+Vue+MybatisPlus)
文章目录 1.添加新用户,通过dialog的弹窗形式 1.1 添加的按钮 1.2 调用方法设置窗口可见 1.3 窗口代码 1.4 提交注册信息方法 1.5 使用mybatisPlus方法进行添加信息到 ...
- 初始Vue、Vue模板语法、数据绑定(2022/7/3)
文章目录 1.Vue简介 1.1.Vue的安装使用 1.2.实际的运用案例 1.3.vue开发工具的使用(这个需要在浏览器中安装) 2.初始Vue 2.1 .基础知识 2.1 .代码实例 2.2 .页 ...
- 8.websocket slef概念
self代表当前用户客户端与服务端的连接对象,比如两客户端发来了两个连接,我们可以把两个连接放在一起 # 定义全局变量 CONN_List = [] class LiveConsumer(Websoc ...
- 9-模型层及ORM介绍
一.模型层 模型层负责和数据库之间进行通信 二.Django配置mysql数据库 1.Django默认的数据库是sqllite3,将其更改为mysql数据库需要进行对应配置 1.安装mysql ...
- Element基本组件
Element按钮组件: <el-row> <el-button>默认按钮</el-button> <el-button type="primary ...