我写了一个简单的程序,它将2D数组中的数据从一个模块发送到另一个模块,但它似乎不起作用,我不知道为什么。这是我的代码:
Server.h
internal class Sound
{
public string Name { get; set; }
public string AudioFile { get; set; }
public BitmapImage WhiteImage { get; set; }
public BitmapImage BlackImage { get; set; }
public KeyColor Color { get; set; }
public Sound(string name, KeyColor color)
{
Name = name;
Color = color;
if (color == KeyColor.Black)
{
BlackImage = new BitmapImage(new Uri("ms-appx:///Assets/Images/Black.png"));
AudioFile = string.Format("ms-appx:///Assets/Audio/22.wav", name);
}
else if (color == KeyColor.White)
{
WhiteImage = new BitmapImage(new Uri("ms-appx:///Assets/Images/White.PNG"));
AudioFile = string.Format("ms-appx:///Assets/Audio/11.wav", name);
}
}
}
public enum KeyColor
{
Black,
White
}
Server.cpp
#include <iostream>
#include "stdafx.h"
using namespace std;
SC_MODULE(Server){
sc_in <bool> clock;
sc_fifo_out <sc_uint<20> > writePath;
bool init_flag;
int numRobots;
void Server_Main();
SC_CTOR(Server){
init_flag = 0;
numRobots = 4;
SC_METHOD(Server_Main){ sensitive << clock.pos(); }
}
};
Sensor.h
#include "stdafx.h"
#include "Server.h"
void Server::Server_Main(){
if (init_flag == 0){
int robotPath[4][5] = {
{ 1, 2, 3, 4, 1 },
{ 2, 1, 6, 3, 4 },
{ 3, 2, 9, 5, 1 },
{ 4, 1, 6, 8, 7 }
};
//Write robot path to Sensor
for (int i = 0; i < numRobots; i++){
for (int j = 0; j < 5; j++){
cout << "SERVER MODULE: Write Robot Paths " << i << ": " << robotPath[i][j] << endl;
writePath.write(robotPath[i][j]);
}
}
init_flag = 1;
}
else{ sc_stop(); }
}
Sensor.cpp
#include <iostream>
#include "stdafx.h"
using namespace std;
SC_MODULE(Sensor){
//sc_in <bool> clock;
sc_fifo_in <sc_uint<20> > readPath;
int robotPath[4][5];
void loadPath();
//void Sensor_Main();
SC_CTOR(Sensor){
//SC_METHOD(Sensor_Main){ sensitive << clock.pos(); }
SC_THREAD(loadPath){}
}
};
Main.cpp的
#include "stdafx.h"
#include "Sensor.h"
void Sensor::loadPath(){
int i = 0;
int j = 0;
while (1){
robotPath[i][j] = readPath.read();
cout << "SENSOR MODULE: Read Robot " << i << " Path " << j << " : " << robotPath[i][j] << endl;
if (j == 4){
j = 0; //Set index to beginning of array
i++; //Move to next robot
}
else{ j++; } //Continue loading path for current robot
}
}
以下是我的输出结果:
当程序尝试将#include "stdafx.h"
#include <iostream>
#include "Sensor.h"
#include "Server.h"
using namespace std;
int sc_main(int argc, char* argv[])
{
sc_clock clock("sysclock", 50, SC_MS, .5);
sc_fifo <sc_uint<20> > robotPath;
Sensor sensor_mod("Sensor");
sensor_mod.readPath(robotPath);
Server server_mod("Server");
server_mod.clock(clock);
server_mod.writePath(robotPath);
sc_start();
return 0;
}
写入fifo但是我不确定原因时似乎抛出异常。我指定我的fifo大小为20,以便它可以一次存储20个值,但我不发送超过20个值,当我尝试写第17个值时发生这个异常,所以也许我误解了robotPath[3][1]
的使用。这可能是一个明显的错误,我可以忽略,但我现在已经烧坏了,无法弄清楚它是什么搞乱了。
答案 0 :(得分:1)
您是尝试使用SystemC建模硬件设计还是尝试使用SystemC进行软件建模? 你好像混淆了上下文。
以下是您需要考虑的指针列表:
在服务器模块中,Server_Main()应注册为SC_THREAD:
SC_THREAD(Server_Main);
sensitive << clk.pos();
由于您使用的是内部调用wait()的sc_fifo写入方法,因此在SystemC中使用SC_METHOD中的wait是非法的。
修改Server.cpp,如下所述:
void Server::Server_Main() {
int robotPath[4][5] = {{ 1, 2, 3, 4, 1 },
{ 2, 1, 6, 3, 4 },
{ 3, 2, 9, 5, 1 },
{ 4, 1, 6, 8, 7 }};
//Write robot path to Sensor
for (int i = 0; i < numRobots; i++){
for (int j = 0; j < 5; j++){
cout << "SERVER MODULE: Write Robot Paths " << i << ": " << robotPath[i][j] << endl;
writePath.write(robotPath[i][j]);
wait(); //< Notice this wait statement.
}
}
}
在Sensor.cpp的while循环中添加 wait()语句。
sc_fifo&lt; sc_uint&LT; 20 - ; &gt; 没有像您想象的那样实例化深度为20的 sc_fifo 。
实际上,实例化 sc_fifo ,其中 sc_uint&lt; 20&gt; 作为数据类型,用于建模20位无符号整数,默认深度为fifo,按16 SystemC规范。
您可以实例化深度为20的 sc_fifo&lt;&gt; ,如下所述:
sc_fifo<sc_uint<20> > robotPath("robotPath", 20);
注意:您不需要这样做,因为上述从SC_METHOD更改为SC_THREAD并且还更新 Server_Main 将使此行为无效。