在Verilog中创建Demux

在Verilog中创建Demux,verilog,Verilog,你好,我有一个关于verilog的家庭作业 我的任务是: ''当中断被断言时,s1寄存器将给出中断子程序中中断的计数器编号。当更多 如果收到一个以上的中断,s1寄存器将给出优先编码器的输出 模式: 我设计了这个模式,并在verilogrtl中看到了除demux部分之外的其他模式。 我怎样才能看到demux部分与其他部分一起 这是我的verilog top_模块代码。 计数器,优先编码器,皮开朗日是给我的 我试着写一篇精彩的文章 module top_module( input cloc

你好,我有一个关于verilog的家庭作业

我的任务是:

''当中断被断言时,s1寄存器将给出中断子程序中中断的计数器编号。当更多 如果收到一个以上的中断,s1寄存器将给出优先编码器的输出

模式:

我设计了这个模式,并在verilogrtl中看到了除demux部分之外的其他模式。 我怎样才能看到demux部分与其他部分一起

这是我的verilog top_模块代码。 计数器,优先编码器,皮开朗日是给我的

我试着写一篇精彩的文章

    module top_module(
input clock,
input reset
);


 ///////priority_encoder///////
 wire [3:0] encoder_in;
 wire [2:0] encoder_out;

 ///////////////////////////

 /////picoblaze//////
 wire interrupt_ack;
 //////////////////////////

 //////coder/////////////
 reg start1;
 reg start2;
 reg start3;
 reg start4;
 ///////////////////////



 always @ (encoder_out or interrupt_ack )
 begin
        case(encoder_out)

        3'b001:
        start1 <=1'b1;
        3'b010:
        start2 <=1'b1;
        3'b011:
        start3 <=1'b1;
        3'b100:
        start4 <=1'b1;

        endcase
 end

 ascode instance_name (
.address(address), 
.instruction(instruction), 
.clk(clk)
);

 kcpsm3 picoblaze (
.address(address), 
.instruction(instruction), 
.port_id(port_id), 
.write_strobe(write_strobe), 
.out_port(out_port), 
.read_strobe(read_strobe), 
.in_port(encoder_out), 
.interrupt(interrupt), 
.interrupt_ack(interrupt_ack), 
.reset(reset), 
.clk(clk)
);

 priority_encoder p_encoder (
.encoder_in(encoder_in), 
.encoder_out(encoder_out)
);

 counter c100 (
.clk(clk), 
.start(start1), 
.count_up_to(100), 
.ready(encoder_in[0])
);

counter c200 (
.clk(clk), 
.start(start2), 
.count_up_to(200), 
.ready(encoder_in[1])
);

counter c300 (
.clk(clk), 
.start(start3), 
.count_up_to(300), 
.ready(encoder_in[2])
);

counter c400 (
.clk(clk), 
.start(start4), 
.count_up_to(400), 
.ready(encoder_in[3])
);

 orgate orgate (
.r1(encoder_in[0]), 
.r2(encoder_in[1]), 
.r3(encoder_in[2]), 
.r4(encoder_in[3]), 
.y(interrupt)
);



endmodule
模块顶部\u模块(
输入时钟,
输入复位
);
///////优先编码器///////
导线[3:0]编码器_in;
线[2:0]编码器输出;
///////////////////////////
/////苦玻璃化//////
线路中断确认;
//////////////////////////
//////编码员/////////////
reg start1;
reg start2;
reg start3;
reg start4;
///////////////////////
始终@(编码器输出或中断确认)
开始
外壳(编码器输出)
3'b001:

start1您将看不到demux,因为它是优化的方式。您的代码始终生成1

你可能想要这个:

always @ ( * )
begin
    {start1,start2,start3,start4} = 4'b000;
    case(encoder_out)
    3'b001 : start1 =interrupt_ack ;
    3'b010 : start2 =interrupt_ack ;
    3'b011 : start3 =interrupt_ack ;
    default: start4 =interrupt_ack ;
    endcase
end
  • 如你所见,我总是使用@(*)。这样更安全
  • 您的启动信号默认设置为零
  • 您有一个组合块,因此必须使用块赋值
  • 由于某些原因,您使用了3个编码器输出位,因此您必须解码所有状态,否则将获得锁存。这就是默认值的用途
  • 通过保持重复代码的紧凑性,您可以更好地看到规则模式。在这种情况下,我看到你从3'b001开始,而不是出于某种原因从3'b000开始