omam138/upp/fpga
分类: 嵌入式
系统架构
本系统组成如下图,FPGA挨个读取24个AD通道中的数据,然后通过UPP方式传送给OMAPL138中的DSP核,经过一系列运算,DSP核通过DSPLINK方式将数据送到ARM核。
FPGA数据读取、存储、传送、数据识别问题
因为OMAPL138需要识别传送上来的数据是对应哪个通道的。所以FPGA对数据必须做一些处理以便于OMAPL138对数据分门别类。
方法一:
在FPGA中生成一个FIFO,挨个读取24个AD通道中的数据按次序存放到FIFO中,FIFO中存放满预定大小的数据量时再上传给OMAPL138,这样OMAPL138就知道第一个数据是对应通道1的,第二个数据是对应通道2的。
优点:简单,容易实现
缺点:如果其中一个数据出错或者漏传,那后面的一大堆数据都会被错误归类。
方法二:
AD通道输出数据是16位,将其扩展为32位,高16位作为标志位。例如,如果第一个AD通道读出来的0xDE33,那扩展为32位时其数据为0x0001DE33。OMAPL138通过其高16位辨别这个数据是哪个通道的。
优点:不再像方法一担心数据传错了,传错也不会危害到整体。
缺点:OMAPL138的UPP通信时16位的数据线,原来是需要传送数据,现在还要传送标志数据,这样直接导致传输效率打5折。但是对于能够到达150MB/s吞吐量的UPP来说,就算传输只能达到50%,也是能满足我目前这个系统的。
读取AD:
以下是读取ad的代码,状态机的状态比较多,比较麻烦。
点击(此处)折叠或打开
- module ads_ddio (
- clk,
- rst,
- eoc,
- datain,
- dataout,
- f_ncs,
- f_nrd,
- fifo_wr,
- f_c1,
- f_c2,
- f_c3,
- f_c4,
- f_c5,
- f_c6
- );
- input clk,rst;
- input[1:0] eoc;
- input[15:0] datain;
- output f_c1, f_c2, f_c3, f_c4, f_c5, f_c6;
- output[1:0] f_ncs;
- output[1:0] f_nrd;
- output fifo_wr;
- output[31:0] dataout;
- reg[7:0] counter;
- reg[31:0] data_reg;
- reg state;
- reg[1:0] eoc1;
- reg[5:0] cstate,nstate;
- reg[1:0] f_nrd_reg,f_ncs_reg;
- reg fifo_wr_reg;
- parameter SET_COUNT = 8'hff,
- SET_CSRD_C1UA = 8'd23,
- SET_DATA_C1UA = 8'd24,
- SET_CSRD_C1UB = 8'd26,
- SET_DATA_C1UB = 8'd27,
- SET_CSRD_C1UC = 8'd29,
- SET_DATA_C1UC = 8'd30,
- SET_CSRD_C1IA = 8'd32,
- SET_DATA_C1IA = 8'd33,
- SET_CSRD_C1IB = 8'd35,
- SET_DATA_C1IB = 8'd36,
- SET_CSRD_C1IC = 8'd38,
- SET_DATA_C1IC = 8'd39,
- SET_CSRD_C2UA = 8'd41,
- SET_DATA_C2UA = 8'd42,
- SET_CSRD_C2UB = 8'd44,
- SET_DATA_C2UB = 8'd45,
- SET_CSRD_C2UC = 8'd47,
- SET_DATA_C2UC = 8'd48,
- SET_CSRD_C2IA = 8'd50,
- SET_DATA_C2IA = 8'd51,
- SET_CSRD_C2IB = 8'd53,
- SET_DATA_C2IB = 8'd54,
- SET_CSRD_C2IC = 8'd56,
- SET_DATA_C2IC = 8'd57,
- SET_FIFO_DATA = 8'd60, //上个状态+3
- SET_IDLE = 8'd62;
- parameter IDLE = 6'd0,
- CSRDN_C1UA = 6'd1,
- DATA_C1UA = 6'd2,
- DATA1_C1UA = 6'd3,
- CSRDN_C1UB = 6'd4,
- DATA_C1UB = 6'd5,
- DATA1_C1UB = 6'd6,
- CSRDN_C1UC = 6'd7,
- DATA_C1UC = 6'd8,
- DATA1_C1UC = 6'd9,
- CSRDN_C1IA = 6'd10,
- DATA_C1IA = 6'd11,
- DATA1_C1IA = 6'd12,
- CSRDN_C1IB = 6'd13,
- DATA_C1IB = 6'd14,
- DATA1_C1IB = 6'd15,
- CSRDN_C1IC = 6'd16,
- DATA_C1IC = 6'd17,
- DATA1_C1IC = 6'd18,
- CSRDN_C2UA = 6'd19,
- DATA_C2UA = 6'd20,
- DATA1_C2UA = 6'd21,
- CSRDN_C2UB = 6'd22,
- DATA_C2UB = 6'd23,
- DATA1_C2UB = 5'd24,
- CSRDN_C2UC = 6'd25,
- DATA_C2UC = 6'd26,
- DATA1_C2UC = 6'd27,
- CSRDN_C2IA = 6'd28,
- DATA_C2IA = 6'd29,
- DATA1_C2IA = 6'd30,
- CSRDN_C2IB = 6'd31,
- DATA_C2IB = 6'd32,
- DATA1_C2IB = 6'd33,
- CSRDN_C2IC = 6'd34,
- DATA_C2IC = 6'd35,
- DATA1_C2IC = 6'd36,
- FIFO_DATA = 6'd37;
- wire csrd_n_c1ua_req;
- wire csrd_n_c1ub_req;
- wire csrd_n_c1uc_req;
- wire csrd_n_c1ia_req;
- wire csrd_n_c1ib_req;
- wire csrd_n_c1ic_req;
- wire csrd_n_c2ua_req;
- wire csrd_n_c2ub_req;
- wire csrd_n_c2uc_req;
- wire csrd_n_c2ia_req;
- wire csrd_n_c2ib_req;
- wire csrd_n_c2ic_req;
- wire data_c1ua_req;
- wire data_c1ub_req;
- wire data_c1uc_req;
- wire data_c1ia_req;
- wire data_c1ib_req;
- wire data_c1ic_req;
- wire data_c2ua_req;
- wire data_c2ub_req;
- wire data_c2uc_req;
- wire data_c2ia_req;
- wire data_c2ib_req;
- wire data_c2ic_req;
- wire fifo_data_req;
- wire idle_req;
- assign f_c1 = 1'b1;
- assign f_c2 = 1'b0;
- assign f_c3 = 1'b1;
- assign f_c4 = 1'b0;
- assign f_c5 = 1'b0;
- assign f_c6 = 1'b0;
- assign dataout = data_reg;
- assign csrd_n_c1ua_req = (counter == SET_CSRD_C1UA);
- assign csrd_n_c1ub_req = (counter == SET_CSRD_C1UB);
- assign csrd_n_c1uc_req = (counter == SET_CSRD_C1UC);
- assign csrd_n_c1ia_req = (counter == SET_CSRD_C1IA);
- assign csrd_n_c1ib_req = (counter == SET_CSRD_C1IB);
- assign csrd_n_c1ic_req = (counter == SET_CSRD_C1IC);
- assign csrd_n_c2ua_req = (counter == SET_CSRD_C2UA);
- assign csrd_n_c2ub_req = (counter == SET_CSRD_C2UB);
- assign csrd_n_c2uc_req = (counter == SET_CSRD_C2UC);
- assign csrd_n_c2ia_req = (counter == SET_CSRD_C2IA);
- assign csrd_n_c2ib_req = (counter == SET_CSRD_C2IB);
- assign csrd_n_c2ic_req = (counter == SET_CSRD_C2IC);
- assign data_c1ua_req = (counter == SET_DATA_C1UA);
- assign data_c1ub_req = (counter == SET_DATA_C1UB);
- assign data_c1uc_req = (counter == SET_DATA_C1UC);
- assign data_c1ia_req = (counter == SET_DATA_C1IA);
- assign data_c1ib_req = (counter == SET_DATA_C1IB);
- assign data_c1ic_req = (counter == SET_DATA_C1IC);
- assign data_c2ua_req = (counter == SET_DATA_C2UA);
- assign data_c2ub_req = (counter == SET_DATA_C2UB);
- assign data_c2uc_req = (counter == SET_DATA_C2UC);
- assign data_c2ia_req = (counter == SET_DATA_C2IA);
- assign data_c2ib_req = (counter == SET_DATA_C2IB);
- assign data_c2ic_req = (counter == SET_DATA_C2IC);
- assign fifo_data_req = (counter == SET_FIFO_DATA);
- assign idle_req = (counter == SET_IDLE);
- assign f_nrd[0] = (cstate == DATA_C1UA || cstate == CSRDN_C1UA || cstate == DATA_C1UB || cstate == CSRDN_C1UB || cstate == DATA_C1UC || cstate == CSRDN_C1UC || cstate == DATA_C1IA || cstate == CSRDN_C1IA || cstate == DATA_C1IB || cstate == CSRDN_C1IB || cstate == DATA_C1IC || cstate == CSRDN_C1IC ) ? f_nrd_reg[0] : 1'b1;
- assign f_ncs[0] = (cstate == DATA_C1UA || cstate == CSRDN_C1UA || cstate == DATA_C1UB || cstate == CSRDN_C1UB || cstate == DATA_C1UC || cstate == CSRDN_C1UC || cstate == DATA_C1IA || cstate == CSRDN_C1IA || cstate == DATA_C1IB || cstate == CSRDN_C1IB || cstate == DATA_C1IC || cstate == CSRDN_C1IC ) ? f_ncs_reg[0] : 1'b1;
- assign f_nrd[1] = (cstate == DATA_C2UA || cstate == CSRDN_C2UA || cstate == DATA_C2UB || cstate == CSRDN_C2UB || cstate == DATA_C2UC || cstate == CSRDN_C2UC || cstate == DATA_C2IA || cstate == CSRDN_C2IA || cstate == DATA_C2IB || cstate == CSRDN_C2IB || cstate == DATA_C2IC || cstate == CSRDN_C2IC ) ? f_nrd_reg[1] : 1'b1;
- assign f_ncs[1] = (cstate == DATA_C2UA || cstate == CSRDN_C2UA || cstate == DATA_C2UB || cstate == CSRDN_C2UB || cstate == DATA_C2UC || cstate == CSRDN_C2UC || cstate == DATA_C2IA || cstate == CSRDN_C2IA || cstate == DATA_C2IB || cstate == CSRDN_C2IB || cstate == DATA_C2IC || cstate == CSRDN_C2IC ) ? f_ncs_reg[1] : 1'b1;
- assign fifo_wr = ( /* cstate ==DATA_C1UA ||*/ cstate == DATA_C1UB || cstate == DATA_C1UC || cstate == DATA_C1IA || cstate == DATA_C1IB || cstate == DATA_C1IC || cstate == DATA_C2UA || cstate == DATA_C2UB || cstate == DATA_C2UC || cstate == DATA_C2IA || cstate == DATA_C2IB || cstate == DATA_C2IC ||cstate == FIFO_DATA ) ? fifo_wr_reg : 1'b0;
- always @ (posedge clk or negedge rst)
- if(!rst)
- cstate <= IDLE;
- else
- cstate <= nstate;
- always @ (cstate or fifo_data_req or csrd_n_c1ua_req or data_c1ub_req or csrd_n_c1uc_req or data_c1ia_req or data_c1ib_req or data_c1ic_req or csrd_n_c2ua_req or data_c2ub_req or csrd_n_c2uc_req or data_c2ia_req or data_c2ib_req or data_c2ic_req)
- case (cstate)
- IDLE:
- if(csrd_n_c1ua_req)
- nstate <= CSRDN_C1UA;
- else
- nstate <= IDLE;
- CSRDN_C1UA:
- if(data_c1ua_req)
- nstate <= DATA_C1UA;
- else
- nstate <= CSRDN_C1UA;
- DATA_C1UA:
- nstate <= DATA1_C1UA;
- DATA1_C1UA:
- if(csrd_n_c1ub_req)
- nstate <= CSRDN_C1UB;
- else
- nstate <= DATA1_C1UA;
- CSRDN_C1UB:
- if(data_c1ub_req)
- nstate <= DATA_C1UB;
- else
- nstate <= CSRDN_C1UB;
- DATA_C1UB:
- nstate <= DATA1_C1UB;
- DATA1_C1UB:
- if(csrd_n_c1uc_req)
- nstate <= CSRDN_C1UC;
- else
- nstate <= DATA1_C1UB;
- CSRDN_C1UC:
- if(data_c1uc_req)
- nstate <= DATA_C1UC;
- else
- nstate <= CSRDN_C1UC;
- DATA_C1UC:
- nstate <= DATA1_C1UC;
- DATA1_C1UC:
- if(csrd_n_c1ia_req)
- nstate <= CSRDN_C1IA;
- else
- nstate <= DATA1_C1UC;
- CSRDN_C1IA:
- if(data_c1ia_req)
- nstate <= DATA_C1IA;
- else
- nstate <= CSRDN_C1IA;
- DATA_C1IA:
- nstate <= DATA1_C1IA;
- DATA1_C1IA:
- if(csrd_n_c1ib_req)
- nstate <= CSRDN_C1IB;
- else
- nstate <= DATA1_C1IA;
- CSRDN_C1IB:
- if(data_c1ib_req)
- nstate <= DATA_C1IB;
- else
- nstate <= CSRDN_C1IB;
- DATA_C1IB:
- nstate <= DATA1_C1IB;
- DATA1_C1IB:
- if(csrd_n_c1ic_req)
- nstate <= CSRDN_C1IC;
- else
- nstate <= DATA1_C1IB;
- CSRDN_C1IC:
- if(data_c1ic_req)
- nstate <= DATA_C1IC;
- else
- nstate <= CSRDN_C1IC;
- DATA_C1IC:
- nstate <= DATA1_C1IC;
- DATA1_C1IC:
- if(csrd_n_c2ua_req)
- nstate <= CSRDN_C2UA;
- else
- nstate <= DATA1_C1IC;
- /////////////////////////////////////////////////////////////////
- CSRDN_C2UA:
- if(data_c2ua_req)
- nstate <= DATA_C2UA;
- else
- nstate <= CSRDN_C2UA;
- DATA_C2UA:
- nstate <= DATA1_C2UA;
- DATA1_C2UA:
- if(csrd_n_c2ub_req)
- nstate <= CSRDN_C2UB;
- else
- nstate <= DATA1_C2UA;
- CSRDN_C2UB:
- if(data_c2ub_req)
- nstate <= DATA_C2UB;
- else
- nstate <= CSRDN_C2UB;
- DATA_C2UB:
- nstate <= DATA1_C2UB;
- DATA1_C2UB:
- if(csrd_n_c2uc_req)
- nstate <= CSRDN_C2UC;
- else
- nstate <= DATA1_C2UB;
- CSRDN_C2UC:
- if(data_c2uc_req)
- nstate <= DATA_C2UC;
- else
- nstate <= CSRDN_C2UC;
- DATA_C2UC:
- nstate <= DATA1_C2UC;
- DATA1_C2UC:
- if(csrd_n_c2ia_req)
- nstate <= CSRDN_C2IA;
- else
- nstate <= DATA1_C2UC;
- CSRDN_C2IA:
- if(data_c2ia_req)
- nstate <= DATA_C2IA;
- else
- nstate <= CSRDN_C2IA;
- DATA_C2IA:
- nstate <= DATA1_C2IA;
- DATA1_C2IA:
- if(csrd_n_c2ib_req)
- nstate <= CSRDN_C2IB;
- else
- nstate <= DATA1_C2IA;
- CSRDN_C2IB:
- if(data_c2ib_req)
- nstate <= DATA_C2IB;
- else
- nstate <= CSRDN_C2IB;
- DATA_C2IB:
- nstate <= DATA1_C2IB;
- DATA1_C2IB:
- if(csrd_n_c2ic_req)
- nstate <= CSRDN_C2IC;
- else
- nstate <= DATA1_C2IB;
- CSRDN_C2IC:
- if(data_c2ic_req)
- nstate <= DATA_C2IC;
- else
- nstate <= CSRDN_C2IC;
- DATA_C2IC:
- nstate <= DATA1_C2IC;
- DATA1_C2IC:
- if(fifo_data_req)
- nstate <= FIFO_DATA;
- else
- nstate <= DATA1_C2IC;
- FIFO_DATA:
- if(idle_req)
- nstate <= IDLE;
- else
- nstate <= IDLE;
- /*
- DATA1_C1UB:
- if(idle_req)
- nstate <= IDLE;
- else
- nstate <= DATA1_C1UB;
- */
- default:
- nstate <= IDLE;
- endcase
- always @ (posedge clk)
- begin
- case (cstate)
- FIFO_DATA:
- fifo_wr_reg <= 1'b1; //把最后一个数据输出到fifo中详细请看signaltap2
- DATA_C1UA:
- begin
- data_reg <= {16'h11,datain};
- f_nrd_reg[0] <= 1'b0;
- f_ncs_reg[0] <= 1'b0;
- // fifo_wr_reg <= 1'b1; //第一个数据刚好读到寄存器,还没放到fifo的总线上,所以第一个DATA状态不要拉高,详细请看signaltap2
- end
- CSRDN_C1UA:
- begin
- f_nrd_reg[0] <= 1'b0;
- f_ncs_reg[0] <= 1'b0;
- end
- DATA1_C1UA:
- begin
- f_nrd_reg[0] <= 1'b1;
- f_ncs_reg[0] <= 1'b1;
- end
- DATA_C1UB:
- begin
- data_reg <= {16'h12,datain};
- f_nrd_reg[0] <= 1'b0;
- f_ncs_reg[0] <= 1'b0;
- fifo_wr_reg <= 1'b1;
- end
- CSRDN_C1UB:
- begin
- f_nrd_reg[0] <= 1'b0;
- f_ncs_reg[0] <= 1'b0;
- end
- DATA1_C1UB:
- begin
- f_nrd_reg[0] <= 1'b1;
- f_ncs_reg[0] <= 1'b1;
- end
- DATA_C1UC:
- begin
- data_reg <= {16'h13,datain};
- f_nrd_reg[0] <= 1'b0;
- f_ncs_reg[0] <= 1'b0;
- fifo_wr_reg <= 1'b1;
- end
- CSRDN_C1UC:
- begin
- f_nrd_reg[0] <= 1'b0;
- f_ncs_reg[0] <= 1'b0;
- end
- DATA1_C1UC:
- begin
- f_nrd_reg[0] <= 1'b1;
- f_ncs_reg[0] <= 1'b1;
- end
- DATA_C1IA:
- begin
- data_reg <= {16'h14,datain};
- f_nrd_reg[0] <= 1'b0;
- f_ncs_reg[0] <= 1'b0;
- fifo_wr_reg <= 1'b1;
- end
- CSRDN_C1IA:
- begin
- f_nrd_reg[0] <= 1'b0;
- f_ncs_reg[0] <= 1'b0;
- end
- DATA1_C1IA:
- begin
- f_nrd_reg[0] <= 1'b1;
- f_ncs_reg[0] <= 1'b1;
- end
- DATA_C1IB:
- begin
- data_reg <= {16'h15,datain};
- f_nrd_reg[0] <= 1'b0;
- f_ncs_reg[0] <= 1'b0;
- fifo_wr_reg <= 1'b1;
- end
- CSRDN_C1IB:
- begin
- f_nrd_reg[0] <= 1'b0;
- f_ncs_reg[0] <= 1'b0;
- end
- DATA1_C1IB:
- begin
- f_nrd_reg[0] <= 1'b1;
- f_ncs_reg[0] <= 1'b1;
- end
- DATA_C1IC:
- begin
- data_reg <= {16'h16,datain};
- f_nrd_reg[0] <= 1'b0;
- f_ncs_reg[0] <= 1'b0;
- fifo_wr_reg <= 1'b1;
- end
- CSRDN_C1IC:
- begin
- f_nrd_reg[0] <= 1'b0;
- f_ncs_reg[0] <= 1'b0;
- end
- DATA1_C1IC:
- begin
- f_nrd_reg[0] <= 1'b1;
- f_ncs_reg[0] <= 1'b1;
- end
- ///////////////////////////////////////
- DATA_C2UA:
- begin
- data_reg <= {16'h21,datain};
- f_nrd_reg[1] <= 1'b0;
- f_ncs_reg[1] <= 1'b0;
- fifo_wr_reg <= 1'b1;
- end
- CSRDN_C2UA:
- begin
- f_nrd_reg[1] <= 1'b0;
- f_ncs_reg[1] <= 1'b0;
- end
- DATA1_C2UA:
- begin
- f_nrd_reg[1] <= 1'b1;
- f_ncs_reg[1] <= 1'b1;
- end
- DATA_C2UB:
- begin
- data_reg <= {16'h22,datain};
- f_nrd_reg[1] <= 1'b0;
- f_ncs_reg[1] <= 1'b0;
- fifo_wr_reg <= 1'b1;
- end
- CSRDN_C2UB:
- begin
- f_nrd_reg[1] <= 1'b0;
- f_ncs_reg[1] <= 1'b0;
- end
- DATA1_C2UB:
- begin
- f_nrd_reg[1] <= 1'b1;
- f_ncs_reg[1] <= 1'b1;
- end
- DATA_C2UC:
- begin
- data_reg <= {16'h23,datain};
- f_nrd_reg[1] <= 1'b0;
- f_ncs_reg[1] <= 1'b0;
- fifo_wr_reg <= 1'b1;
- end
- CSRDN_C2UC:
- begin
- f_nrd_reg[1] <= 1'b0;
- f_ncs_reg[1] <= 1'b0;
- end
- DATA1_C2UC:
- begin
- f_nrd_reg[1] <= 1'b1;
- f_ncs_reg[1] <= 1'b1;
- end
- DATA_C2IA:
- begin
- data_reg <= {16'h24,datain};
- f_nrd_reg[1] <= 1'b0;
- f_ncs_reg[1] <= 1'b0;
- fifo_wr_reg <= 1'b1;
- end
- CSRDN_C2IA:
- begin
- f_nrd_reg[1] <= 1'b0;
- f_ncs_reg[1] <= 1'b0;
- end
- DATA1_C2IA:
- begin
- f_nrd_reg[1] <= 1'b1;
- f_ncs_reg[1] <= 1'b1;
- end
- DATA_C2IB:
- begin
- data_reg <= {16'h25,datain};
- f_nrd_reg[1] <= 1'b0;
- f_ncs_reg[1] <= 1'b0;
- fifo_wr_reg <= 1'b1;
- end
- CSRDN_C2IB:
- begin
- f_nrd_reg[1] <= 1'b0;
- f_ncs_reg[1] <= 1'b0;
- end
- DATA1_C2IB:
- begin
- f_nrd_reg[1] <= 1'b1;
- f_ncs_reg[1] <= 1'b1;
- end
- DATA_C2IC:
- begin
- data_reg <= {16'h26,datain};
- f_nrd_reg[1] <= 1'b0;
- f_ncs_reg[1] <= 1'b0;
- fifo_wr_reg <= 1'b1;
- end
- CSRDN_C2IC:
- begin
- f_nrd_reg[1] <= 1'b0;
- f_ncs_reg[1] <= 1'b0;
- end
- DATA1_C2IC:
- begin
- f_nrd_reg[1] <= 1'b1;
- f_ncs_reg[1] <= 1'b1;
- end
- ///////////////////////////////////////
- IDLE:
- begin
- data_reg <= {16'h88,16'h00};
- // fifo_wr_reg <= 1'b1;
- end
- default: ;
- endcase
- end
- always @ (posedge clk)
- if(!rst)
- begin
- counter <= 8'd0;
- eoc1 <= 1'd0;
- state <= 1'd0;
- end
- else
- begin
- eoc1 <= eoc;
- case (state)
- 1'd0:
- begin
- counter <= 8'd0;
- if(eoc & (~eoc1))
- begin
- state <= 1'd1;
- counter <= counter + 8'd1;
- end
- end
- 1'd1:
- begin
- if(counter == SET_COUNT)
- begin
- state <= 1'd0;
- counter <= 8'd0;
- end
- else
- if(eoc & (~eoc1))
- begin
- counter <= 8'd0;
- end
- else
- counter <= counter + 8'd1;
- end
- endcase
- end
- endmodule
FIFO传送判断条件
点击(此处)折叠或打开
- module fifo_switch(
- clk,
- rst,
- almost_full,
- empty,
- rdreq
- );
- input clk,rst;
- input almost_full,empty;
- output rdreq;
- reg state = 1'b0;
- reg almost_full_p, empty_p;
- assign rdreq = state ? 1'b1 : 1'b0;
- always @ (posedge clk)
- if(!rst)
- begin
- almost_full_p <= 1'b0;
- empty_p <= 1'b0;
- end
- else
- begin
- almost_full_p <= almost_full;
- empty_p <= empty;
- end
- always @ (posedge clk)
- case (state)
- 1'b0:
- if(almost_full & ~almost_full_p)
- state <= 1'b1;
- 1'b1:
- if(empty & ~empty_p)
- state <= 1'b0;
- endcase
- endmodule
UPP接口
点击(此处)折叠或打开
- module uPP_ddio(
- clk,
- oe,
- datain,
- dataout
- );
- input oe;
- input clk;
- input[31:0] datain;
- output[15:0] dataout;
- reg[15:0] data_reg;
- reg state = 0;
- //assign
- dataout = (oe == 1) ? data_reg : 16'd0 ;
- assign dataout = data_reg;
- always @ (posedge clk)
- begin
- state <= ~state;
- if(state)
- data_reg <= datain[31:16];
- else
- data_reg <= datain[15:0];
- end
- endmodule
最后整体图:
omam138/upp/fpga相关推荐
- Xilinx 异步FIFO核实现FPGA与DSP通过UPP(通用并口)进行数据传输
Xilinx 异步FIFO核实现FPGA与DSP通过UPP(通用并口)进行数据传输 一.Xilinx FIFO IP核介绍 二.UPP 仿真效果 总结 一.Xilinx FIFO IP核介绍 1. 因 ...
- UPP协议转AXI4协议的burst读写FPGA实现
UPP协议转AXI4协议的burst读写FPGA实现 名字是按标准协议命名的,细节都在图里,有兴趣的朋友自己看下,或者私信我,欢迎批评指正! Burst 读和写 写数据 读数据
- OMAPL138 + SPARTAN6 DSP+ARM+FPGA开发例程
目 录 本例程基于信迈OMAPL138+SPARTAN6评估板开发. 开发板准备 16 查看仿真器驱动是否正常安装 17 程序加载和烧写 19 基于仿真器的程序加载和烧写 19 设置工程配置文件信息 ...
- FPGA研发心得~~转
FPGA是个什么玩意? 首先来说: FPGA是一种器件.其英文名 feild programable gate arry .很长,但不通俗.通俗来说,是一种功能强大似乎无所不能的器件.通常用于通信.网 ...
- TI C2000系列TMS320F2837xD开发板(DSP+FPGA)硬件规格参数说明书
前 言 本文档主要介绍TMS320F2837xD开发板硬件接口资源以及设计注意事项等内容. 它是基于TI C2000系列TMS320F2837xD双核C28x 32位浮点DSP + 紫光同创Logos ...
- 基于C6748+FPGA的高精度北斗接收机设计与实现
随着计算机技术.通信技术.测控技术的提高,卫星导航技术不断进步,尤其在军事.民用领域应用越来越广泛,逐渐成为衡量国家军事实力和科学技术水平的一个重要标杆.我国在20世纪90年代中期开始建设中国北斗卫星 ...
- 基于TI TMS320F2837x系列的单/双核32位浮点MCU控制器+ Xilinx Spartan-6低功耗FPGA核心板
由创龙自主研发的SOM-TL2837xF核心板,大小仅有72mm*44mm.采用沉金无铅工艺的8层板设计,专业的PCB Layout保证信号完整性的同时,经过严格的质量控制,非常适用于高速数据采集与处 ...
- 基于OMPAL138+FPGA的三相电能质量分析仪设计
随着我国经济的快速发展,电力资源已经成为人民生活.社会生产的重要能源.由于各种各样的用电设备日益增多,使得实际电网中存在很多不平衡和非线性的冲击性负载,导致电网出现供电电压偏差.频率偏差.谐波.间谐波 ...
- 基于C6748 DSP+FPGA电能质量检测仪设计和实现
随着清洁能源的大规模并网以及电力电子元件的广泛应用,公用电网的电能质量面临愈发严重的挑战.同时,工业生产和社会生活朝智能化方向发展使得更多的电力系统负荷对电能质量敏感,因此用户也明显提高了对电能质量的 ...
最新文章
- 分布式消息队列 — Overview
- 如何在cmd命令行中查看、修改、删除与添加环境变量
- discuz和php的区别,discuz和phpwind优劣比较
- ObjectArx R14-2007下载地址
- 轻量级过程改进项目启动
- [微博]页面table 闪动问题解决
- qq为何没有linux版本,如何安装linux版本QQ?
- 【数据库】E-R图向关系模型转换的规则
- axios上传图片到php报500,vue项目中使用axios上传图片等文件
- 通过企业账号邀请开发者(不需要支付99刀,在真机上调试)
- hadoop 空间配置
- matlab单元刚度矩阵,求助:关于有限元三角形单元合成总刚度矩阵怎么处理
- knn(k近邻算法)——python
- win7下强制结束进程的cmd命令
- 排列奇偶性与排序的关系
- 如何做到长期稳定的禅修?
- 卷积神经网络残差计算
- AUTOSAR技术分析报告
- 高版本Android真机逆向测试环境搭建
- 计算机上配置静态ip,如何给电脑设置固定IP地址
热门文章
- 安装 | 企业版CDH服务器集群配置(详细)
- FAST无线网卡自助
- mac下Homebrew安装Fetching /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask failed报错解决方法
- cudn以及cudnn安装教程(自用)
- .net core 中使用Google的protoc
- 双非计算机全奖博士,录取捷报|双非本科背景拿下普渡大学药理学全奖博士
- 图像处理之高通滤波器与低通滤波器
- php读取word里的内容
- [如何写一篇优秀的论文] 书写初稿
- uni-app APP开发升级功能