c++//文件:decoder2by4.h
#pragma once
#include <systemc>
using namespace sc_core;
using namespace sc_dt;
/**
* 2-to-4线译码器模型
*
* 该模型实现了一个2-to-4线的译码器,即通过2位选择信号控制输出4位数据。
* 输入包括一个使能信号和2位选择信号,输出为4位数据。
*
* 输入:
* - enable: 使能信号,当该信号为高电平时,译码器工作。
* - select: 2位选择信号,用于选择输出的4位数据。
* 输出:
* - z: 4位数据输出,根据select信号的不同取值,输出不同的4位数据。
*/
SC_MODULE(decoder2by4) {
sc_in<bool>enable; // 使能信号输入
sc_in<sc_uint<2> >select; // 2位选择信号输入
sc_out<sc_uint<4> >z; // 4位数据输出
// 处理译码逻辑的内部函数
void prc_decoder2by4();
SC_CTOR(decoder2by4){ // 构造函数
SC_METHOD(prc_decoder2by4); // 将prc_decoder2by4方法与enable和select信号关联
sensitive <<enable<<select;
}//注意:此处无分号。
};
//文件:decoder2by4.cpp
#include "decoder2by4.h"
/**
* @brief 执行2比4解码器的处理函数。
* 该函数根据输入的使能信号和选择信号,来确定输出信号z的值。
* 当使能信号有效时,根据选择信号的不同取值,输出不同的z值。
* 当使能信号无效时,输出信号z固定为0xF。
*/
void decoder2by4::prc_decoder2by4(){
if(enable){ // 当使能信号为高电平时
switch(select.read()){ // 根据选择信号的值来确定输出z的值
case 0:z=0xE;break;
case 1:z=0xD;break;
case 2:z=0xB;break;
case 3:z=0x7;break;
}
}
else // 当使能信号为低电平时
z=0xF; // 输出信号z固定为0xF
}
c++//文件:driver.h
#pragma once
#include<systemc>
using namespace sc_core;
using namespace sc_dt;
/*
* @brief driver模块,用于提供驱动逻辑。
*
* 该模块包含三个输出信号:d_a, d_b, d_cin,并通过prc_driver过程来控制这些信号的逻辑行为。
*/
SC_MODULE(driver){
// 输出信号声明
sc_out<bool>d_enble;
sc_out<sc_uint<2> >d_select;
/**
* @brief prc_driver过程,模块的主要逻辑过程。
*
* 该过程为线程,用于控制和驱动输出信号d_a, d_b, d_cin的行为。
*/
void prc_driver();
/**
* @brief driver模块的构造函数。
*
* 通过构造函数初始化模块,创建并启动prc_driver过程。
*/
SC_CTOR(driver){
SC_THREAD(prc_driver); // 创建并启动一个线程过程prc_driver
}
};
//文件:driver.cpp
#include "driver.h"
/**
* @brief driver类的prc_driver函数
*
* 此函数无参数和返回值。是一个无限循环过程,用于周期性地改变d_select的值,并通过d_enble信号控制。
* 每次循环,d_enble被设置为0,然后设置d_select为当前pattern的值,等待一段时间后,d_enble被设置为1,再等待相同的时间。
* 在每次循环结束时,pattern值自增。
*/
void driver::prc_driver() {
sc_uint<2>pattern; // 定义一个2位的无符号整型变量pattern,用于存储当前的模式值
pattern=0; // 初始化pattern为0
while (1) // 一个无限循环,用于周期性地处理任务
{
d_enble=0; // 禁用d_enble信号
d_select=pattern; // 设置d_select为当前的pattern值
wait(5,SC_NS); // 等待5纳秒
d_enble=1; // 启用d_enble信号
wait(5,SC_NS); // 再等待5纳秒
pattern++; // pattern值自增,准备下一次循环
}
}
//文件:monitor.h
#pragma once
#include <systemc>
using namespace sc_core;
using namespace sc_dt;
/**
* @brief 监视器模块,用于监控输入信号并执行特定处理。
*/
SC_MODULE(monitor){
sc_in<bool> m_enble; // 输入使能信号,用于控制监视器的激活状态
sc_in<sc_uint<2> >m_select; // 输入选择信号,用于选择监视器关注的信号通道
sc_in<sc_uint<4> >m_z; // 输入信号,具体功能依据上下文和选择信号而定
/**
* @brief 监视器处理函数,对输入信号进行处理。
* 根据输入使能信号、选择信号以及输入信号执行相应的处理逻辑。
*/
void prc_monitor();
/**
* @brief 监视器构造函数,初始化监视器模块。
* 配置监视器处理函数prc_monitor,使其对输入使能信号、选择信号以及输入信号敏感。
*/
SC_CTOR(monitor){
SC_METHOD(prc_monitor); // 配置处理方法
sensitive << m_enble<<m_select<<m_z; // 指定处理方法对哪些信号敏感
}
};
//文件:monitor.cpp
#include "monitor.h"
/**
* @brief 实现监控器的处理函数
* 该函数用于监控并打印当前时间以及变量a、b、carry_in、sum、carry_out的值。
*
*/
void monitor::prc_monitor() {
// 打印当前时间及传入参数和内部状态的值
std::cout<<"At time"<<sc_time_stamp()<<"::";
std::cout<<"(enble,select):";
std::cout<<m_enble<<m_select;
std::cout<<"(z):"<<m_z<<std::endl;
}
//文件:decoder2by4_main.cpp
#include <systemc>
#include"decoder2by4.h"
#include"driver.h"
#include"monitor.h"
using namespace sc_core;
using namespace sc_dt;
/**
* @brief 主函数:建立并运行一个SC系统。
*
* @param argc 参数个数。
* @param argv 参数值数组。
* @return int 总是返回0,表示正常结束。
*/
int sc_main(int argc, char* argv[]) {
// 定义三个SC信号:一个布尔型使能信号,一个2位宽度的选择信号,一个4位宽度的结果信号
sc_signal<bool> t_enble;
sc_signal<sc_uint<2> >t_select;
sc_signal<sc_uint<4> >t_z;
// 实例化一个2选4解码器和一个波形生成器驱动
decoder2by4 de1("Decoder2By4");
driver d1("GenerateWaveforms");
// 连接解码器的输出到驱动的输入
de1<<t_enble<<t_select<<t_z;
// 连接驱动的控制信号到解码器
d1.d_enble(t_enble);
d1.d_select(t_select);
// 实例化一个波形监视器,并连接其输入
monitor mo1("MonitorWaveforms");
mo1<<t_enble<<t_select<<t_z;
// 开始SC模拟,持续时间100ns
sc_start(100,SC_NS);
// 返回0,表示正常结束
return(0);
}
SystemC 2.3.3-Accellera --- Oct 4 2020 22:59:38 Copyright (c) 1996-2018 by all Contributors, ALL RIGHTS RESERVED Info: (I804) /IEEE_Std_1666/deprecated: positional binding using << or , is deprecated, use () instead. At time0 s::(enble,select):00(z):0 At time0 s::(enble,select):00(z):15 At time5 ns::(enble,select):10(z):15 At time5 ns::(enble,select):10(z):14 At time10 ns::(enble,select):01(z):14 At time10 ns::(enble,select):01(z):15 At time15 ns::(enble,select):11(z):15 At time15 ns::(enble,select):11(z):13 At time20 ns::(enble,select):02(z):13 At time20 ns::(enble,select):02(z):15 At time25 ns::(enble,select):12(z):15 At time25 ns::(enble,select):12(z):11 At time30 ns::(enble,select):03(z):11 At time30 ns::(enble,select):03(z):15 At time35 ns::(enble,select):13(z):15 At time35 ns::(enble,select):13(z):7 At time40 ns::(enble,select):00(z):7 At time40 ns::(enble,select):00(z):15 At time45 ns::(enble,select):10(z):15 At time45 ns::(enble,select):10(z):14 At time50 ns::(enble,select):01(z):14 At time50 ns::(enble,select):01(z):15 At time55 ns::(enble,select):11(z):15 At time55 ns::(enble,select):11(z):13 At time60 ns::(enble,select):02(z):13 At time60 ns::(enble,select):02(z):15 At time65 ns::(enble,select):12(z):15 At time65 ns::(enble,select):12(z):11 At time70 ns::(enble,select):03(z):11 At time70 ns::(enble,select):03(z):15 At time75 ns::(enble,select):13(z):15 At time75 ns::(enble,select):13(z):7 At time80 ns::(enble,select):00(z):7 At time80 ns::(enble,select):00(z):15 At time85 ns::(enble,select):10(z):15 At time85 ns::(enble,select):10(z):14 At time90 ns::(enble,select):01(z):14 At time90 ns::(enble,select):01(z):15 At time95 ns::(enble,select):11(z):15 At time95 ns::(enble,select):11(z):13 Info: (I804) /IEEE_Std_1666/deprecated: You can turn off warnings about IEEE 1666 deprecated features by placing this method call as the first statement in your sc_main() function: sc_core::sc_report_handler::set_actions( "/IEEE_Std_1666/deprecated", sc_core::SC_DO_NOTHING );
本文作者:古月流新
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!