徒手设计crc电路

  • crc电路怎么设计?
    • crc就是GF(2)中多项式除法,可是电路是怎么样的呢?大家一般上来就搬出LFSR,就说用LFSR实现校验码计算,也没说为啥,根本看不懂。我试着自己设计一下crc电路。
    • 首先看公式,设
      • 信息码字 M,位宽为m
      • 生成多项式 G,阶数为r
      • 商 Q
      • 余数 R
    • 有 M/G=Q*G+R
    • M用二进制表示,显然M为m个多项式的和,分别是2^{m-1}, 2^{m-2}, ..., 2^1, 1
    • 代入M/G=Q*G+R,得到R=R_0+R_1+...+R_{m-1}
    • 我们把M拆成m项,分别作为被除数,最后再把m个余数加起来。Q不用考虑了,只用看被除数,而被除数永远是最高位加上一串0,唯一有效的就是一个最高位。因此电路的输入只要一个比特即可,就是把M从高位按顺序输入。
    • 但是被除数除一次也算不出来余数呀,总不可能把余数一个个先算出来再加起来吧。我们可以用循环移位,把计算余数的过程套在一起,这样当最后一个数据比特输入,第一比特输入的余数也就计算完成了。
    • 余数是r-1阶,所以使用r个触发器存储即可,最高位为r-1阶。
    • 首先对2^{m-1}做除法,就是和G(x)异或一下。一次异或无法完成除法,把余数向高位移动一位,加入下一次除法,继续参与模除。r-1阶左移一位就是r阶了,又可以和G(x)对齐,和新的输入加在一起,进行模除。其实新的输入就是一个比特,其余位全0,任何数和0异或等于本身,所以不用考虑了。那么所谓和新的输入加在一起,就是在输入那里异或一下。
    • 这样的话,电路画出来,发现就是LFSR。把M全部输入进去,由于被除数其实添加了r+1个0,所以把信息比特输入完,还要把后续的0都输入。最后,寄存器中剩下的就是R_0+R_1+...+R_{m-1},即crc结果。
    • 搬运一个电路图过来展示一下:
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java GUI(图形用户界面)可以使用Java Swing库进行开发,绘画可以使用Java Graphics2D类。下面是一个简单的Java GUI程序,该程序提供了一个绘画区和一些工具,可以选择画笔颜色和笔刷大小,还有橡皮擦工具。 ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class DrawingApp extends JFrame { private JPanel canvas; private JComboBox<String> colorChooser; private JComboBox<Integer> sizeChooser; private JToggleButton eraseButton; private Color currentColor = Color.black; private int currentSize = 5; public static void main(String[] args) { DrawingApp app = new DrawingApp(); app.setVisible(true); } public DrawingApp() { setTitle("Drawing App"); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // create canvas panel and add to frame canvas = new JPanel(); canvas.setBackground(Color.white); canvas.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { Graphics2D g = (Graphics2D) canvas.getGraphics(); g.setColor(currentColor); if (eraseButton.isSelected()) { g.setColor(canvas.getBackground()); } g.setStroke(new BasicStroke(currentSize, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); g.drawLine(e.getX(), e.getY(), e.getX(), e.getY()); } }); canvas.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { Graphics2D g = (Graphics2D) canvas.getGraphics(); g.setColor(currentColor); if (eraseButton.isSelected()) { g.setColor(canvas.getBackground()); } g.setStroke(new BasicStroke(currentSize, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); g.drawLine(e.getX(), e.getY(), e.getX(), e.getY()); } }); add(canvas, BorderLayout.CENTER); // create tool panel and add to frame JPanel toolPanel = new JPanel(); add(toolPanel, BorderLayout.NORTH); colorChooser = new JComboBox<String>(new String[] {"Black", "Red", "Green", "Blue"}); colorChooser.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String color = (String) colorChooser.getSelectedItem(); switch (color) { case "Black": currentColor = Color.black; break; case "Red": currentColor = Color.red; break; case "Green": currentColor = Color.green; break; case "Blue": currentColor = Color.blue; break; } } }); toolPanel.add(new JLabel("Color:")); toolPanel.add(colorChooser); sizeChooser = new JComboBox<Integer>(new Integer[] {1, 3, 5, 10}); sizeChooser.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { currentSize = (Integer) sizeChooser.getSelectedItem(); } }); toolPanel.add(new JLabel("Size:")); toolPanel.add(sizeChooser); eraseButton = new JToggleButton("Eraser"); toolPanel.add(eraseButton); } } ``` 该程序创建了一个JFrame窗口,并在其中添加了一个绘画区(JPanel)和一个工具区(JPanel)。绘画区使用MouseListener和MouseMotionListener监听鼠标事件,并使用Graphics2D类绘制图形。工具区提供了选择颜色、笔刷大小和橡皮擦工具的选项。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值