编辑
2024-03-19
SystemC
00
请注意,本文编写于 395 天前,最后修改于 395 天前,其中某些信息可能已经过时。

目录

2X4译码电路
验证功能
结果

2X4译码电路

2X4译码电路

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 许可协议。转载请注明出处!