MIPS架构下的并行IO接口实验指南

需积分: 0 1 下载量 81 浏览量 更新于2024-06-30 收藏 2.98MB PDF 举报
"04&05_并行IO接口实验1" 本次实验是华中科技大学电子信息与通信学院杨明老师指导的计算机组成原理与接口技术课程的一部分,主要针对MIPS架构进行并行IO接口的学习与实践。实验内容涵盖GPIO(General Purpose Input/Output)接口的原理、使用以及中断控制方式的IO接口设计。实验目标在于让学生掌握GPIOIP核的工作原理,中断控制的设计方法,包括查询方式、中断方式和延时方式。 实验的目的包括: 1. 理解并熟练运用GPIOIP核,理解其工作流程。 2. 学习中断控制方式的IO接口设计,了解中断处理的原理。 3. 掌握中断程序设计方法,包括查询、中断和延时等控制方式。 实验任务分为四个部分,分别在第11、13章的内容基础上进行: 1. 按键输入并显示到console,通过查询和中断两种方式实现。 2. 独立式开关输入并显示到console,同样采用查询和中断两种方法。 3. LED走马灯输出,利用延时和中断实现动态效果。 4. 数码管滚动输出任意数字,结合延时和中断技术完成动态显示。 实验的时间安排跨越三周,其中课堂上预计占用2至2.5次课的时间,其余时间由学生自行安排完成课外部分。 实验前,学生需要建立最小的硬件系统,具体步骤参照实验书第11章的内容,并且需要参考左老师的实验视频作为补充资料。实验过程中,学生将使用Nexys4实验板,这是一款常见的FPGA开发平台,适用于硬件描述语言编程和数字电路实验。实验板上的GPIO和INTC(Interrupt Controller)组件将被用来实现与外部设备的交互,学生需要学习如何配置和控制这些硬件资源,以实现各种IO接口功能。 在GPIO硬件设计中,学生会学习如何配置GPIO引脚,设置输入输出模式,以及如何读写数据。而在GPIO应用软件设计环节,学生则需要编写相应的驱动程序和中断服务程序,以实现对硬件操作的控制。最后,通过系统功能测试,验证所设计的IO接口是否能正常工作,确保查询、中断和延时方式都能正确实现。 通过这个实验,学生不仅能够加深对计算机硬件接口的理解,还能提升在实际项目中解决问题的能力,为后续更复杂的系统设计打下坚实基础。

加速这一段代码#include <thread> #include <mutex> // 用于保护m_vpdEdgePoints和m_vdEdgeGradient的锁 std::mutex g_mutex; void process_edges(const cv::Mat& RoiMat, const std::vector<cv::Point2d>& m_vpdEquinoxPoints, const double m_dMeasureLength, const double m_dMeasureHeight, const double m_dSigma, const int m_nThresholdCircle, const int m_nTranslationCircle, const std::vector<double>& m_vdMeasureAngle, std::vector<cv::Point2d>& m_vpdEdgePoints, std::vector<double>& m_vdEdgeGradient, int start_idx, int end_idx, Extract1DEdgeCircle Extract1DEdgeCircle) { std::vector<Edge1D_Result> edges; for (int i = start_idx; i < end_idx; i++) { edges = Extract1DEdgeCircle.Get1DEdge(RoiMat, m_vpdEquinoxPoints[i], m_dMeasureLength, m_dMeasureHeight,m_vdMeasureAngle[i], m_dSigma, m_nThresholdCircle, m_nTranslationCircle == 1 ? Translation::Poisitive : Translation::Negative, Selection::Strongest); // 使用锁保护m_vpdEdgePoints和m_vdEdgeGradient //std::lock_guard<std::mutex> lock(g_mutex); for (int j = 0; j < edges.size(); j++) { m_vpdEdgePoints.push_back(edges[j].m_pdEdgePoint); m_vdEdgeGradient.push_back(edges[j].m_dGradient); } } } const int num_threads = 10; std::vector<std::thread> threads(num_threads); std::vector<std::vector<cv::Point2d>> edge_points(num_threads); std::vector<std::vector<double>> edge_gradients(num_threads); for (int i = 0; i < num_threads; i++) { int start_idx = i * m / num_threads; int end_idx = (i + 1) * m / num_threads; threads[i] = std::thread(process_edges, std::ref(RoiMat), std::ref(m_vpdEquinoxPoints), m_dMeasureLength, m_dMeasureHeight, m_dSigma, m_nThresholdCircle, m_nTranslationCircle, std::ref(m_vdMeasureAngle), std::ref(edge_points[i]), std::ref(edge_gradients[i]), start_idx, end_idx, Extract1DEdgeCircle); } for (int i = 0; i < num_threads; i++) { threads[i].join(); // 合并结果 m_vpdEdgePoints.insert(m_vpdEdgePoints.end(), edge_points[i].begin(), edge_points[i].end()); m_vdEdgeGradient.insert(m_vdEdgeGradient.end(), edge_gradients[i].begin(), edge_gradients[i].end()); }

2023-05-25 上传