c和hdl对偶关系

张开发
2026/5/19 10:06:54 15 分钟阅读
c和hdl对偶关系
参考Vitis HLS.csdnVitis HLS流水灯测试.csdn嵌入式协程Protothread.csdnmyhdl.csdnAmaranth HDL.csdn图表类别VerilogC / 嵌入式说明时钟 / 循环always (posedge clk)for(;;)或主循环时钟触发逻辑 ↔ 主循环轮询延时 /定时#5/#10nsusleep(5)/HAL_Delay(5)硬件延时 ↔ 软件延时复位 / 初始化if (rst)/posedge rst/rst_ninit();/memset()/if(!rst_n)硬件复位 ↔ 软件初始化状态机state IDLE/BUSY/DONE/next_state ...enum {IDLE,BUSY,DONE}; state next_state;硬件状态机 ↔ 软件状态机条件判断if (enable) ... else ...if(enable){...} else {...}逻辑判断循环for(i0;iN;i)/while(cond)for(...)/while(...)串行操作 / 循环输入握手i_valid/wr_enwhile(!ready); send(data);/ HAL 写函数输入数据准备 / 写总线输出握手o_ready/done检查返回标志 /while(!done)输出完成 / 任务完成中断 / 事件irq/posedge capture_eventISR() /if(event_flag)硬件中断 / 软件中断处理并行 /串行a b; c d;/shift_reg顺序赋值ab;cd;/ 循环操作并行更新 ↔ 软件顺序执行逻辑反转 /高低有效~signal/rst_nsignal ^1/if(!rst_n)逻辑翻转 / 低有效信号变量 /寄存器reg [7:0] data;/wire [7:0] addr;int data;/uint8_t addr;存储元素 / 信号对应变量模块 /函数module {...}function() {...}硬件模块 ↔ 软件函数Protothread一段c能机械的转换成hdl,一段hdl也能机械的转换成c#includeap_int.h#includestdint.h#ifndef__PROTOTHREAD_H__#define__PROTOTHREAD_H__//1ms的时钟周期数#definePT_THREAD_TICK_MS27000#definePT_IN_DATA_W1#definePT_OUT_DATA_W1class Protothread;typedefvoid(*PtRunFun)(Protothread*pt);class Protothread{public:Protothread(){m_delay0;m_state0;m_next_state0;m_i0;}voidRestart(){_ptLine0;}voidStop(){_ptLineLineNumberInvalid;}boolIsRunning(){return_ptLine!LineNumberInvalid;}voidPtOsDelay(uint32_ttick){m_delaytick;}voidPtOsDelayMs(uint32_tms){m_delayms*PT_THREAD_TICK_MS;}boolRun(){returntrue;}protected:uint32_tm_delay;typedefunsignedshortLineNumber;staticconstLineNumber LineNumberInvalid(LineNumber)(-1);LineNumber _ptLine;public:uint8_tm_i;uint8_tm_state;uint8_tm_next_state;ap_uintPT_IN_DATA_Wm_indata;ap_uintPT_OUT_DATA_Wm_outdata;};#definePT_BEGIN()bool ptYieldedtrue;(void)ptYielded;switch(_ptLine){case0:#definePT_END()default:;}Stop();returnfalse;#definePT_WAIT_UNTIL(condition)\do{_ptLine__LINE__;case__LINE__:\if(!(condition))returntrue;}while(0)#definePT_WAIT_WHILE(condition)PT_WAIT_UNTIL(!(condition))#definePT_WAIT_THREAD(child)PT_WAIT_WHILE((child).Run())#definePT_SPAWN(child)\do{(child).Restart();PT_WAIT_THREAD(child);}while(0)#definePT_RESTART()do{Restart();returntrue;}while(0)#definePT_EXIT()do{Stop();returnfalse;}while(0)#definePT_YIELD()\do{ptYieldedfalse;_ptLine__LINE__;case__LINE__:\if(!ptYielded)returntrue;}while(0)#definePT_YIELD_UNTIL(condition)\do{ptYieldedfalse;_ptLine__LINE__;case__LINE__:\if(!ptYielded||!(condition))returntrue;}while(0)#definePT_DELAY(v)\do{\m_delayv;\PT_WAIT_UNTIL(m_delay0);\}while(0)#definePT_DELAY_MS(v)\do{\m_delayv*PT_THREAD_TICK_MS;\PT_WAIT_UNTIL(m_delay0);\}while(0)#defineWHILE(a)PT_BEGIN();\while(1)#define__ON_TICK__voidOnTick(){if(m_delay0){Run();}else{m_delay--;}}#endif#includeProtothread.hclass LedPt0:public Protothread{public:__ON_TICK__ boolRun(){WHILE(1){PT_DELAY_MS(10);m_outdata1^m_outdata;PT_DELAY_MS(15);m_outdata1^m_outdata;PT_DELAY_MS(20);m_outdata1^m_outdata;PT_DELAY_MS(25);m_outdata1^m_outdata;PT_DELAY_MS(30);m_outdata1^m_outdata;PT_DELAY_MS(35);m_outdata1^m_outdata;}PT_END();}};class LedPt1:public Protothread{public:__ON_TICK__ boolRun(){// 延时1sPtOsDelayMs(1000);//按下闪,松开灭if(m_indata0){m_outdata1^m_outdata;}else{m_outdata1;}return0;}};voidmy_led_key(ap_uint1key,// 按键输入低有效ap_uint2*led,// LED 输出){#pragmaHLS INTERFACE ap_none portkey#pragmaHLS INTERFACE ap_none portled#pragmaHLS INTERFACE ap_ctrl_none portreturnstaticLedPt0 ledPt0;staticLedPt1 ledPt1;ledPt0.m_indatakey;ledPt1.m_indatakey;ledPt0.OnTick();ledPt1.OnTick();*ledledPt1.m_outdata*2ledPt0.m_outdata;}

更多文章