使用 Verilog 语言定义 D 触发器, D 触发器的时钟信号使用开发板上的" BTNC "按钮做为单步脉冲,并使用 D 触发器设计一个可重叠同步时序逻辑电路。实验要求如下: 设计一个可重叠的"101"序列检测器,当输入"101"时,输出为1。 (只用两个D触发器)① 原始状态图、状态表、化简状态表、状态分配列出状态转换编码表、根据 D 触发器写出状态方程、驱动方程和输出方程,画出最终逻辑电路图。② Verilog 源代码(实现逻辑电路必须用门电路实现,如 nand 等,参考实验一组合逻辑电路,其它可用行为模式编程)。
时间: 2024-02-19 10:00:07 浏览: 159
这是一个比较简单的设计题目,只需要使用两个D触发器和一些组合逻辑即可实现。以下是大致的步骤:
1. 绘制状态图,分析状态转移条件。状态图如下:
![](https://img-blog.csdnimg.cn/20211101163041820.png)
2. 根据状态图,列出状态表。状态表如下:
| 状态 | Q1 | Q0 | 输入D | 输出Z |
| ---- | -- | -- | ----- | ----- |
| S0 | 0 | 0 | 0 | 0 |
| S1 | 0 | 1 | 0 | 0 |
| S2 | 1 | 0 | 0 | 0 |
| S3 | 0 | 0 | 1 | 0 |
| S4 | 0 | 1 | 1 | 0 |
| S5 | 1 | 0 | 1 | 1 |
3. 根据状态表,化简状态表。将S0和S2合并为一个状态,得到化简状态表如下:
| 状态 | Q1 | Q0 | 输入D | 输出Z |
| ---- | -- | -- | ----- | ----- |
| S0 | 0 | 0 | 0 | 0 |
| S1 | 0 | 1 | 0 | 0 |
| S2 | 0 | 1 | 1 | 0 |
| S3 | 1 | 0 | 0 | 0 |
| S4 | 1 | 0 | 1 | 1 |
4. 根据化简状态表,设计状态转移编码。此处采用格雷码编码,得到状态转移编码表如下:
| 状态 | Q1Q0 | D0 | D1 |
| ---- | ---- | -- | -- |
| S0 | 00 | 0 | 1 |
| S1 | 01 | 0 | 0 |
| S2 | 11 | 1 | 0 |
| S3 | 10 | 0 | 0 |
| S4 | 10 | 1 | 1 |
5. 根据状态方程,编写驱动方程和输出方程。此处采用行为模式编程,使用nand门实现。状态方程如下:
Q1_next = D1' * Q1' * Q0 + D1 * Q1' * Q0' + D1 * Q1 * Q0' + D1' * Q1 * Q0
Q0_next = D0' * Q0' + D0 * Q0'
驱动方程和输出方程如下:
always @(posedge BTNC) begin
Q1 <= ~D1 & Q1 & Q0 | D1 & Q1 & ~Q0 | D1 & ~Q1 & ~Q0 | ~D1 & ~Q1;
Q0 <= ~D0 & Q0 | D0 & ~Q0;
Z <= Q1 & ~Q0;
end
6. 根据驱动方程和输出方程,设计最终逻辑电路。电路图如下:
![](https://img-blog.csdnimg.cn/20211101163145647.png)
7. 根据逻辑电路,编写Verilog源代码。代码如下:
```
module sync_detector(
input BTNC,
input D,
output Z
);
reg Q1, Q0;
assign Z = Q1 & ~Q0;
always @(posedge BTNC) begin
Q1 <= ~D & Q1 & Q0 | D & Q1 & ~Q0 | D & ~Q1 & ~Q0 | ~D & ~Q1;
Q0 <= ~D & Q0 | D & ~Q0;
end
endmodule
```
阅读全文