硬件编程语言

2023-12-18 11:00:02

硬件画板说白了就是电气的连接,相较于PCB连接在2.5D中完成(有些大佬们是直接3D设计)考虑的东西会更多,原理图的抽象使得硬件思路更加简单。

就算是这样, 增加到上千门器件后的大工程是非常难以进行的编辑和检查的, 而如今的逻辑门等芯片电路规模都快上千亿级别了,这个规模已经不是人的两只眼睛或者一个团队能够用原理图来表示出来的。

于是 硬件语言verilog 和VHDL 就出现了,是相对于传统原理图这可以完成上万门元件的电路设计了, 上亿门元件的布局一个团队能够完成,上百亿千亿的功能,一个精英团队可以触及,但是任然是非常困难跨过这个极限带来的门坎。

module counter10(
        //端口定义
        input                   rstn,   //复位端,低有效
        input                   clk,    //输入时钟
        output [3:0]    cnt,    //计数输出
        output                  cout);  //溢出位
        reg [3:0]               cnt_temp ;      //计数器寄存器
        always@(posedge clk or negedge rstn) begin
                if(! rstn)begin         //复位时,计时归0
                        cnt_temp        <= 4'b0 ;
                end
                else if (cnt_temp==4'd9) begin  //计时10个cycle时,计时归0
                        cnt_temp        <=4'b000;
                end
                else begin                                      //计时加1
                        cnt_temp        <= cnt_temp + 1'b1 ; 
                end
        end
        assign  cout = (cnt_temp==4'd9) ;       //输出周期位
        assign  cnt  = cnt_temp ;                       //输出实时计时器
endmodule

于是工程师们引进了类似Java的 Chisel 语言,引入对象,多态等思路对硬件逻辑描述更加友善, 一个团队基本可以轻松胜任上百亿门的元件的功能描述。

class SortBlock extends Component() {
	override val io = new Bundle() {
		val in1 = new IoSortBlockOut()
		val in2 = new IoSortBlockOut()
		val out = new IoSortBlockOut()
	}
...
}

个人人为, 既然都涉及到高级语言了, 为啥不搞到python。
我们知道c,java这些虽然脱离了底层硬件描述的重复工作,但是还是没有完全脱离内存和数据的绑定。

而python目前在内存处理这块更加友善, 所以我打算尝试以下一门新的硬件语言的设计,而不是像MyHDL这样需要语言去描述硬件,不能带来逻辑上的极致。

MyHDL 程序风格:

from myhdl import *

@block
def dff(q, d, clk):

   @always(clk.posedge)
   def logic():
       q.next = d

   return logic

比如上边的模块 ,我可以优化到下面更加简洁描述:

# rstn 复位端,低有效
# clk 输入时钟
def counter10(rstn, clk):
    cnt_temp = reg(3)    #计数器寄存器
    with posedge(clk) or negedge(rstn): # always
        if not rstn:        #复位时,计时归0
            cnt_temp <= 0
        elif cnt_temp==9:  #计时10个cycle时,计时归0
            cnt_temp <= 0
        else:                               #计时加1
            cnt_temp <= cnt_temp + 1
    cout = (cnt_temp == 9)        #输出周期位
    cnt = cnt_temp                      #输出实时计时器
    return cnt, cout # 计数输出 溢出位

这里说明以下, 大家都很优秀,文章中的任何说明,都是大家的成果, 我只是在大家的思路上,前人的经验上, 提出一点思路,供大家探讨。


参考:

文章来源:https://blog.csdn.net/u012939880/article/details/135021616
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。