inout口在modelsim仿真的方法
//主要是// 和**********部分是关键
1 `timescale 1ns/1ns 2 module tb(); 3 4 reg main_clk; 5 reg [2:0] addr; 6 reg FPGA_CS0;//FPGA cs 7 reg RD; 8 reg WR; 9 wire arm_clk; 10 wire led; 11 12 wire [15:0]data; //******* 13 reg [15:0] treg_data; //关键部分 14 integer i; // 15 16 17 assign data = treg_data; //***** 18 19 STM32_FPGA u1( 20 .main_clk(main_clk), 21 .arm_clk(arm_clk), 22 .led(led), 23 .addr(addr), 24 .data(data), 25 .FPGA_CS0(FPGA_CS0),//FPGAƬ 26 .RD(RD), 27 .WR(WR) 28 29 ); 30 31 32 initial begin 33 main_clk = 0; 34 addr = 3'd0; 35 FPGA_CS0 = 1; 36 RD = 1; 37 WR = 1; 38 i = 0; 39 treg_data = 0; 40 #200 41 for(i=0;i<8;i=i+1)begin //往FPGA寄存器写入8个随机数据 42 WR = 0 ; 43 addr = i; 44 treg_data = $random; 45 #20 46 WR = 1; 47 #20; 48 end 49 treg_data =16'bz; //写完后,treg_data 与 data 断开 50 #200 51 for(i=0;i<8;i=i+1)begin //从FPGA 寄存器读出8个数据 52 FPGA_CS0 = 0; 53 RD = 0; 54 addr = i; 55 #50; 56 end 57 FPGA_CS0 = 1; 58 RD = 1; 59 60 61 62 end 63 64 65 always #20 main_clk = ~main_clk; 66 67 68 69 endmodule
1 /* 实际调试没有发现什么问题! */
2 module STM32_FPGA( 3 input main_clk, 4 output arm_clk, 5 6 output led, 7 8 input [2:0] addr, 9 inout[15:0] data, 10 11 12 input FPGA_CS0,//FPGA片选 13 input RD, 14 input WR 15 16 ); 17 18 19 wire clk; 20 21 pll_50M pll_50M_inst ( 22 .inclk0 ( main_clk ),//25M 23 .c0 ( clk ), //50M 24 .c1 ( arm_clk ) //8M 25 ); 26 27 28 reg [24:0] cnt = 0; 29 always @(posedge clk) 30 cnt <= cnt + 1'b1; 31 32 assign led = cnt[24]; 33 34 35 //AWE的上升沿,将数据写入FPGA寄存器 36 37 38 reg [15:0] ARM_FPGA_REG0; 39 reg [15:0] ARM_FPGA_REG1; 40 reg [15:0] ARM_FPGA_REG2; 41 reg [15:0] ARM_FPGA_REG3; 42 reg [15:0] ARM_FPGA_REG4; 43 reg [15:0] ARM_FPGA_REG5; 44 reg [15:0] ARM_FPGA_REG6; 45 reg [15:0] ARM_FPGA_REG7; 46 47 48 wire rd_en = ~FPGA_CS0 && ~RD; 49 50 reg [15:0] data_reg; 51 //always @(posedge clk) //DSP读操作,The sampling point of DSP reading is the risging edge of AWE! 52 always @(*) 53 begin 54 if(rd_en) 55 begin 56 case(addr[2:0]) 57 3'd0 : data_reg <= ARM_FPGA_REG0; 58 3'd1 : data_reg <= ARM_FPGA_REG1; 59 3'd2 : data_reg <= ARM_FPGA_REG2; 60 3'd3 : data_reg <= ARM_FPGA_REG3; 61 3'd4 : data_reg <= ARM_FPGA_REG4; 62 3'd5 : data_reg <= ARM_FPGA_REG5; 63 3'd6 : data_reg <= ARM_FPGA_REG6; 64 3'd7 : data_reg <= ARM_FPGA_REG7; 65 default: data_reg<= 16'hzzzz; 66 endcase 67 end 68 else data_reg<= 16'hzzzz; 69 end 70 71 /* AWE下降沿DSP的数据写入FPGA,即sampling point */ 72 73 reg WR_tmp1; 74 reg WR_tmp2; 75 always @(posedge clk) 76 begin 77 WR_tmp1 <= WR; 78 WR_tmp2 <= WR_tmp1; 79 end 80 81 wire WR_RISING = WR_tmp2 && ~WR_tmp1;//与clk同步 82 83 84 always @(*) 85 begin 86 if(WR_RISING) 87 begin 88 case(addr[2:0]) 89 3'd0 : ARM_FPGA_REG0 <= data; 90 3'd1 : ARM_FPGA_REG1 <= data; 91 3'd2 : ARM_FPGA_REG2 <= data; 92 3'd3 : ARM_FPGA_REG3 <= data; 93 3'd4 : ARM_FPGA_REG4 <= data; 94 3'd5 : ARM_FPGA_REG5 <= data; 95 3'd6 : ARM_FPGA_REG6 <= data; 96 3'd7 : ARM_FPGA_REG7 <= data; 97 default: ; 98 endcase 99 end 100 else begin 101 ARM_FPGA_REG0 <= ARM_FPGA_REG0; 102 ARM_FPGA_REG1 <= ARM_FPGA_REG1; 103 ARM_FPGA_REG2 <= ARM_FPGA_REG2; 104 ARM_FPGA_REG3 <= ARM_FPGA_REG3; 105 ARM_FPGA_REG4 <= ARM_FPGA_REG4; 106 ARM_FPGA_REG5 <= ARM_FPGA_REG5; 107 ARM_FPGA_REG6 <= ARM_FPGA_REG6; 108 ARM_FPGA_REG7 <= ARM_FPGA_REG7; 109 end 110 end 111 // assign data = rd_en ? data_reg : 16'hzzzz;
112 assign data = data_reg; //可以用三目运算,但根据54行到68行逻辑判断,没有必要
113 114 endmodule
参考原文http://blog.chinaaet.com/xzy610030/p/37525
posted on 2017-02-27 21:01 yangwang星空 阅读(933) 评论(0) 收藏 举报
浙公网安备 33010602011771号