huangfeian0527 发表于 2013-10-23 21:07:28

如何用verilog语言编写一对四通道切换的程序

我想用FPGA 搭建一个 一对四 的多通道开关, 该如何用verilog 语言编写
比如说 :我先通过两位控制线选择通道(00:通道一接通;01:通道二接通;10:通道三接通;11:通道四接通),我现在单片机发送00,FPGA 接通通道一,当我单片机发送01时,接通通道二,但通道一并没有拆除,该怎么办啊 ?

module waishe_case1(
                     Int_Tx,Int_En,Out_Rx,select,            
                     Out_Tx1,Out_Tx2,Out_Tx3,Out_Tx4, //串口发送(FPGA)输出
                     Out_En1,Out_En2,Out_En3,Out_En4, // 485收发使能(FPGA)输出
                     Int_Rx1,Int_Rx2,Int_Rx3,Int_Rx4,// 串口接收(FPGA)输入
                  );

input   Int_Tx,Int_En;
input   Int_Rx1,Int_Rx2,Int_Rx3,Int_Rx4;

input    select;

outputOut_Tx1,Out_Tx2,Out_Tx3,Out_Tx4;
outputOut_En1,Out_En2,Out_En3,Out_En4;
outputOut_Rx;

reg   Out_Rx;
reg   Out_Tx1,Out_Tx2,Out_Tx3,Out_Tx4;
reg   Out_En1,Out_En2,Out_En3,Out_En4;
//reg   Int_Tx,Int_En;
//reg   Int_Rx1,Int_Rx2,Int_Rx3,Int_Rx4;

always @(select)
       begin
            case (select)
               2'b00 :
                      begin
                           Out_Tx1<=Int_Tx;
                           Out_En1<=Int_En;
                           Out_Rx<=Int_Rx1;
                      end
               2'b01 :
                      begin
                           Out_Tx2<=Int_Tx;
                           Out_En2<=Int_En;
                           Out_Rx<=Int_Rx2;   
                      end
               2'b10 :
                      begin
                           Out_Tx3<=Int_Tx;
                           Out_En3<=Int_En;
                           Out_Rx<=Int_Rx3;
                      end
               2'b11 :
                      begin
                           Out_Tx4<=Int_Tx;
                           Out_En4<=Int_En;
                           Out_Rx<=Int_Rx4;
                      end
            endcase   
       end
endmodule

huangfeian0527 发表于 2013-10-23 21:09:04

最主要的问题是通道一切换到通道二,如何在通道二搭建之前,先把通道一给拆除?

winster321 发表于 2013-10-23 21:17:59

assign {Out_Tx1,Out_Tx2,Out_Tx3,Out_Tx4}={4{Int_Tx}};
always (*)
case(select)
    2'b00: {Out_Rx,Out_En1,Out_En2,Out_En3,Out_En4} = {Int_Rx1, 4'b1000};
    2'b01: {Out_Rx,Out_En1,Out_En2,Out_En3,Out_En4} = {Int_Rx2, 4'b0100};
    2'b10: {Out_Rx,Out_En1,Out_En2,Out_En3,Out_En4} = {Int_Rx3, 4'b0010};
    2'b11: {Out_Rx,Out_En1,Out_En2,Out_En3,Out_En4} = {Int_Rx4, 4'b0001};
    default: ;
endcase

huangfeian0527 发表于 2013-10-23 21:49:51

winster321 发表于 2013-10-23 21:17 static/image/common/back.gif
assign {Out_Tx1,Out_Tx2,Out_Tx3,Out_Tx4}={4{Int_Tx}};
always (*)
case(select)


先谢了 ,哈哈哈。。。

huangfeian0527 发表于 2013-10-24 08:57:47

能否帮我解释下assign {Out_Tx1,Out_Tx2,Out_Tx3,Out_Tx4}={4{Int_Tx}};   

huangfeian0527 发表于 2013-10-24 09:26:10

winster321 发表于 2013-10-23 21:17 static/image/common/back.gif
assign {Out_Tx1,Out_Tx2,Out_Tx3,Out_Tx4}={4{Int_Tx}};
always (*)
case(select)


能否帮我解析下这两段代码?
assign {Out_Tx1,Out_Tx2,Out_Tx3,Out_Tx4}={4{Int_Tx}};
{Out_Rx,Out_En1,Out_En2,Out_En3,Out_En4} = {Int_Rx1, 4'b1000}

cuiliang1984 发表于 2013-10-24 10:35:22

assign {Out_Tx1,Out_Tx2,Out_Tx3,Out_Tx4}={4{Int_Tx}};
always (*)
case(select)
    2'b00: {Out_Rx,Out_En1,Out_En2,Out_En3,Out_En4} = {Int_Rx1, Int_En,3'b0};
    2'b01: {Out_Rx,Out_En1,Out_En2,Out_En3,Out_En4} = {Int_Rx2, 1'b0,Int_En,2'b0};
    2'b10: {Out_Rx,Out_En1,Out_En2,Out_En3,Out_En4} = {Int_Rx3, 2'b0,Int_En,1'b0};
    2'b11: {Out_Rx,Out_En1,Out_En2,Out_En3,Out_En4} = {Int_Rx4, 3'b0,Int_En};
    default: ;
endcase

huangfeian0527 发表于 2013-10-24 11:52:31

本帖最后由 huangfeian0527 于 2013-10-24 12:43 编辑

always @(select)
            begin   
                   case(select,select)
                         begin
                                 2'b00:
                                           begin
                                                {Out_En1,Out_En2,Out_En3,Out_En4}={ Int_En,3'bzzz};
                                                {Out_Tx1,Out_Tx2,Out_Tx3,Out_Tx4}={Int_Tx,3'bzzz};
                                                Out_Rx=Int_Rx1;
                                           end
                                 2'b01:
                                           begin
                                                {Out_En1,Out_En2,Out_En3,Out_En4}={ 1'bz,Int_En,2'bzz};
                                                {Out_Tx1,Out_Tx2,Out_Tx3,Out_Tx4}={1'bz,Int_Tx,2'bzz};
                                                Out_Rx=Int_Rx2;
                                           end
                                 2'b10:
                                           begin
                                                {Out_En1,Out_En2,Out_En3,Out_En4}={2'bzz, Int_En,1'bz};
                                                {Out_Tx1,Out_Tx2,Out_Tx3,Out_Tx4}={2'bzz,Int_Tx,1'bz};
                                                Out_Rx=Int_Rx3;
                                           end
                                 2'b11:
                                           begin
                                                {Out_En1,Out_En2,Out_En3,Out_En4}={3'bzzz, Int_En};
                                                {Out_Tx1,Out_Tx2,Out_Tx3,Out_Tx4}={3'bzzz,Int_Tx};
                                                Out_Rx=Int_Rx4;
                                           end
                                  default : ;
                         end
            end
这样写可以吗?

当输入Int_Tx与输出Out_Tx1连接后 ,要使Int_Tx与输出Out_Tx2连接,并要把Int_Tx与Out_Tx1拆除,请问上面的代码能否实现?
页: [1]
查看完整版本: 如何用verilog语言编写一对四通道切换的程序