【复旦微FM33LG0系列开发板测评】PGL功能和简析
原帖地址:【复旦微FM33LG0系列开发板测评】PGL功能和简析 - 国产芯片交流 - 电子工程世界-论坛 (eeworld.com.cn)
1、PGL功能 复旦微FM33LG0相比其他系列独特的性能是PGL,这个功能在FM33LC系列上也没有出现。具体手册中的 解释如下 可编程胶合逻辑(Programmable Glue Logic)是基于查找表(LUT)的简单可编程逻辑,其输入输 出可以连接到芯片引脚、内部信号,实现一些简单的胶合逻辑,在一些应用中可以帮助系统设计减 少PCB上的逻辑器件。 每个LUT包含4个输入,1个输出,1个真值表,可选的同步/滤波电路。用户通过对真值表编程,可 以获得期望的组合逻辑输出表达式。每个输入信号都可以被单独屏蔽。 PGL的基本特性如下: ⚫ 实现简单胶合逻辑,简化PCB设计 ⚫ 4个4输入查找表 ⚫ 可以通过真值表编程实现 AND,NAND,OR,NOR,XOR,NOT等逻辑表达式 ⚫ 时序同步或滤波 ⚫ 灵活的LUT输入选择:IO,内部信号,其他LUT输出 ⚫ 输出可以被连接到IO或其他外设触发 具体逻辑图如下就一目了然,
那么实际上就是一个可以查表法实现的逻辑芯片,在NXP中是作为PLC的功能实现的。 总共包括了4个上面的单元,
不过这个PGL的引脚是不能自定义的,而是已经分配给了固定的引脚
2、PGL编程说明 在编程的过程中,当使用LUT引脚输入时,需将对应引脚配置为GPIO输入,清除输入的MASK寄存器,并使能LUT。 当使用LUT引脚输出时,需将对应引脚配置为数字功能,并通过数字功能选择寄存器将引脚配置为 LUT输出,然后使能LUT。这功能通常是在GPL_init()的初始化函数中实现,如下范例代码 - void PGL_Init()
- {
- FL_GPIO_InitTypeDef GPIO_InitStruct = {0};
- FL_PGL_LUT_InitTypeDef lutInit;
- /*PC2、PC3为LUT0输入端口,配置成输入模式*/
- GPIO_InitStruct.pin = FL_GPIO_PIN_2 | FL_GPIO_PIN_3;
- GPIO_InitStruct.mode = FL_GPIO_MODE_INPUT;
- GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
- GPIO_InitStruct.pull = FL_DISABLE;
- GPIO_InitStruct.remapPin = FL_DISABLE;
- FL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- /*PC0为LUT0输出端口,配置成数字模式*/
- GPIO_InitStruct.pin = FL_GPIO_PIN_0;
- GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
- GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
- GPIO_InitStruct.pull = FL_DISABLE;
- GPIO_InitStruct.remapPin = FL_ENABLE;//数字功能复用
- FL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- /*PGL结构体配置*/
- lutInit.edge = FL_PGL_LUT_EDGE_NONE;
- lutInit.outMode = FL_PGL_LUT_OUTPUT_COMBINE_LOGIC;
- lutInit.input3 = FL_PGL_LUT_INPUT_DISABLE;
- lutInit.input2 = FL_PGL_LUT_INPUT_DISABLE;
- lutInit.input1 = FL_PGL_LUT_INPUT_GROUP0;
- lutInit.input0 = FL_PGL_LUT_INPUT_GROUP0;
- FL_PGL_LUT_Init(PGL, FL_PGL_LUT0, &lutInit);
- }
复制代码这个代码是初始化了第一单元LUT0的过程。 使用过程中是对真值表的写入和读取,通过输入状态组合查询LUT真值表中的数据,可以获得想要的组合逻辑功能。 每个LUT支持4输入,输入作为地址可以查询到16个输出,LUT本身就是一个4bit地址寻址的存储空 间。寄存器TRUTH[15:0]保存了16个输出数据,地址对应关系如下表所示。
在输入的部分是LUT 输入: 每个LUT有4个输入,每个输入都可以来自于引脚、芯片外设、或其他LUT输出。 通过INSEL寄存器,可以选择LUT输入信号源。 LUT 输出: LUT的输出可以连接到引脚、或其他LUT输入。 这样的配置还是有一定的灵活性,4组LUT可以级联或者并联起来,实现更复杂的逻辑,或者扩大逻辑输入的位数。
3. 范例代码 在官网提供的代码中,有一个PGL的例程,非常简明地实现了上述过程。 在主程序中顺次启动时钟和硬件等,然后根据上面的方法,初始化PGL, - int main(void)
- {
- /* Reset of all peripherals, Initializes the Flash inte**ce and the Systick. */
- /* SHOULD BE KEPT!!! */
- MF_Clock_Init();
- /* Configure the system clock */
- /* SHOULD BE KEPT!!! */
- MF_SystemClock_Config();
- /* Initialize FL Driver Library */
- /* SHOULD BE KEPT!!! */
- FL_Init();
- /* Initialize all configured peripherals */
- /* SHOULD BE KEPT!!! */
- MF_Config_Init();
- UserInit();
- Test_PGL();
- while(1)
- {
- LED0_TOG();
- FL_DelayMs(1000);
- }
- }
复制代码实现测试非常简单,直接对真值表置位,就可以启动PGL的功能, - void Test_PGL()
- {
- PGL_Init();
- /*真值表配置*/
- FL_PGL_WriteLUTTruthTable(PGL, FL_PGL_LUT0, 0x7);
- /*LUT使能*/
- FL_PGL_EnableLUT(PGL, FL_PGL_LUT0);
- }
复制代码当PGL启动时,根据真值表访问输出,上述真值表置位0x7,换算成二进制是0111,因为只访问后PC2,PC3,作为LUT0-0和LUT0-1输入,那么实际就形成或的输出。 具体实现方式可参考下面的例子,
在KEIL中编译通过,就可以下载到开发板上执行。 更改真值表,就改变了逻辑设置。
相比而言,还是可以实现一些内部逻辑功能,节省一个逻辑元件。
|