日常记录(66)设计

module的参数例化

module async_fifo #(parameter FIFO_PTR = 4, FIFO_WIDTH = 32)([port_list])

格雷码转换与generate结构

generate语句可以配合genvar实现将assign语句进行并行化处理。否则有有以下提示:

Generate for loop index variable must be a genvar.
Please refer to LRM (1364-2005), section 12.4.1 "Loop generate constructs".

二进制转换为了格雷码,

格雷码转换代码与测试:
代码中若不延时1个时间单位(i赋值后),则导致输出无法按时获得。

这个代码是将二进制转换为了格雷码,

module bin2grey #(parameter PTR=6)(grey_value, bin_value);
    input [PTR:0] bin_value;
    output [PTR:0] grey_value;

    assign grey_value[PTR] = bin_value[PTR];
    generate
        genvar i;
        for (i = 0; i < PTR; i=i+1) begin 
            assign grey_value[i] = bin_value[i+1] ^ bin_value[i];
        end
    endgenerate
endmodule

module test_case ();
    reg [3:0] input_data;
    wire [3:0] output_data;

    bin2grey #(3) b2g(output_data, input_data);
    initial begin
        bit [4:0] i;
        bit [3:0] arr[$]; 
        assign input_data = i;
        for (i = 0; i < 16 ; i=i+1) begin
            #1;
            $display("%04b, output is grey :%04b",i, output_data);
            arr.push_back(output_data);
        end
        $finish();
    end
endmodule


输出结果:

0000, output is grey :0000
0001, output is grey :0001
0010, output is grey :0011
0011, output is grey :0010
0100, output is grey :0110
0101, output is grey :0111
0110, output is grey :0101
0111, output is grey :0100
1000, output is grey :1100
1001, output is grey :1101
1010, output is grey :1111
1011, output is grey :1110
1100, output is grey :1010
1101, output is grey :1011
1110, output is grey :1001
1111, output is grey :1000

格雷码转换为二进制码

module grey2bin #(parameter PTR=6)(grey_value, bin_value);
    input [PTR:0] grey_value;
    output [PTR:0] bin_value;

    assign bin_value[PTR] = grey_value[PTR];

    generate
        genvar i;
        for (i = 0; i < PTR; i=i+1) begin 
            assign bin_value[i] = bin_value[i+1] ^ grey_value[i];
        end
    endgenerate
endmodule

module test_case ();
    reg [3:0] input_data;
    wire [3:0] output_data;

    grey2bin #(3) g2b(input_data, output_data);
    initial begin
        int i;
        assign input_data = i;
        for (i = 0; i < 16 ; i=i+1) begin
            #1;
            $display("%04b, output bin is %04b",i, output_data);
        end
        $finish();
    end
endmodule

输出结果:

0000, output bin is 0000
0001, output bin is 0001
0010, output bin is 0011
0011, output bin is 0010
0100, output bin is 0111
0101, output bin is 0110
0110, output bin is 0100
0111, output bin is 0101
1000, output bin is 1111
1001, output bin is 1110
1010, output bin is 1100
1011, output bin is 1101
1100, output bin is 1000
1101, output bin is 1001
1110, output bin is 1011
1111, output bin is 1010

LFSR

可用于产生伪随机数列,用于PCIe加密,计数等。
分为伽罗瓦LFSR和斐波那契LFSR。前者由于两个触发器之间仅使用一个异或门,速度更快。

伽罗瓦4位,0-15的计数实现:

module lfsr_cnt_module (clk, rst_n, new_cntr_preset, ctr_expired);
    input clk;
    input rst_n;
    input new_cntr_preset;
    output ctr_expired;

    reg [3:0] lfsr_cnt, lfsr_cnt_nxt;
    wire [3:0] lfsr_cnt_xor;

    assign lfsr_cnt_xor[0] = lfsr_cnt[1];
    assign lfsr_cnt_xor[1] = lfsr_cnt[2];
    assign lfsr_cnt_xor[2] = lfsr_cnt[3] ^ lfsr_cnt[0];
    assign lfsr_cnt_xor[3] = lfsr_cnt[0];

    always @(*) begin
        if (new_cntr_preset) begin
            lfsr_cnt_nxt = 4'b1111;
        end else begin
            lfsr_cnt_nxt = lfsr_cnt_xor;
        end
    end

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            lfsr_cnt <= 4'b1111;
        end else begin
            lfsr_cnt <= lfsr_cnt_nxt;
        end
    end

    assign ctr_expired = (lfsr_cnt == 4'b0111);
    
endmodule

module lfsr_cnt_test ();
    logic clk, rst_n, preset, expired;

    lfsr_cnt_module lcm(clk, rst_n, preset, expired);
    initial begin
        clk = 0;
        forever begin
            #1 clk = ~clk;
        end
    end

    initial begin
        rst_n = 0;
        # 10 ;
        rst_n = 1;
        #100;
        $finish;
    end

    initial begin
        $monitor("%0t, value is %d",$time,  expired);
    end
endmodule

输出结果:

0, value is 0
37, value is 1
39, value is 0
67, value is 1
69, value is 0
97, value is 1
99, value is 0

汉明码

可以用于检错并进行一位的纠错。

奇偶校验

偶校验,数列中应该存在偶数个1。因此校验位和其它位的组合使得最终异或值为0,如111,则校验位为1,使得最终异或后为0.

汉明码

https://blog.csdn.net/weixin_44750790/article/details/106652968
本质上也是利用了偶校验,同时通过数字bit分组的形式,最终能够获得具体的错误位置,解码得到的校验位对错误位置进行取反,从错误中获得正确值。

以4位为传输数据为例,需要log4 + 1 = 3个校验位。
校验位的位置分别为2^0, 2^1, 2^2的位置,记作p0,p1,p2.
最终的数据传输为7个bit.
p2-p0,一共表示出8个数字,指示结果。

posted @ 2022-02-28 21:48  大浪淘沙、  阅读(188)  评论(0)    收藏  举报