Skip to content

Commit

Permalink
Fixed some errors of Excels
Browse files Browse the repository at this point in the history
  • Loading branch information
Huihaojia committed Oct 26, 2022
1 parent 51b697a commit 54fc736
Show file tree
Hide file tree
Showing 8 changed files with 735 additions and 713 deletions.
1,092 changes: 547 additions & 545 deletions Sphinx/doc/例子/进阶实例.md

Large diffs are not rendered by default.

94 changes: 47 additions & 47 deletions Sphinx/doc/例子/高级实例.md
Original file line number Diff line number Diff line change
Expand Up @@ -377,71 +377,71 @@

- 规范

`Timer`组件将有一个单独的构造参数:
`Timer`组件将有一个单独的构造参数:

| 名称 | 类型 | 描述 |
| :---: | :---: | :----------------------: |
| width | Int | 指明时间计数器的比特位宽 |
| 名称 | 类型 | 描述 |
| :---: | :---: | :----------------------: |
| width | Int | 指明时间计数器的比特位宽 |

并且有一些输入/输出:
并且有一些输入/输出:

| 名称 | 方向 | 类型 | 描述 |
| :---: | :---: | :---: | :-----------------------------------------------------: |
| tick | in | Bool |`tick`为True时,计时器会一直计数到`limit` |
| clear | in | Bool |`tick`为True时,计时器设置为零。`Clear`优先于`tick`|
| 名称 | 方向 | 类型 | 描述 |
| :---: | :---: | :---: | :-----------------------------------------------------: |
| tick | in | Bool |`tick`为True时,计时器会一直计数到`limit` |
| clear | in | Bool |`tick`为True时,计时器设置为零。`Clear`优先于`tick`|

- 实现

```Scala
case class Timer(width : Int) extends Component{
val io = new Bundle{
val tick = in Bool()
val clear = in Bool()
val limit = in UInt(width bits)
```Scala
case class Timer(width : Int) extends Component{
val io = new Bundle{
val tick = in Bool()
val clear = in Bool()
val limit = in UInt(width bits)

val full = out Bool()
val value = out UInt(width bits)
}
val full = out Bool()
val value = out UInt(width bits)
}

val counter = Reg(UInt(width bits))
when(io.tick && !io.full){
counter := counter + 1
}
when(io.clear){
counter := 0
}
val counter = Reg(UInt(width bits))
when(io.tick && !io.full){
counter := counter + 1
}
when(io.clear){
counter := 0
}

io.full := counter === io.limit && io.tick
io.value := counter
}
```
io.full := counter === io.limit && io.tick
io.value := counter
}
```

3. 桥接函数(Bridging function)

可以从这个例子的主要目的开始:定义一个总线桥接函数。为此,将使用两种技术:

- 利用https://spinalhdl.github.io/SpinalDoc-RTD/master/SpinalHDL/Libraries/bus_slave_factory.html#bus-slave-factory下的`BusSlaveFactory`工具
- 在`Timer`组件内部定义一个函数,可以从父组件调用该函数,以抽象的方式驱动`Timer`的IO
- 利用https://spinalhdl.github.io/SpinalDoc-RTD/master/SpinalHDL/Libraries/bus_slave_factory.html#bus-slave-factory下的`BusSlaveFactory`工具
-`Timer`组件内部定义一个函数,可以从父组件调用该函数,以抽象的方式驱动`Timer`的IO。


- 规范

| 名称 | 类型 | 描述 |
| :---------: | :-------------: | :-------------------------------------------: |
| busCtrl | BusSlaveFactory | 函数将使用`BusSlaveFactory`实例创建桥接逻辑。 |
| baseAddress | BigInt | 桥接逻辑应该被映射的基地址 |
| ticks | Seq[Bool] | 可用作tick信号的逻辑资源 |
| clears | Seq[Bool] | 可用作clear信号的逻辑资源 |

该寄存器映射会假设总线系统是32比特位宽:
| 名称 | 接入 | 位宽 | 地址偏移 | 比特偏移 |
| :----------: | :---: | :---------: | :------: | :------: |
| ticksEnable | RW | len(ticks) | 0 | 0 |
| clearsEnable | RW | len(clears) | 0 | 16 |
| limit | RW | width | 4 | 0 |
| value | R | width | 8 | 0 |
| clear | W | | 8 | |
| 名称 | 类型 | 描述 |
| :---------: | :-------------: | :-------------------------------------------: |
| busCtrl | BusSlaveFactory | 函数将使用`BusSlaveFactory`实例创建桥接逻辑。 |
| baseAddress | BigInt | 桥接逻辑应该被映射的基地址 |
| ticks | Seq[Bool] | 可用作tick信号的逻辑资源 |
| clears | Seq[Bool] | 可用作clear信号的逻辑资源 |

该寄存器映射会假设总线系统是32比特位宽:

| 名称 | 接入 | 位宽 | 地址偏移 | 比特偏移 |
| :----------: | :---: | :---------: | :------: | :------: |
| ticksEnable | RW | len(ticks) | 0 | 0 |
| clearsEnable | RW | len(clears) | 0 | 16 |
| limit | RW | width | 4 | 0 |
| value | R | width | 8 | 0 |
| clear | W | | 8 | |

- 实现

Expand Down
95 changes: 50 additions & 45 deletions Sphinx/doc/库/Com.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
1. 简介

SpinalHDL库中有一个USB设备控制器。在以下几个要点中, 它可以设置为:

+ 它允许CPU配置和管理端点
+ 存储端点状态和事务描述符的内部RAM
+ 多达16个端点(几乎没有额外开销)
Expand All @@ -62,23 +63,27 @@
+ 不需要外部phy

Linux小工具测试和功能:

+ 串行连接
+ 以太网连接
+ 大容量存储(在ArtyA7 linux上达到8mbps)

部署:

+ https://github.com/SpinalHDL/SaxonSoc/tree/dev-0.3/bsp/digilent/ArtyA7SmpLinux
+ https://github.com/SpinalHDL/SaxonSoc/tree/dev-0.3/bsp/radiona/ulx3s/smp

2. 架构(Architecture)

控制器由以下部分组成:

+ 少数控制寄存器
+ 一个用来存储端点状态的内部RAM, 一个传输描述符合端点0配置数据。

每个端点的描述符链表是为了处理USB的出入任务和数据。

端点0也会像其他端点一样处理出入USB的交换任务但也会有一些额外的硬件来处理SETUP(设置)任务:

+ 它的链表在每个设置任务上被清除
+ 设置任务的数据存储在一个固定的位置(SETUP_DATA)
+ 它对设置任务有一个特定的中断标志
Expand All @@ -89,75 +94,75 @@

- 帧FRAME (0xFF00)

| 名称 | 类型 | 比特 | 描述 |
| :--------: | :---: | :---: | :-------------: |
| usbFrameId | RO | 31-0 | 目前的usb帧的id |
| 名称 | 类型 | 比特 | 描述 |
| :--------: | :---: | :---: | :-------------: |
| usbFrameId | RO | 31-0 | 目前的usb帧的id |

- 地址ADDRESS (0xFF04)

| 名称 | 类型 | 比特 | 描述 |
| :-----: | :---: | :---: | :-----------------------------------------------------------------------: |
| address | WO | 6-0 | 该USB设备只会被特定地址的令牌(token)所控制。其字段会被usb重置任务自动清除 |
| enable | WO | 8 | 如果设置, 启用USB地址过滤 |
| trigger | WO | 9 | 设置下一个EP0 IN令牌使能(见上文)。在任何EP0完成后由硬件清除 |
| 名称 | 类型 | 比特 | 描述 |
| :-----: | :---: | :---: | :-----------------------------------------------------------------------: |
| address | WO | 6-0 | 该USB设备只会被特定地址的令牌(token)所控制。其字段会被usb重置任务自动清除 |
| enable | WO | 8 | 如果设置, 启用USB地址过滤 |
| trigger | WO | 9 | 设置下一个EP0 IN令牌使能(见上文)。在任何EP0完成后由硬件清除 |

这里的想法是保持整个寄存器清空, 直到EP0上接收到USB SET_ADDRESS设置包。此时, 用户可以设置地址和触发器字段, 然后向EP0提供IN零长度描述符, 以结束SET_ADDRESS序列。然后, 控制器将在描述符完成时自动打开地址过滤。
这里的想法是保持整个寄存器清空, 直到EP0上接收到USB SET_ADDRESS设置包。此时, 用户可以设置地址和触发器字段, 然后向EP0提供IN零长度描述符, 以结束SET_ADDRESS序列。然后, 控制器将在描述符完成时自动打开地址过滤。

- 中断INTERRUPT (0xFF08)

这个寄存器的所有位都可以通过写入“1”来清除。
这个寄存器的所有位都可以通过写入“1”来清除。

| 名称 | 类型 | 比特 | 描述 |
| :--------: | :---: | :---: | :-----------------------: |
| endpoints | RC | 15-0 | 当端点产生中断时拉高 |
| reset | RC | 16 | 当USB复位发生时拉高 |
| ep0Setup | RC | 17 | 当端点0收到配置请求时拉高 |
| suspend | RC | 18 | 当端点悬挂时拉高 |
| resume | RC | 19 | 当端点恢复时拉高 |
| disconnect | RC | 20 | 当端点连接中断时拉高 |
| 名称 | 类型 | 比特 | 描述 |
| :--------: | :---: | :---: | :-----------------------: |
| endpoints | RC | 15-0 | 当端点产生中断时拉高 |
| reset | RC | 16 | 当USB复位发生时拉高 |
| ep0Setup | RC | 17 | 当端点0收到配置请求时拉高 |
| suspend | RC | 18 | 当端点悬挂时拉高 |
| resume | RC | 19 | 当端点恢复时拉高 |
| disconnect | RC | 20 | 当端点连接中断时拉高 |

- Halt (0xFF0C)

这个寄存器允许在休眠状态下放置一个端点, 以确保CPU操作的原子性, 允许对端点寄存器和描述符进行读/修改/写操作。如果给定的端点是由usb主机寻址的, 外围设备将返回NAK。
这个寄存器允许在休眠状态下放置一个端点, 以确保CPU操作的原子性, 允许对端点寄存器和描述符进行读/修改/写操作。如果给定的端点是由usb主机寻址的, 外围设备将返回NAK。

| 名称 | 类型 | 比特 | 描述 |
| :--------------: | :---: | :---: | :----------------------------------------------------: |
| endpointId | WO | 3-0 | 用户想要休眠的目标端点 |
| enable | WO | 4 | |
| effective enable | RO | 5 | 在设置了使能后, 需要等待硬件本身设置该位, 以确保原子性 |
| 名称 | 类型 | 比特 | 描述 |
| :--------------: | :---: | :---: | :----------------------------------------------------: |
| endpointId | WO | 3-0 | 用户想要休眠的目标端点 |
| enable | WO | 4 | |
| effective enable | RO | 5 | 在设置了使能后, 需要等待硬件本身设置该位, 以确保原子性 |

- 配置CONFIG (0xFF10)

| 名称 | 类型 | 比特 | 描述 |
| :------------------: | :---: | :---: | :----------------------------------: |
| pullupSet | SO | 0 | 写入' 1 '来启用dp引脚上的USB设备上拉 |
| pullupClear | SO | 1 | |
| interruptEnableSet | SO | 2 | 写“1”, 让现在和未来的中断发生 |
| interruptEnableClear | SO | 3 | |
| 名称 | 类型 | 比特 | 描述 |
| :------------------: | :---: | :---: | :----------------------------------: |
| pullupSet | SO | 0 | 写入' 1 '来启用dp引脚上的USB设备上拉 |
| pullupClear | SO | 1 | |
| interruptEnableSet | SO | 2 | 写“1”, 让现在和未来的中断发生 |
| interruptEnableClear | SO | 3 | |

- INFO (0xFF20)

| 名称 | 类型 | 比特 | 描述 |
| :-----: | :---: | :---: | :------------------------: |
| ramSize | RO | 3-0 | 内部ram将有(1 << this)字节 |
| 名称 | 类型 | 比特 | 描述 |
| :-----: | :---: | :---: | :------------------------: |
| ramSize | RO | 3-0 | 内部ram将有(1 << this)字节 |

- 端点 ENDPOINTS (0x0000 - 0x003F)

端点状态存储在内部ram的开头, 每个有32位字。
端点状态存储在内部ram的开头, 每个有32位字。

| 名称 | 类型 | 比特 | 描述 |
| :-----------: | :---: | :---: | :---------------------------------------------------------------: |
| enable | RW | 0 | 若不设置, 则该端点忽略所有的流量(traffic) |
| stall | RW | 1 | 若设置了, 端点将始终返回STALL状态 |
| nack | RW | 2 | 若设置了, 端点将始终返回NACK状态 |
| dataPhase | RW | 3 | 指定使用的IO数据PID。' 0 ' = > DATA0。这个字段也由控制器更新。 |
| head | RW | 15-4 | 指定当前描述符头部(链表)0 => empty list, byte address = this << 4 |
| isochronous | RW | 16 | 指定当前描述符头部(链表)0 => empty list, byte address = this << 4 |
| maxPacketSize | RW | 31-22 | |
| 名称 | 类型 | 比特 | 描述 |
| :-----------: | :---: | :---: | :---------------------------------------------------------------: |
| enable | RW | 0 | 若不设置, 则该端点忽略所有的流量(traffic) |
| stall | RW | 1 | 若设置了, 端点将始终返回STALL状态 |
| nack | RW | 2 | 若设置了, 端点将始终返回NACK状态 |
| dataPhase | RW | 3 | 指定使用的IO数据PID。' 0 ' = > DATA0。这个字段也由控制器更新。 |
| head | RW | 15-4 | 指定当前描述符头部(链表)0 => empty list, byte address = this << 4 |
| isochronous | RW | 16 | 指定当前描述符头部(链表)0 => empty list, byte address = this << 4 |
| maxPacketSize | RW | 31-22 | |

为了获得一个端点响应需要:设置其使能标志位为1.
为了获得一个端点响应需要:设置其使能标志位为1.

还有其他一些例子:要么用户有停滞或纳标记集,因此,控制器总是有相应的响应;要么EP0设置请求,控制器不会使用描述符,但将数据写入SETUP_DATA寄存器和ACK;要么用户有一个空链表(head==0)并响应NACK;要么用户至少有一个描述符由头部指出,在这种情况下将执行和ACK。
还有其他一些例子:要么用户有停滞或纳标记集,因此,控制器总是有相应的响应;要么EP0设置请求,控制器不会使用描述符,但将数据写入SETUP_DATA寄存器和ACK;要么用户有一个空链表(head==0)并响应NACK;要么用户至少有一个描述符由头部指出,在这种情况下将执行和ACK。

- SETUP_DATA (0x0040 - 0x0047)
-
Expand Down
16 changes: 8 additions & 8 deletions Sphinx/doc/库/实用工具.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,15 @@

- asyncAssertSyncDeassert

用户可以利用一个异步有效同步无效(asynchronously asserted synchronously de-asserted)逻辑来筛选异步复位。可以使用`ResetCtrl.asyncAssertSyncDeassert`函数来筛选并返回相应的值。
用户可以利用一个异步有效同步无效(asynchronously asserted synchronously de-asserted)逻辑来筛选异步复位。可以使用`ResetCtrl.asyncAssertSyncDeassert`函数来筛选并返回相应的值。

| 声明命名 | 返回类型 | 描述 |
| :------------: | :---------: | :----------------------------------------------------: |
| input | Bool | 筛选的信号 |
| clockDomain | ClockDomain | 返回将要使用所筛选值的时钟域 |
| inputPolarity | Polarity | HIGH/LOW (default=HIGH) |
| outputPolarity | Polarity | HIGH/LOW (default=clockDomain.config.resetActiveLevel) |
| bufferDepth | Int | 防止亚稳态所需的寄存器级数(默认为2) |
| 声明命名 | 返回类型 | 描述 |
| :------------: | :---------: | :----------------------------------------------------: |
| input | Bool | 筛选的信号 |
| clockDomain | ClockDomain | 返回将要使用所筛选值的时钟域 |
| inputPolarity | Polarity | HIGH/LOW (default=HIGH) |
| outputPolarity | Polarity | HIGH/LOW (default=clockDomain.config.resetActiveLevel) |
| bufferDepth | Int | 防止亚稳态所需的寄存器级数(默认为2) |

另外有一个ResetCtrl.asyncAssertSyncDeassertDrive版本的工具, 它直接分配clockDomain以重置的值。

Expand Down
Loading

0 comments on commit 54fc736

Please sign in to comment.