我的GTIN-8代码不起作用

时间:2016-06-05 14:39:14

标签: validation python-3.x

我是编码的初学者,我正在尝试在python上编写这个GTIN-8代码,但它一直说无效的语法。请帮我。谢谢。顺便说一句,如果你能给我一些关于提高代码效率和其他建设性批评的建议,那就太好了。谢谢。

`include "definitions.v"

module controller(
    input                           clk,
    input                           nres,
    output reg                      ire,
    output reg                      dwe,
    output reg                      dre,
    output reg  [1:0]               x2,
    output reg  [`IADR_WIDTH-1:0]   i_address,
    output reg  [`DADR_WIDTH-1:0]   d_address,
    output reg  [`DATA_WIDTH-1:0]   data_out);

    reg [2:0] cycle = 3'b000;
    reg [2:0] next_cycle;

    reg [`IADR_WIDTH-1:0] PC  = 6'b000000;
    reg [`INST_WIDTH-1:0] IR  = 12'b00000_0000000;
    reg [`DADR_WIDTH-1:0] MAR = 6'b000000;        
    reg [4:0]             OPC = 5'b00000;

    wire [`DATA_WIDTH-1:0] data_in;
    wire [`INST_WIDTH-1:0] instruction;

    reg [1:0] x1;

    data_memory dmem        (   .clk        (clk),
                                .dwe        (dwe),
                                .dre        (dre),
                                .nres       (nres),
                                .d_address  (d_address),
                                .d_data     (data_out),
                                .d_q        (data_in));

    instruction_memory imem (   .clk        (clk),
                                .ire        (ire),
                                .i_address  (i_address),
                                .i_q        (instruction));

    reg ok = 1;

    always @ (posedge clk) begin
        cycle = (ok) ? next_cycle : cycle;
    end

    always @ (cycle) begin
        case (cycle)
            3'b000: begin
                ok = 0;
                MAR = PC;
                next_cycle = 3'b001;
                ire = 1'b1;
                x2 = 2'b00;
                ok = 1;
            end
            3'b001: begin
                ok = 0;
                i_address = MAR;
                IR = instruction;
                ire = 1'b0;
                next_cycle = 3'b010;
                x2 = 2'b01;
                ok = 1;
            end
            3'b010: begin
                ok = 0;
                OPC = IR;
                next_cycle = 3'b011;
                x2 = 2'b10;
                ok = 1;
            end
            3'b011: begin
                ok = 0;
                if (OPC==5'b01011)  x1 = 2'b11;
                PC = PC + 1;
                next_cycle = 3'b000;
                x2 = 2'b11;
                ok = 1;
            end
        endcase    
    end

endmodule

1 个答案:

答案 0 :(得分:0)

GS1代码有不同的长度,从GTIN-8(8位)到SSCC(2位应用ID + 18位)。这是一个简单的通用Python公式,适用于任何长度的GS1标识符:

cd = lambda x: -sum(int(v) * [3,1][i%2] for i, v in enumerate(str(x)[::-1])) % 10

说明:

  1. 将输入转换为字符串,因此输入可以是数字或字符串 - 只是一个便利因素。
  2. 反转字符串。这是将3x / 1x加权模式与输入对齐的更简单方法。
  3. 通过计算i mod 2,基于奇数和偶数输入字符位置选择加权因子。输入字符串中的最后一个字符(字符串被反转后i = 0)得到3x。
  4. 计算负加权和模10.相当于(10 - (sum mod 10)) mod 10方法,如果你完全遵循GS1手动计算大纲,你会得到,但那很难看。
  5. 测试用例

    ## GTIN-8
    >>> cd(1234567)
    0
    >>> cd(9505000)
    3
    
    ## GTIN-12
    >>> cd(71941050001)
    6
    >>> cd('05042833241')
    2
    
    ## GTIN-13
    >>> cd(900223631103)
    6
    >>> cd(501234567890)
    0
    
    ## GTIN-14
    >>> cd(1038447886180)
    4
    >>> cd(1001234512345)
    7
    
    ## SSCC (20 digits incl. application identifier)
    >>> cd('0000718908562723189')
    6
    >>> cd('0037612345000001009')
    1