差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
scope_verilog [2020/08/22 21:21] gongyu [3. UART的数据传输] |
scope_verilog [2021/10/24 20:45] (当前版本) gongyusu |
||
---|---|---|---|
行 34: | 行 34: | ||
向FIFO中写数据 | 向FIFO中写数据 | ||
+ | |||
为向FIFO中写数据,我们需要等待到空的状态,一旦FIFO的状态变“满”,则停止写数据,代码逻辑如下: | 为向FIFO中写数据,我们需要等待到空的状态,一旦FIFO的状态变“满”,则停止写数据,代码逻辑如下: | ||
行 49: | 行 50: | ||
从FIFO中读取数据 | 从FIFO中读取数据 | ||
+ | |||
只要FIFO不空,就可以从中读取数据,读出的每一个字节发送到串行输出模块 | 只要FIFO不空,就可以从中读取数据,读出的每一个字节发送到串行输出模块 | ||
行 100: | 行 102: | ||
#### 1.2 基于双口RAM的机制 | #### 1.2 基于双口RAM的机制 | ||
先说一下“触发” | 先说一下“触发” | ||
+ | |||
现在,每次从串行端口接收到字符时,示波器都会被触发。 当然,这仍然不是一个非常有用的设计,但是稍后我们将对其进行改进。 | 现在,每次从串行端口接收到字符时,示波器都会被触发。 当然,这仍然不是一个非常有用的设计,但是稍后我们将对其进行改进。 | ||
行 130: | 行 133: | ||
我们使用2个触发器形式的同步器(将“ startAcquisition”转移到另一个时钟域)。 | 我们使用2个触发器形式的同步器(将“ startAcquisition”转移到另一个时钟域)。 | ||
+ | |||
<code verilog> | <code verilog> | ||
reg startAcquisition1; always @(posedge cll_adc) startAcquisition1 <= startAcquisition; | reg startAcquisition1; always @(posedge cll_adc) startAcquisition1 <= startAcquisition; | ||
行 136: | 行 140: | ||
最后,一旦另一个时钟域“看到”信号,它就会“回复”(使用另一个同步器“正在获取”)。 | 最后,一旦另一个时钟域“看到”信号,它就会“回复”(使用另一个同步器“正在获取”)。 | ||
- | |||
<code verilog> | <code verilog> | ||
行 155: | 行 158: | ||
#### 双口RAM | #### 双口RAM | ||
+ | |||
既然触发器可用,我们需要一个双端口RAM来存储数据,注意RAM的每一侧如何使用不同的时钟。 | 既然触发器可用,我们需要一个双端口RAM来存储数据,注意RAM的每一侧如何使用不同的时钟。 | ||
+ | |||
<code verilog> | <code verilog> | ||
ram512 ram_adc( | ram512 ram_adc( | ||
行 164: | 行 169: | ||
使用二进制计数器可以轻松创建ram地址总线。 | 使用二进制计数器可以轻松创建ram地址总线。 | ||
+ | |||
首先写地址: | 首先写地址: | ||
<code verilog> | <code verilog> | ||
行 273: | 行 279: | ||
#### 1.3 触发 | #### 1.3 触发 | ||
+ | |||
我们的第一个触发机制非常简单 - 检测一个上升沿穿过一个设定好的阈值,我们使用的是8位的ADC,因此采集到的数据的范围为0x00到0xFF,我们先假设阈值为ox80. | 我们的第一个触发机制非常简单 - 检测一个上升沿穿过一个设定好的阈值,我们使用的是8位的ADC,因此采集到的数据的范围为0x00到0xFF,我们先假设阈值为ox80. | ||
行 288: | 行 295: | ||
**显示中间触发** | **显示中间触发** | ||
+ | |||
数字示波器的一项重要功能是能够查看在触发之前发生了什么。 | 数字示波器的一项重要功能是能够查看在触发之前发生了什么。 | ||
这是如何实现的? | 这是如何实现的? | ||
+ | |||
示波器不断采集,示波器的存储器一遍又一遍地被覆盖-当到达终点时,我们从头开始。 但是,如果发生触发,则示波器将继续获取其一半以上的存储深度,然后停止。 因此,它保留了一半的内存与触发之前发生的事件,以及一半的触发之后发生的事件。 | 示波器不断采集,示波器的存储器一遍又一遍地被覆盖-当到达终点时,我们从头开始。 但是,如果发生触发,则示波器将继续获取其一半以上的存储深度,然后停止。 因此,它保留了一半的内存与触发之前发生的事件,以及一半的触发之后发生的事件。 | ||
行 408: | 行 417: | ||
我们还添加了一个4位寄存器(HDiv[3:0])以控制水平采集速率。 当我们想降低采集速率时,要么丢弃来自ADC的采样,要么以我们感兴趣的频率对它们进行滤波/降采样。 | 我们还添加了一个4位寄存器(HDiv[3:0])以控制水平采集速率。 当我们想降低采集速率时,要么丢弃来自ADC的采样,要么以我们感兴趣的频率对它们进行滤波/降采样。 | ||
- | |||
- | |||
### 2. LCD的波形和界面显示 | ### 2. LCD的波形和界面显示 | ||
行 419: | 行 426: | ||
参见[[uart_verilog|串行接口RS-232通信的Verilog代码]] | 参见[[uart_verilog|串行接口RS-232通信的Verilog代码]] | ||
- | ### 4. 增益及直流偏移的控制 | + | ### 4. 通过SPI的数据传输 |
+ | |||
+ | ### 5. 增益及直流偏移的控制 | ||
+ | |||
+ | 参见[[pwm_verilog|PWM的应用及相应的Verilog代码]] | ||
+ | |||
+ | ### 6. 参数的自动测量 | ||
- | ### 5. 参数的自动测量 | + | ### 7. 校准和自动设置 |
- | ### 6. 校准和自动设置 | + | ### 硬禾学堂的仪器传输及控制协议 |
+ | [[instru_protocol|仪器传输及控制协议]] |