在 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,我找到了一个构建微处理器的教程。我现在正在进行的步骤是指令解码器。
- 采用 16 位输入
- 前 4 位引发与指令对应的标志(例如 MOV、ADD、ADDI、SUB、NOT、AND、OR 等)
- 最后12位分解为6位和6位持有者进行运算
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
希望对您有所帮助。
我已经做了很多谷歌搜索和堆栈溢出。我想我似乎无法正确地表达这个问题。我正在尝试学习 verilog,我找到了一个构建微处理器的教程。我现在正在进行的步骤是指令解码器。
- 采用 16 位输入
- 前 4 位引发与指令对应的标志(例如 MOV、ADD、ADDI、SUB、NOT、AND、OR 等)
- 最后12位分解为6位和6位持有者进行运算
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
希望对您有所帮助。