diff --git a/package-lock.json b/package-lock.json
index 2dce99e..1876155 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,8 +10,10 @@
"dependencies": {
"@svgdotjs/svg.js": "^3.2.4",
"@types/lodash": "^4.17.16",
+ "all": "^0.0.0",
"lodash": "^4.17.21",
"log-symbols": "^7.0.0",
+ "marked": "^12.0.0",
"mathjs": "^14.4.0",
"pinia": "^3.0.1",
"tinypool": "^1.0.2",
@@ -1993,6 +1995,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/all": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/all/-/all-0.0.0.tgz",
+ "integrity": "sha512-0oKlfNVv2d+d7c1gwjGspzgbwot47PGQ4b3v1ccx4mR8l9P/Y6E6Dr/yE8lNT63EcAKEbHo6UG3odDpC/NQcKw==",
+ "license": "MIT"
+ },
"node_modules/ansi-styles": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
@@ -3061,6 +3069,18 @@
"@jridgewell/sourcemap-codec": "^1.5.0"
}
},
+ "node_modules/marked": {
+ "version": "12.0.2",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz",
+ "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==",
+ "license": "MIT",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
"node_modules/mathjs": {
"version": "14.4.0",
"resolved": "https://registry.npmjs.org/mathjs/-/mathjs-14.4.0.tgz",
diff --git a/package.json b/package.json
index 85e520b..8aab200 100644
--- a/package.json
+++ b/package.json
@@ -16,8 +16,10 @@
"dependencies": {
"@svgdotjs/svg.js": "^3.2.4",
"@types/lodash": "^4.17.16",
+ "all": "^0.0.0",
"lodash": "^4.17.21",
"log-symbols": "^7.0.0",
+ "marked": "^12.0.0",
"mathjs": "^14.4.0",
"pinia": "^3.0.1",
"tinypool": "^1.0.2",
diff --git a/src/components/DiagramCanvas.vue b/src/components/DiagramCanvas.vue
index a6432e5..a30b287 100644
--- a/src/components/DiagramCanvas.vue
+++ b/src/components/DiagramCanvas.vue
@@ -3,8 +3,7 @@
@mousedown="handleCanvasMouseDown"
@mousedown.middle.prevent="startMiddleDrag"
@wheel.prevent="onZoom"
- @contextmenu.prevent="handleContextMenu">
-
+ @contextmenu.prevent="handleContextMenu">
@@ -148,11 +152,12 @@ function handleContextMenu(e: MouseEvent) {
}
// 定义组件发出的事件
-const emit = defineEmits(['diagram-updated', 'component-selected', 'component-moved', 'component-delete', 'wire-created', 'wire-deleted', 'load-component-module', 'open-components']);
+const emit = defineEmits(['diagram-updated', 'component-selected', 'component-moved', 'component-delete', 'wire-created', 'wire-deleted', 'load-component-module', 'open-components', 'toggle-doc-panel']);
// 定义组件接受的属性
const props = defineProps<{
- componentModules: Record
+ componentModules: Record;
+ showDocPanel?: boolean; // 添加属性接收文档面板的显示状态
}>();
// --- 画布状态 ---
diff --git a/src/components/MarkdownRenderer.vue b/src/components/MarkdownRenderer.vue
new file mode 100644
index 0000000..8e631a2
--- /dev/null
+++ b/src/components/MarkdownRenderer.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
diff --git a/src/views/ProjectView.vue b/src/views/ProjectView.vue
index b1a2e12..f93a4a9 100644
--- a/src/views/ProjectView.vue
+++ b/src/views/ProjectView.vue
@@ -1,13 +1,12 @@
-
-
-
+
+ @load-component-module="handleLoadComponentModule" @toggle-doc-panel="toggleDocPanel" />
@@ -18,8 +17,12 @@
@@ -36,6 +39,7 @@ import { ref, computed, onMounted, onUnmounted, shallowRef } from "vue"; // 引
import DiagramCanvas from "@/components/DiagramCanvas.vue";
import ComponentSelector from "@/components/ComponentSelector.vue";
import PropertyPanel from "@/components/PropertyPanel.vue";
+import MarkdownRenderer from "@/components/MarkdownRenderer.vue";
import type { DiagramData, DiagramPart } from "@/components/diagramManager";
import {
type PropertyConfig,
@@ -44,6 +48,164 @@ import {
generatePropsFromAttrs,
} from "@/components/equipments/componentConfig"; // 引入组件配置工具
+// --- 文档面板控制 ---
+const showDocPanel = ref(false);
+const documentContent = ref('');
+
+// 切换文档面板和属性面板
+function toggleDocPanel() {
+ showDocPanel.value = !showDocPanel.value;
+
+ // 如果切换到文档面板,则获取文档内容
+ if (showDocPanel.value) {
+ fetchDocumentation();
+ }
+}
+
+// 模拟获取文档的函数
+function fetchDocumentation() {
+ // 这里模拟API请求,返回固定的Markdown内容
+ const mockDocContent = `
+# FPGA WebLab 用户指南
+
+## 简介
+
+FPGA WebLab是一个基于Web的FPGA设计和实验平台,允许用户在浏览器中进行FPGA设计、仿真和验证。该平台提供了丰富的组件库和直观的界面,使FPGA学习和设计变得简单高效。
+
+## 功能特点
+
+- **可视化设计**:拖拽式界面,无需编写底层代码
+- **组件库**:包含多种常用FPGA组件
+- **实时验证**:设计完成后可立即进行验证和测试
+- **远程编程**:支持远程将设计烧录到物理FPGA设备
+- **协作功能**:支持多人同时在线编辑和查看
+
+## 快速入门
+
+### 创建项目
+
+1. 点击主界面的"新建项目"按钮
+2. 输入项目名称和描述
+3. 选择目标FPGA设备型号
+4. 点击"创建"完成项目初始化
+
+### 添加组件
+
+1. 在左侧组件库中找到需要的组件
+2. 将组件拖拽到设计区域
+3. 通过右侧属性面板配置组件参数
+
+### 连接组件
+
+1. 点击一个组件的输出引脚
+2. 拖动连线到目标组件的输入引脚
+3. 松开鼠标完成连接
+4. 连线会自动显示信号名称和类型
+
+### 验证设计
+
+1. 点击工具栏中的"验证"按钮
+2. 系统会自动检查设计中的错误和警告
+3. 如有问题,可查看错误日志进行修复
+
+### 模拟仿真
+
+1. 点击"仿真"按钮进入仿真模式
+2. 设置输入信号和仿真参数
+3. 运行仿真并查看波形输出
+4. 可通过时间轴查看不同时刻的信号状态
+
+### 烧录到设备
+
+1. 确保FPGA设备已连接
+2. 点击"合成"按钮生成比特流文件
+3. 点击"烧录"将设计下载到物理设备
+4. 查看烧录日志确认操作成功
+
+## 组件说明
+
+### 基础逻辑组件
+
+- **AND/OR/XOR门**:基本逻辑门,可设置输入数量
+- **MUX多路复用器**:数据选择器,根据选择信号输出不同输入
+- **触发器/寄存器**:存储单元,可选D、T、JK等不同类型
+- **计数器**:可配置位宽、计数方向等参数
+
+### 接口组件
+
+- **按钮/开关**:用户输入控制元件
+- **LED指示灯**:显示数字输出状态
+- **七段数码管**:显示数字信息
+- **UART接口**:串行通信接口
+
+### 高级组件
+
+- **RAM/ROM**:存储模块,可配置数据位宽和深度
+- **PLL/DCM**:时钟控制模块
+- **DSP模块**:数字信号处理单元
+- **MCU集成**:可嵌入微控制器核心
+
+## 常见问题
+
+### 设计无法编译
+
+检查以下可能的原因:
+- 组件之间连线不完整
+- 组件参数设置不正确
+- 存在时序冲突
+- 资源使用超出目标设备限制
+
+### 模拟结果与预期不符
+
+可能的解决方法:
+- 检查输入激励是否正确
+- 验证时钟设置和复位信号
+- 调整仿真时间步长
+- 查看信号完整传播路径
+
+### 设备烧录失败
+
+常见原因及解决方法:
+- 检查USB连接和驱动安装
+- 确认选择了正确的设备型号
+- 验证生成的比特流文件是否有效
+- 重新安装FPGA开发工具
+
+## 高级技巧
+
+### 层次化设计
+
+对于复杂项目,建议按功能模块划分设计层次,创建子模块后再进行顶层连接。
+
+### 自定义组件
+
+可以将常用电路打包为自定义组件,方便在不同项目中重复使用。
+
+### 版本控制
+
+定期保存设计快照,利用版本历史功能跟踪设计变更。
+
+### 性能优化
+
+- 减少关键路径上的组件数量
+- 优化时钟树结构
+- 合理布局减小互连延迟
+- 使用流水线结构提高吞吐量
+
+## 联系我们
+
+如有任何问题或建议,请通过以下方式联系我们:
+- 邮箱:support@fpgaweblab.com
+- 论坛:forum.fpgaweblab.com
+- 微信公众号:FPGA_WebLab
+
+感谢您使用FPGA WebLab!
+`;
+
+ // 更新文档内容
+ documentContent.value = mockDocContent;
+}
+
// --- 元器件管理 ---
const showComponentsMenu = ref(false);
const diagramData = ref
({
@@ -730,4 +892,27 @@ body {
margin: 0;
padding: 0;
}
+
+/* 文档面板样式 */
+.doc-panel {
+ padding: 1.5rem;
+ max-width: 800px;
+ margin: 0 auto;
+}
+
+/* 文档切换按钮样式 */
+.doc-toggle-btn {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+ z-index: 50;
+}
+
+/* Markdown渲染样式调整 */
+:deep(.markdown-content) {
+ padding: 1rem;
+ background-color: hsl(var(--b1));
+ border-radius: 0.5rem;
+ box-shadow: 0 1px 3px rgba(0,0,0,0.1);
+}