8b10b解码的verilog实现代码,非查表代码。

此代码是8b10b解码的verilog实现代码,非查表代码。即rx端的解码。

此代码在项目中,已经使用多次,相当成熟。

 

module 8b10b_decode (datain, dispin, dataout, dispout, code_err, disp_err) ;
  input wire [9:0]   datain ;
  input wire  dispin ;
  output wire  [8:0]  dataout ;
  output wire   dispout ;
  output  wire code_err ;
  output  wire disp_err ;

  wire ai = datain[0] ;
  wire bi = datain[1] ;
  wire ci = datain[2] ;
  wire di = datain[3] ;
  wire ei = datain[4] ;
  wire ii = datain[5] ;
  wire fi = datain[6] ;
  wire gi = datain[7] ;
  wire hi = datain[8] ;
  wire ji = datain[9] ;

 

转载:https://blog.csdn.net/weixin_36590806/article/details/111059629

欢迎转载!

  wire aeqb = (ai & bi) | (!ai & !bi) ;
  wire ceqd = (ci & di) | (!ci & !di) ;
  wire p22 = (ai & bi & !ci & !di) |
       (ci & di & !ai & !bi) |
       ( !aeqb & !ceqd) ;
  wire p13 = ( !aeqb & !ci & !di) |
       ( !ceqd & !ai & !bi) ;
  wire p31 = ( !aeqb & ci & di) |
       ( !ceqd & ai & bi) ;

  wire p40 = ai & bi & ci &

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个8b10b解码器的Verilog实现代码查表代码: ```verilog module Decoder_8b10b( input clk, rst_n, input [9:0] data_in, output reg [7:0] data_out, output reg [1:0] code_err ); // Internal signals reg [7:0] data_reg; reg [4:0] disp_cnt; reg [1:0] comma_cnt; reg [1:0] code_err_reg; // Constants parameter K28_5 = 10'b0011110101; parameter K28_6 = 10'b0100001010; parameter K28_7 = 10'b0100010101; parameter K28_4 = 10'b0011101010; parameter K28_1 = 10'b0001110100; parameter K28_2 = 10'b0010001011; parameter K28_3 = 10'b0010010100; parameter K28_0 = 10'b0001101011; parameter K23_7 = 8'b11110101; parameter K23_6 = 8'b11101010; parameter K23_5 = 8'b11010101; parameter K23_4 = 8'b10101010; parameter K23_3 = 8'b01110101; parameter K23_2 = 8'b01101010; parameter K23_1 = 8'b01010101; parameter K23_0 = 8'b00101010; // State machine states parameter IDLE = 2'b00; parameter DISP = 2'b01; parameter COMMA = 2'b10; // State machine reg [1:0] state; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin state <= IDLE; data_reg <= 8'h00; disp_cnt <= 5'h00; comma_cnt <= 2'h00; code_err_reg <= 2'h00; end else begin case (state) IDLE: begin if (data_in == K28_5 || data_in == K28_6 || data_in == K28_7 || data_in == K28_4 || data_in == K28_1 || data_in == K28_2 || data_in == K28_3 || data_in == K28_0) begin state <= DISP; data_reg <= 8'h00; disp_cnt <= 5'h00; code_err_reg <= 2'h00; end else if (data_in == K23_7 || data_in == K23_6 || data_in == K23_5 || data_in == K23_4 || data_in == K23_3 || data_in == K23_2 || data_in == K23_1 || data_in == K23_0) begin state <= COMMA; data_reg <= 8'h00; comma_cnt <= 2'h00; code_err_reg <= 2'h00; end else begin data_out <= 8'h00; code_err <= 2'h01; end end DISP: begin if (disp_cnt < 5'h0A) begin disp_cnt <= disp_cnt + 1; end else begin state <= IDLE; data_out <= data_reg; code_err <= code_err_reg; end end COMMA: begin if (comma_cnt < 2'h02) begin comma_cnt <= comma_cnt + 1; end else begin state <= IDLE; data_out <= data_reg; code_err <= code_err_reg; end end endcase end end // Data register update always @(posedge clk or negedge rst_n) begin if (!rst_n) begin data_reg <= 8'h00; end else if (state == DISP) begin data_reg[6:0] <= {data_in[9:8], data_in[6:5], data_in[3:0]}; data_reg[7] <= ~(data_in[7] ^ data_in[4] ^ data_in[2] ^ data_in[0]); code_err_reg <= 2'h00; case (data_in) K28_5, K28_6, K28_7, K28_4: begin if (data_in[9:8] == 2'b01 || data_in[9:8] == 2'b10) begin code_err_reg <= 2'h02; end end K28_1, K28_2, K28_3, K28_0: begin if (data_in[9:8] == 2'b00 || data_in[9:8] == 2'b11) begin code_err_reg <= 2'h02; end if (~data_in[9] & ~data_in[8] & data_in[7:4] == 4'b1000) begin code_err_reg <= 2'h02; end end endcase end else if (state == COMMA) begin data_reg <= {data_in[9:4], data_in[3:0]}; code_err_reg <= 2'h00; case (data_in) K23_7, K23_6, K23_5, K23_4, K23_3, K23_2, K23_1, K23_0: begin if (data_in == K23_7 || data_in == K23_6 || data_in == K23_5 || data_in == K23_4) begin if (~data_in[7] & ~data_in[6] & data_in[5:2] == 4'b1000) begin code_err_reg <= 2'h02; end end else if (data_in == K23_3 || data_in == K23_2 || data_in == K23_1 || data_in == K23_0) begin if (~data_in[1] & ~data_in[0] & data_in[7:4] == 4'b1000) begin code_err_reg <= 2'h02; end end end endcase end end endmodule ``` 该解码器接收一个10位输入信号 `data_in`,并输出一个8位解码信号 `data_out` 和一个2位错误码 `code_err`。该解码器使用一个状态机来解码输入信号,并使用一个数据寄存器 `data_reg` 来存储当前解码的数据。在 `IDLE` 状态下,如果输入信号匹配任何一个8b/10b编码,则进入 `DISP` 状态或 `COMMA` 状态来解码数据或逗号。在 `DISP` 状态下,解码器将输入信号解码为一个8位数据,并在解码过程中检查错误。在 `COMMA` 状态下,解码器将输入信号解码为一个逗号,并检查错误。在任何时候,如果输入信号无法匹配任何编码,则解码器将输出 `code_err = 2'b01` 来指示错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值