chuzhe008 发表于 2009-4-1 18:30:12

cpld的一个I/O口串行送数,有没有比这个 更优化的方法了?

always @(posedge clk)
        begin
                d<=d+1'b1;
        end
always @(d)
begin
        case(d)                                                               
                9'h1:dataout = 1'b0;                               
                9'h2:dataout = 1'b0;                               
                9'h3:dataout = 1'b0;                               
                9'h4:dataout = 1'b0;
                9'h5:dataout = 1'b0;
                9'h6:dataout = 1'b0;
                9'h7:dataout = 1'b1;
                9'h8:dataout = 1'b0;
                     default:dataout = 0;
          endcase
end
一个I/O口串行送数dataout (一次送一位2进制数),h1--h9 上面代码中I/O(dataout)向外送了一数 02H(0000 0010);我想知道有没有什么别的方法送,不需要用case一个一个列出来,就是写一个02H 然后通过 循环移位送出来.我这样写太烦琐了,因为要是10个8位的十六进制的数的话,就需要用case列出80行的代码,请问下有没有什么好的方法 取代我的用case 送数,谢谢了.

ibq3100 发表于 2009-4-1 18:56:46

coutn是数据,左移

reg data_out;

always @(posedge clk_out )
   
      {data_out,Count}<={Count,1'b0};

chuzhe008 发表于 2009-4-1 19:23:42

那我要送好几个数(30H,56H,84H...),而且要依次送,怎么办啊

ibq3100 发表于 2009-4-1 20:11:21

我也是刚学的,说错可要多多包容

input in;

case(in)
0: 0x30=count;
1: 0x56=count;
2: 0x84=count;
.
.
.

dr2001 发表于 2009-4-2 10:21:17

怎么定义优化?消耗资源少,工作频率高,还是?

资源少的,Shifter + MUX最节约。CPLD的Shifter需要特别的写法,充分利用内部节点;FPGA一般写法就行。

cddyy 发表于 2009-4-2 11:34:39

用一楼的方法试试看,占用9个LE:

module test (data_out,clk_out,data_in,clk_cs);
   
    input clk_out,clk_cs;
    input data_in;
    output data_out;
   
        reg data_out;
        reg Count;

    always @(posedge clk_out)
      begin
      if (clk_cs)
          Count<=data_in;
      else
          {data_out,Count}<={Count,1'b0};
      end

endmodule
页: [1]
查看完整版本: cpld的一个I/O口串行送数,有没有比这个 更优化的方法了?