在Verilog中创建Demux

时间:2018-03-31 19:24:25

标签: verilog

您好我有关于verilog的作业。

我的任务是:

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

架构:

image

我设计了模式并在verilog RTL Schematic中看到了除demux部分之外的内容。 如何将demux部分与其他部分一起看?

这是我的verilog top_module代码。 计数器,优先级编码器,picoblaze给我。

我试图编写orgate part和demux。

    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

1 个答案:

答案 0 :(得分:1)

你不会看到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
  1. 如你所见,我总是使用@(*)。它更安全。
  2. 您的开始信号默认设置为零。
  3. 您有一个组合块,因此必须使用阻止分配。
  4. 由于某种原因,您使用3个编码器输出位,因此您必须解码所有状态,否则您将获得锁存器。这就是默认值。
  5. 通过保持重复代码紧凑,您可以更好地查看常规模式。在这种情况下,我看到你从3'b001开始而不是3'b000由于某种原因。