【问题标题】:Priority 8-to-3 encoder in Verilog (case, casex)Verilog 中的优先级 8 到 3 编码器(case、casex)
【发布时间】:2023-03-31 06:15:01
【问题描述】:

我试图描述一个 SN54LS348 元件(8 线到 3 线优先级编码器)。 真值表是:

          INPUTS            OUTPUTS   
E | 0 1 2 3 4 5 6 7 ** A2 A1 A0 | GS EO
///////////////////////////////////////
H | X X X X X X X X ** Z  Z  Z  | H  H
L | H H H H H H H H ** Z  Z  Z  | H  L
L | X X X X X X X L ** L  L  L  | L  H
L | X X X X X X L H ** L  L  H  | L  H
L | X X X X X L H H ** L  H  L  | L  H
L | X X X X L H H H ** L  H  H  | L  H
L | X X X L H H H H ** H  L  L  | L  H
L | X X L H H H H H ** H  L  H  | L  H
L | X L H H H H H H ** H  H  L  | L  H
L | L H H H H H H H ** H  H  H  | L  H

这是我的实现:

module L348 (E, D0, D1, D2, D3, D4, D5, D6, D7, A0, A1, A2, GS, EO);

input E, D0, D1, D2, D3, D4, D5, D6, D7;
output A0, A1, A2, GS, EO;

assign D = {D0, D1, D2, D3, D4, D5, D6, D7};

parameter HIGH_IMPEDANCE = 3'bz;

reg [7:0] MASK_1 = 8'b0000_0001;
reg [7:0] MASK_2 = 8'b0000_0011;
reg [7:0] MASK_3 = 8'b0000_0111;
reg [7:0] MASK_4 = 8'b0000_1111;
reg [7:0] MASK_5 = 8'b0001_1111;
reg [7:0] MASK_6 = 8'b0011_1111;
reg [7:0] MASK_7 = 8'b0111_1111;
reg [7:0] MASK_8 = 8'b1111_1111;

reg [2:0] A;
reg [1:0] GS_EO;
reg [7:0] temp;

reg [7:0] mem [7:0];

initial
begin
mem[0] = MASK_1;
mem[1] = MASK_2;
mem[2] = MASK_3;
mem[3] = MASK_4;
mem[4] = MASK_5;
mem[5] = MASK_6;
mem[6] = MASK_7;
mem[7] = MASK_8;
temp = 8'bxxxx_xxxx;
end

assign {A2, A1, A0} = A;
assign {GS, EO} = GS_EO;

integer i;

always @(*)
begin
for (i = 7; i > 0; i = i - 1)
    if (mem[i] & D == mem[i])
        begin
        temp = mem[i];
        i = -1;
        end
if (E)
    begin
    A = HIGH_IMPEDANCE;
    GS_EO = 2'b11;
    end
else
    begin
        if (temp == 8'b1111_1111)
            begin
            A = HIGH_IMPEDANCE;
            GS_EO = 2'b10;
            end
        else
            begin

            GS_EO = 2'b01;
            case (temp)
                8'b0000_0001: A = 3'b001;
                8'b0000_0011: A = 3'b010;
                8'b0000_0111: A = 3'b011;
                8'b0000_1111: A = 3'b100;
                8'b0001_1111: A = 3'b101;
                8'b0011_1111: A = 3'b110;
                8'b0111_1111: A = 3'b111;
            endcase

            end
    end
end
endmodule 

它无法实现始终处于X状态的信号A2-A0的切换(E = H时除外)。我尝试了很多解决方案,但感觉模拟器无法管理“case”块(我也尝试了“casex”块)。某处有一个错误,但我无法弄清楚。有人有想法吗?

【问题讨论】:

    标签: login switch-statement bit-manipulation verilog system-verilog


    【解决方案1】:

    这里发生了很多事情,但最直接的问题可能是。

    assign D = {D0, D1, D2, D3, D4, D5, D6, D7};
    

    这个隐式定义的线只有 1 位宽,所以高 7b 将被丢弃。 Verilog 不好玩吗?

    还有其他逻辑问题,但是用case语句做优先级编码器最简单的方法如下:

    casez (in)
      4'b???1 : out = 0;
      4'b??10 : out = 1;
      4'b?100 : out = 2;
      4'b1000 : out = 3;
      default : out = 0; //no match
    endcase
    

    casez 允许您输入? 用于类似于您的真值表的无关条件。采用第一个匹配条目,为您提供优先行为。 根据您的情况调整宽度、优先级方向、IO 宽度等...

    最后,作为一种风格问题,您的早期循环终止应该使用break,而不是直接修改循环变量。

    【讨论】:

    • 嗯,我听说在 Verilog 中使用“break”表达式是非常糟糕的编程风格。
    • 可以的。在行为代码中,我肯定会选择“break”。我实际上不确定这两种风格是否可以合成。在 RTL 中处理此问题的常用方法是对循环进行编码,使其始终运行 'i' 的所有值,但最后一次成功的匹配将是您想要的。
    • 是的,上面代码的主要问题是 1 位字长的“D”网络。感谢您的回复!
    猜你喜欢
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多