verilog中case使用及资源消耗

背景描述:将一个独热码转换成二进制。

分析:由于当前使用的zynq是6输入的lut,设计一个较简单的12bit独热码转换为4bit的二进制。根据如下代码可以知道每一个bit都可以用一个lut解决问题。

第一版的代码:

assign binary_data                  = binary;    
always @(posedge clk) begin
        case(onehot_data) 
            VAL_0   : binary            <= 4'b0000;
            VAL_1   : binary            <= 4'b0001;
            VAL_2   : binary            <= 4'b0010;
            VAL_3   : binary            <= 4'b0011;
            VAL_4   : binary            <= 4'b0100;
            VAL_5   : binary            <= 4'b0101;
            VAL_6   : binary            <= 4'b0110;
            VAL_7   : binary            <= 4'b0111;
            VAL_8   : binary            <= 4'b1000;
            VAL_9   : binary            <= 4'b1001;
            VAL_10  : binary            <= 4'b1010;
            VAL_11  : binary            <= 4'b1011;
        endcase
end

资源消耗如下:verilog中case使用及资源消耗_第1张图片
其中后端的四个寄存器都接了一个CE信号,是由于case语句是检测onehot_data有变化才进行使能。
verilog中case使用及资源消耗_第2张图片
第二版代码修改了一下,增加default。
在case加入default即可,如下

assign binary_data                  = binary;    
always @(posedge clk) begin
        case(onehot_data) 
            VAL_0   : binary            <= 4'b0000;
            VAL_1   : binary            <= 4'b0001;
            VAL_2   : binary            <= 4'b0010;
            VAL_3   : binary            <= 4'b0011;
            VAL_4   : binary            <= 4'b0100;
            VAL_5   : binary            <= 4'b0101;
            VAL_6   : binary            <= 4'b0110;
            VAL_7   : binary            <= 4'b0111;
            VAL_8   : binary            <= 4'b1000;
            VAL_9   : binary            <= 4'b1001;
            VAL_10  : binary            <= 4'b1010;
            VAL_11  : binary            <= 4'b1011; 
            default : binary              <= 4'bxxxx;
        endcase
end

verilog中case使用及资源消耗_第3张图片
LUT数量直接减少。

第三版代码:

assign binary_data                  = binary;    
always @(posedge clk) begin
        case(onehot_data) 
            VAL_0   : binary            <= 4'b0000;
            VAL_1   : binary            <= 4'b0001;
            VAL_2   : binary            <= 4'b0010;
            VAL_3   : binary            <= 4'b0011;
            VAL_4   : binary            <= 4'b0100;
            VAL_5   : binary            <= 4'b0101;
            VAL_6   : binary            <= 4'b0110;
            VAL_7   : binary            <= 4'b0111;
            VAL_8   : binary            <= 4'b1000;
            VAL_9   : binary            <= 4'b1001;
            VAL_10  : binary            <= 4'b1010;
            VAL_11  : binary            <= 4'b1011; 
            default : binary              <= 4'b0000;
        endcase
end

如果将default改为4’b0000,LUT数量会继续增加,额外增加了很多判断条件。使用10个LUT。

你可能感兴趣的:(FPGA)