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

在Verilog中,如何获取16位输入并将其分解为4、6和6位?,verilog,microprocessors,Verilog,Microprocessors,我做了很多谷歌搜索和堆栈溢出。我想我似乎无法恰当地回答这个问题。我正在努力学习verilog,我找到了一个制作微处理器的教程。我现在要做的是指令解码器 接受16位输入 前4位提升与指令对应的标志(例如MOV、ADD、ADDI、SUB、NOT和OR等) 最后12位分解为6和6,以便保持器执行操作 如果我解释的方式没有意义的话。 这是一个初学者水平的项目,这就是为什么我感到不安,我不能围绕这个问题。我只需要3个不同的输入,但我不认为一次发送4、6和6个信号 我知道标准是在你的问题中也有一些代码,

我做了很多谷歌搜索和堆栈溢出。我想我似乎无法恰当地回答这个问题。我正在努力学习verilog,我找到了一个制作微处理器的教程。我现在要做的是指令解码器

  • 接受16位输入
  • 前4位提升与指令对应的标志(例如MOV、ADD、ADDI、SUB、NOT和OR等)
  • 最后12位分解为6和6,以便保持器执行操作
如果我解释的方式没有意义的话。 这是一个初学者水平的项目,这就是为什么我感到不安,我不能围绕这个问题。我只需要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
始终@(posedge clk)
案例(操作码)

4'b0100:op这确实有用!并回答你陈述的第一部分。我已经远远超过了verilog的Hello世界。这是最后一课。您需要的术语是“向量的位切片”