在 Verilog 中,如何将 16 位输入分解为 4、6 和 6 位?

In Verilog, how do I take a 16bit input and break it down into 4, 6, and 6 bits?

我已经做了很多谷歌搜索和堆栈溢出。我想我似乎无法正确地表达这个问题。我正在尝试学习 verilog,我找到了一个构建微处理器的教程。我现在正在进行的步骤是指令解码器。

Here's a crappy diagram, 如果我解释的方式没有意义。 这是一个初学者级别的项目,这就是为什么我很沮丧我无法解决这个问题。我只会有 3 个不同的输入,但我不认为一次发送 4、6 和 6 个信号。

我知道标准是在你的问题中也有一些代码,但我真的不知道从哪里开始。

我不确定使用本教程是否适合初学者。你应该从更简单的事情开始,比如先打印 'hello world' 。但这里是这个的起点:

1) 你得到了一条 16 位宽的指令:

module decoder(input [15:0] instruction, input clk, ...);

2) 根据你的图表(通常位“0”在最右边,位“15”在最左边)看起来位 [5:0] 属于第二个参数,位 [11 :6] 到第二个位 [15:12] 到代码。所以,你可以这样写:

reg [3:0] opcode;
reg [5:0] param1;
reg [5:0] param2;

always @* begin
    opcode = instruction[15:12];
    param1 = instruction[11:6];
    param2 = instruction[5:0];
end

这将为您提供一个起点。现在对于模块,您需要确定所需的输出和时钟。时钟在硬件中用于同步操作和创建状态机。获得操作码和参数后,您需要弄清楚如何处理它们。

现在你可以有一些解码逻辑了:

always @(posedge clk)
    case (opcode)
    4'b0100: op <= mov;
    4'b0101: op <= add;
    ... 
    endcase

希望对您有所帮助。