FPGA合成时钟门控单元到LUT而不是LDCE + AND?

时间:2018-04-02 09:49:00

标签: verilog fpga xilinx

我想用Verilog代码合成一个时钟门控单元,如下所示:

reg clk_en_i;
always @(clk_in or clk_en)begin
  if(!clk_in)
    clk_en_i <= clk_en;
end
assign clk_out= clk_in&clk_en_i;

但在FPGA合成之后,门控功能失败。我观看了Vivado的网表原理图,发现synplify将时钟门控单元合成到LUT6单元:LUT6

这不是一个无故障的门控电池!这就是函数失败的原因!

我试图通过Identify探测内部信号,但在FPGA合成之后,功能是正确的!我再次看了网表示意图:LDCE+AND

相同的Verilog代码产生不同的合成结果。为什么?我确定LUT6是错误的逻辑结果。有人可以解释这种奇怪的情况吗?

1 个答案:

答案 0 :(得分:0)

re_package = re.compile(r'^package +(.+);')

这看起来很可疑。无论// This is for completion of context variables and shortcuts public variableCompletionProvider = <monaco.languages.CompletionItemProvider>{ triggerCharacters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''), provideCompletionItems: (model, position, token) => { // Check if inside string quotes, then don't offer variable completion as inside quotes only area completion should be available var quotes = model.findMatches(`'([^'])*'`, true, true, true, null, true); if (quotes.length > 0) { for (let quote of quotes) { if (quote && (position.column >= quote.range.startColumn && position.column <= quote.range.endColumn)) { return; } } } // If I am not inside a string (quotes) then proceed with providing Completion // Some more Code Here ... } }; 状态如何,只要if(!clk_en) clk_en_i <= clk_en; 丢弃,您就会立即更新clk_en_i

也许,当clk_en为低时,您应该更改clk_in。像:

clk_en_i