LS374锁存器数据验证方法正确性咨询
LS374锁存器工作状态验证方法咨询
我使用两片LS374锁存器,通过逻辑分析仪捕获了时钟信号(IOWR)触发下的锁存器输入、输出数据并保存为文本文件,编写了如下C++程序验证锁存器工作状态,但检测到部分时间段锁存数据异常,截图如下:

#include <iostream> #include <iomanip> #include <vector> #include <sstream> #include <fstream> #include <string> using namespace std; struct Data { double time; int latchA1, latchCS1, latchCS2; int D0, D1, D2, D3; int IOWR; int MPC_A1, MPC_CS1, MPC_CS2; int MPC_D0, MPC_D1, MPC_D2, MPC_D3; }; // 从文本文件加载数据 vector<Data> loadData(const string& filename) { vector<Data> dataList; ifstream file(filename); if (!file.is_open()) { cerr << "打开文件失败。" << endl; return dataList; } string line; while (getline(file, line)) { stringstream ss(line); Data data; char comma; ss >> data.time >> comma >> data.latchA1 >> comma >> data.latchCS1 >> comma >> data.latchCS2 >> comma >> data.D0 >> comma >> data.D1 >> comma >> data.D2 >> comma >> data.D3 >> comma >> data.IOWR >> comma >> data.MPC_A1 >> comma >> data.MPC_CS1 >> comma >> data.MPC_CS2 >> comma >> data.MPC_D0 >> comma >> data.MPC_D1 >> comma >> data.MPC_D2 >> comma >> data.MPC_D3; dataList.push_back(data); } file.close(); return dataList; } // 将锁存器输出组合为十六进制值 string combineQsToHex(const Data& data) { // 组合锁存器输出为8位值 int latchOutput = (data.latchA1 << 6) | (data.latchCS1 << 5) | (data.latchCS2 << 4) | (data.D0 << 3) | (data.D1 << 2) | (data.D2 << 1) | data.D3; stringstream ss; ss << hex << setw(2) << setfill('0') << latchOutput; return ss.str(); } // 将MPC输入组合为十六进制值 string combineDsToHex(const Data& data) { // 组合MPC输入为8位值 int mpcInput = (data.MPC_A1 << 6) | (data.MPC_CS1 << 5) | (data.MPC_CS2 << 4) | (data.MPC_D0 << 3) | (data.MPC_D1 << 2) | (data.MPC_D2 << 1) | data.MPC_D3; stringstream ss; ss << hex << setw(2) << setfill('0') << mpcInput; return ss.str(); } // 打印十六进制数据 void printHexData(const Data& data) { cout << "时间: " << fixed << setprecision(10) << data.time << "s\t"; cout << "锁存器输出(十六进制): 0x" << combineQsToHex(data) << "\t"; cout << "MPC输入(十六进制): 0x" << combineDsToHex(data) << endl; } // 处理锁存器数据 void processLatchData(const vector<Data>& dataList) { bool lastIOWRWas1 = false; bool transitionDetected = false; for (const auto& data : dataList) { if (data.IOWR == 0 && lastIOWRWas1 && !transitionDetected) { // 检测到从1到0的跳变 transitionDetected = true; } else if (data.IOWR == 1 && transitionDetected) { // 检测到从0到1的跳变 string latchHex = combineQsToHex(data); string mpcHex = combineDsToHex(data); if (latchHex == mpcHex) { printHexData(data); } else { cout << "时间 " << fixed << setprecision(10) << data.time << "s 处锁存数据异常" << endl; printHexData(data); } transitionDetected = false; // 重置跳变检测标志 } lastIOWRWas1 = (data.IOWR == 1); } } int main() { string filename = "data.txt"; // 在此指定你的文件名 vector<Data> dataList = loadData(filename); if (dataList.empty()) { cerr << "无数据可处理。" << endl; return 1; } processLatchData(dataList); return 0; }
样本数据文件为30.07.2024 without internal lcd2.rar压缩包内的文本文件。
验证方法的问题分析
1. 触发逻辑匹配错误
LS374是上升沿触发锁存器,数据在时钟信号的上升沿(0→1)被锁存。当前代码检测的是IOWR完整的1→0→1周期后对比数据,没有捕获上升沿瞬间的输入输出状态,此时输入数据可能已经发生变化,导致对比结果不准确。
2. 数据位拼接不完整
LS374是8位锁存器,但你的combineQsToHex和combineDsToHex函数仅拼接了7位数据(从latchA1<<6到D3),缺失1位数据;同时需要确认位拼接顺序是否和硬件接线一致,若高低位颠倒也会导致数据对比异常。
3. 异常判断逻辑有局限
代码仅在IOWR完成完整高低高跳变后才检查数据,若逻辑分析仪采样点未完整覆盖跳变过程,可能遗漏真实异常或误判正常情况。
修正建议
- 改为检测IOWR的上升沿(0→1),获取上升沿时刻的输入(MPC_)和锁存器输出(latch)数据进行对比
- 补充缺失的第8位数据,确认硬件接线的位顺序,确保拼接逻辑与实际电路匹配
- 增加上升沿前后的数据变化验证,确认锁存器触发后是否保持住了输入数据
内容的提问来源于stack exchange,提问作者Andre Ahmed
相关产品推荐
相关产品推荐

